diff --git a/frontend/src/components/MailView.tsx b/frontend/src/components/MailView.tsx
new file mode 100644
index 00000000..4df2182f
--- /dev/null
+++ b/frontend/src/components/MailView.tsx
@@ -0,0 +1,91 @@
+import DOMPurify from 'dompurify'
+import { useMailStore } from '../store/mailStore'
+import { mailApi } from '../api/mailApi'
+
+export default function MailView() {
+ const { selectedMail, currentFolder, openCompose } = useMailStore()
+
+ if (!selectedMail) return (
+
+ )
+
+ const m = selectedMail
+ const cleanHtml = m.body_html
+ ? DOMPurify.sanitize(m.body_html, { FORBID_TAGS: ['script', 'iframe', 'object'] })
+ : null
+
+ const reply = () => openCompose(m)
+ const forward = () => openCompose({ ...m, subject: `Fw: ${m.subject}`, to: '', uid: '' } as any)
+
+ return (
+
+
+
{m.subject}
+
+
+ 보낸사람
+ {m.sender} <{m.sender_addr}>
+
+
+ 받는사람
+ {m.to}
+
+ {m.cc && (
+
+ 참조
+ {m.cc}
+
+ )}
+
+ 날짜
+ {m.date}
+
+
+
+
+
+
+
+
+ {/* 첨부파일 */}
+ {m.attachments?.length > 0 && (
+
+
📎 첨부파일 ({m.attachments.length}개)
+
+
+ )}
+
+ {/* 본문 */}
+
+ {cleanHtml ? (
+
+ ) : (
+
{m.body_text}
+ )}
+
+
+ )
+}
+
+function fmtSize(b: number) {
+ if (b < 1024) return `${b}B`
+ if (b < 1024 * 1024) return `${(b / 1024).toFixed(0)}KB`
+ return `${(b / 1024 / 1024).toFixed(1)}MB`
+}