diff options
Diffstat (limited to 'deno/mail-relay/dovecot')
-rw-r--r-- | deno/mail-relay/dovecot/deliver.ts | 102 |
1 files changed, 0 insertions, 102 deletions
diff --git a/deno/mail-relay/dovecot/deliver.ts b/deno/mail-relay/dovecot/deliver.ts deleted file mode 100644 index 92bdc58..0000000 --- a/deno/mail-relay/dovecot/deliver.ts +++ /dev/null @@ -1,102 +0,0 @@ -import { basename } from "@std/path"; - -import config from "../config.ts"; -import log from "../log.ts"; -import { - Mail, - MailDeliverContext, - MailDeliverer, - 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) { - context.result.message = - "Failed to deliver to dovecot, no recipients are specified."; - return; - } - - log.info(`Deliver to dovecot users: ${recipients.join(", ")}.`); - - for (const recipient of recipients) { - try { - const commandArgs = ["-d", recipient]; - log.info( - `Run ${ldaBinName} ${commandArgs.join(" ")}...`, - ); - - const ldaCommand = new Deno.Command(ldaPath, { - args: commandArgs, - 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) { - context.result.recipients.set(recipient, { - kind: "done", - message: `${ldaBinName} exited with success.`, - }); - } else { - let message = `${ldaBinName} exited with error code ${status.code}`; - - if (status.signal != null) { - message += ` (signal ${status.signal})`; - } - - // https://doc.dovecot.org/main/core/man/dovecot-lda.1.html - switch (status.code) { - case 67: - message += ", recipient user not known"; - break; - case 75: - message += ", temporary error"; - break; - } - - message += "."; - - context.result.recipients.set(recipient, { kind: "fail", message }); - } - } catch (cause) { - context.result.recipients.set(recipient, { - kind: "fail", - message: "An error is thrown when running lda: " + cause, - cause, - }); - } - } - - log.info("Done handling all recipients."); - } -} |