import { MailDeliverContext, MailDeliverHook } from "../mail.ts"; export class AwsMailMessageIdRewriteHook implements MailDeliverHook { readonly #lookup; constructor(lookup: (origin: string) => Promise) { this.#lookup = lookup; } async callback(context: MailDeliverContext): Promise { const addresses = context.mail.simpleFindAllAddresses(); for (const address of addresses) { const awsMessageId = await this.#lookup(address); if (awsMessageId != null && awsMessageId.length !== 0) { console.info(`Rewrite address-line string in mail: ${address} => ${awsMessageId}.`); context.mail.raw = context.mail.raw.replaceAll(address, awsMessageId); } } } } export class AwsMailMessageIdSaveHook implements MailDeliverHook { readonly #record; constructor( record: ( original: string, aws: string, context: MailDeliverContext, ) => Promise, ) { this.#record = record; } async callback(context: MailDeliverContext): Promise { const messageId = context.mail.parsed.messageId; if (messageId == null) { console.warn("Original mail does not have message id, skip saving message id map."); return; } if (context.result.awsMessageId != null) { console.info(`Save message id map: ${messageId} => ${context.result.awsMessageId}.`); context.mail.raw = context.mail.raw.replaceAll( messageId, context.result.awsMessageId, ); await this.#record(messageId, context.result.awsMessageId, context); } } }