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 { context.logger.info("Rewrite message ids..."); const addresses = context.mail.simpleFindAllAddresses(); context.logger.info(`Addresses found in mail: ${addresses.join(", ")}.`); for (const address of addresses) { const awsMessageId = await this.#lookup(address); if (awsMessageId != null && awsMessageId.length !== 0) { context.logger.info(`Rewrite ${address} to ${awsMessageId}.`); context.mail.raw = context.mail.raw.replaceAll(address, awsMessageId); } } context.logger.info("Done rewrite message ids."); } } export class AwsMailMessageIdSaveHook implements MailDeliverHook { readonly #record; constructor(record: (original: string, aws: string) => Promise) { this.#record = record; } async callback(context: MailDeliverContext): Promise { context.logger.info("Save aws message ids..."); const messageId = context.mail .startSimpleParse(context.logger) .sections() .headers() .messageId(); if (messageId == null) { context.logger.info( "Original mail does not have message id. Skip saving.", ); return; } if (context.result.awsMessageId != null) { context.logger.info( `Saving ${messageId} => ${context.result.awsMessageId}.`, ); await this.#record(messageId, context.result.awsMessageId); } context.logger.info("Done save message ids."); } }