ultisuite-client/lib/mail-message-header-details.ts
2026-05-25 13:52:40 +02:00

90 lines
2.1 KiB
TypeScript

import type { ApiMessageFull, MessageAuthInfo, Recipient } from "@/lib/api/types"
import {
findUnsubscribeAction,
type UnsubscribeAction,
} from "@/lib/mail-unsubscribe"
import {
formatAllRecipientsLine,
formatMessageToSummary,
formatRecipientMailbox,
isMessageFromSelf,
resolveMessageFrom,
} from "@/lib/mail-message-participants"
export type MessageHeaderDetails = {
recipientSummary: string
fromLine: string
replyToLine?: string
toLine: string
dateIso: string
subject: string
mailedBy?: string
signedBy?: string
dkimPass?: boolean | null
tls: boolean
unsubscribe?: UnsubscribeAction
}
export function buildMessageHeaderDetails(
msg: Pick<
ApiMessageFull,
| "from"
| "to"
| "cc"
| "reply_to"
| "auth_info"
| "date"
| "subject"
| "body_html"
| "body_text"
>,
options: {
selfEmails: Iterable<string>
selfDisplayName?: string
subject?: string
}
): MessageHeaderDetails {
const from = resolveMessageFrom(msg.from, {
selfEmails: options.selfEmails,
selfDisplayName: options.selfDisplayName,
})
const fromSelf = isMessageFromSelf(msg.from, options.selfEmails)
const fromLine = fromSelf
? from.email
? `moi <${from.email}>`
: "moi"
: from.name && from.email
? `${from.name} <${from.email}>`
: from.email || from.name
const auth: MessageAuthInfo = msg.auth_info ?? {}
const unsubscribe = findUnsubscribeAction(
msg.body_html,
msg.body_text,
auth.list_unsubscribe
)
let replyToLine: string | undefined
if (msg.reply_to?.length) {
replyToLine = msg.reply_to.map(formatRecipientMailbox).join(", ")
}
return {
recipientSummary: formatMessageToSummary(
msg.to,
msg.cc,
options.selfEmails
),
fromLine,
replyToLine,
toLine: formatAllRecipientsLine(msg.to, msg.cc, options.selfEmails),
dateIso: msg.date,
subject: options.subject ?? msg.subject ?? "",
mailedBy: auth.mailed_by,
signedBy: auth.signed_by,
dkimPass: auth.dkim_pass,
tls: Boolean(auth.tls),
unsubscribe: unsubscribe ?? undefined,
}
}