aboutsummaryrefslogtreecommitdiff
path: root/services/docker/mail-server/relay/dovecot.ts
diff options
context:
space:
mode:
authorYuqian Yang <crupest@crupest.life>2025-04-30 00:20:23 +0800
committerYuqian Yang <crupest@crupest.life>2025-05-16 13:31:35 +0800
commit0963e715a9de2970826cec80713730b26286381d (patch)
tree43357a0e948862b7803fe9d533bb62d2c9c8d059 /services/docker/mail-server/relay/dovecot.ts
parent8930bb11fce19c773201b4f499d99c1c3c28efa6 (diff)
downloadcrupest-0963e715a9de2970826cec80713730b26286381d.tar.gz
crupest-0963e715a9de2970826cec80713730b26286381d.tar.bz2
crupest-0963e715a9de2970826cec80713730b26286381d.zip
HALF WORK!: 2025-5-16 rename
Diffstat (limited to 'services/docker/mail-server/relay/dovecot.ts')
-rw-r--r--services/docker/mail-server/relay/dovecot.ts42
1 files changed, 42 insertions, 0 deletions
diff --git a/services/docker/mail-server/relay/dovecot.ts b/services/docker/mail-server/relay/dovecot.ts
new file mode 100644
index 0000000..73e8341
--- /dev/null
+++ b/services/docker/mail-server/relay/dovecot.ts
@@ -0,0 +1,42 @@
+import { getLogger } from "./logger.ts";
+import { Mail, MailDeliverer } from "./mail.ts";
+
+// https://github.com/dovecot/core/blob/main/src/lib-smtp/smtp-submit.c
+
+export class DovecotMailDeliverer extends MailDeliverer {
+ constructor() {
+ super("dovecot");
+ }
+
+ readonly ldaBin = "dovecot-lda";
+
+ protected override async doDeliver(mail: Mail): Promise<void> {
+ const { ldaBin } = this;
+ let status;
+
+ try {
+ const utf8Stream = mail.toUtf8Bytes();
+
+ const ldaCommand = new Deno.Command(ldaBin, {
+ stdin: "piped",
+ stdout: "piped",
+ stderr: "piped",
+ });
+ const ldaProcess = ldaCommand.spawn();
+ getLogger().logProgramOutput(ldaProcess, ldaBin);
+
+ const stdinWriter = ldaProcess.stdin.getWriter();
+ await stdinWriter.ready;
+ await stdinWriter.write(utf8Stream);
+ await stdinWriter.ready;
+
+ status = await ldaProcess.status;
+ } catch (cause) {
+ mail.throwDeliverError(this, "external error.", cause);
+ }
+
+ if (!status.success) {
+ mail.throwDeliverError(this, `${ldaBin} exited with non-zero.`);
+ }
+ }
+}