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 ( +
+
{label}
+
{children}
+
+ ) +} + +function AddressList({ values, empty = "无" }: { values: string[]; empty?: string }) { + if (values.length === 0) return {empty} + return ( +
+ {values.map((value, index) => ( + + {value} + + ))} +
+ ) +} + function MessageRow({ message, active,