From 99fe3cc57c83646b391bd8423dee2597b44202d7 Mon Sep 17 00:00:00 2001 From: LanQin Date: Sun, 21 Jun 2026 01:51:05 +0800 Subject: [PATCH] =?UTF-8?q?feat(mail):=20=E9=87=8D=E6=9E=84=E9=82=AE?= =?UTF-8?q?=E4=BB=B6=E8=AF=A6=E6=83=85=E5=85=83=E4=BF=A1=E6=81=AF=E5=B1=95?= =?UTF-8?q?=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 抽离 `MessageMetaPanel` 统一展示发件人、收件人、抄送、密送和时间信息。 - 补充地址解析与列表渲染,提升详情页信息完整度和可读性。 --- apps/web/src/pages/mail.tsx | 111 ++++++++++++++++++++++++++++++++---- 1 file changed, 100 insertions(+), 11 deletions(-) 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,