diff options
author | Yuqian Yang <crupest@crupest.life> | 2025-04-10 15:12:46 +0800 |
---|---|---|
committer | Yuqian Yang <crupest@crupest.life> | 2025-06-05 21:07:37 +0800 |
commit | 750aaddc978156d370ab10737d6b9e4449b7eb7e (patch) | |
tree | d14d4ac7ebe02aa6cada75d72b4ec6eddc8b6d7b /services/docker/mail-server/relay/dovecot.ts | |
parent | 04c86d8cec22d1c0883eb240453c160ea12da162 (diff) | |
download | crupest-750aaddc978156d370ab10737d6b9e4449b7eb7e.tar.gz crupest-750aaddc978156d370ab10737d6b9e4449b7eb7e.tar.bz2 crupest-750aaddc978156d370ab10737d6b9e4449b7eb7e.zip |
feat(mail-server): done aws message id mapping.
Diffstat (limited to 'services/docker/mail-server/relay/dovecot.ts')
-rw-r--r-- | services/docker/mail-server/relay/dovecot.ts | 94 |
1 files changed, 0 insertions, 94 deletions
diff --git a/services/docker/mail-server/relay/dovecot.ts b/services/docker/mail-server/relay/dovecot.ts deleted file mode 100644 index a8f4b2a..0000000 --- a/services/docker/mail-server/relay/dovecot.ts +++ /dev/null @@ -1,94 +0,0 @@ -import { basename } from "@std/path"; - -import config from "./config.ts"; -import log from "./log.ts"; -import { - Mail, - MailDeliverContext, - MailDeliverer, - MailDeliverRecipientResult, - RecipientFromHeadersHook, -} from "./mail.ts"; - -export class DovecotMailDeliverer extends MailDeliverer { - readonly name = "dovecot"; - - constructor() { - super(); - this.preHooks.push( - new RecipientFromHeadersHook(), - ); - } - - protected override async doDeliver( - mail: Mail, - context: MailDeliverContext, - ): Promise<void> { - const ldaPath = config.get("ldaPath"); - const ldaBinName = basename(ldaPath); - const utf8Stream = mail.toUtf8Bytes(); - - const recipients = [...context.recipients]; - if (recipients.length === 0) { - throw new Error("No recipients found."); - } - - log.info(`Deliver to ${recipients.join(", ")}.`); - - for (const recipient of recipients) { - log.info(`Call ${ldaBinName} for ${recipient}...`); - - const result: MailDeliverRecipientResult = { - kind: "done", - message: `${ldaBinName} exited with success.`, - }; - - try { - const ldaCommand = new Deno.Command(ldaPath, { - args: ["-d", recipient], - stdin: "piped", - stdout: "piped", - stderr: "piped", - }); - - const ldaProcess = ldaCommand.spawn(); - using logFiles = await log.openLogForProgram(ldaBinName); - ldaProcess.stdout.pipeTo(logFiles.stdout.writable); - ldaProcess.stderr.pipeTo(logFiles.stderr.writable); - - const stdinWriter = ldaProcess.stdin.getWriter(); - await stdinWriter.write(utf8Stream); - await stdinWriter.close(); - - const status = await ldaProcess.status; - - if (!status.success) { - result.kind = "fail"; - result.message = - `${ldaBinName} exited with error code ${status.code}`; - - if (status.signal != null) { - result.message += ` (signal ${status.signal})`; - } - - // https://doc.dovecot.org/main/core/man/dovecot-lda.1.html - switch (status.code) { - case 67: - result.message += ", recipient user not known"; - break; - case 75: - result.kind = "retry"; - break; - } - - result.message += "."; - } - } catch (e) { - result.kind = "fail"; - result.message = "An error was thrown when running lda process: " + e; - result.cause = e; - } - context.result.set(recipient, result); - } - } -} |