diff --git a/apps/web/src/pages/mail.tsx b/apps/web/src/pages/mail.tsx
index b06d4fd..be7a612 100644
--- a/apps/web/src/pages/mail.tsx
+++ b/apps/web/src/pages/mail.tsx
@@ -726,7 +726,7 @@ export function MailPage() {
-
{senderDisplayName(selected)} 发给 {selected.to.join(", ")} · {formatDateTime(selected.receivedAt)}
+
-
-
-
{accountInitial(senderDisplayName(selected), selected.from)}
-
-
{senderDisplayName(selected)}
-
收件人 {selected.to.join(", ")}
-
-
-
{formatDateTime(selected.receivedAt)}
-
+
` : from
}
+function senderAddress(message: MailMessage) {
+ return extractAddress(message.from) || decodeMimeHeader(message.fromName?.trim() || "") || "未知发件人地址"
+}
+
+function extractAddress(value?: string) {
+ const text = decodeMimeHeader((value || "").trim())
+ if (!text) return ""
+ const bracketAddress = text.match(/<([^>]+)>/)?.[1]?.trim()
+ return bracketAddress || text
+}
+
+function cleanAddressList(items?: string[]) {
+ return (items || []).map((item) => extractAddress(item)).filter(Boolean)
+}
+
+function sameMailTime(a?: string, b?: string) {
+ if (!a || !b) return false
+ const left = new Date(a).getTime()
+ const right = new Date(b).getTime()
+ return !Number.isNaN(left) && !Number.isNaN(right) && left === right
+}
+
+function MessageMetaPanel({ message }: { message: MailMessage }) {
+ const fromName = senderDisplayName(message)
+ const fromAddress = senderAddress(message)
+ const to = cleanAddressList(message.to)
+ const cc = cleanAddressList(message.cc)
+ const bcc = cleanAddressList(message.bcc)
+ const deliveredTo = extractAddress(message.recipientAddress || message.mailboxAddress || "")
+ const showSentAt = Boolean(message.sentAt) && !sameMailTime(message.sentAt, message.receivedAt)
+
+ return (
+
+
+
+ {accountInitial(fromName, fromAddress)}
+
+
+
+ {fromName}
+
+
+ {fromAddress}
+
+
+
+
+ {cc.length > 0 && (
+
+
+
+ )}
+ {bcc.length > 0 && (
+
+
+
+ )}
+ {deliveredTo && (
+
+ {deliveredTo}
+
+ )}
+ {showSentAt && (
+
+ {formatDateTime(message.sentAt)}
+
+ )}
+
+ {formatDateTime(message.receivedAt)}
+
+
+
+
+ )
+}
+
+function MessageMetaRow({ label, children }: { label: string; children: React.ReactNode }) {
+ return (
+
+ )
+}
+
+function AddressList({ values, empty = "无" }: { values: string[]; empty?: string }) {
+ if (values.length === 0) return {empty}
+ return (
+
+ {values.map((value, index) => (
+
+ {value}
+
+ ))}
+
+ )
+}
+
function MessageRow({
message,
active,