aboutsummaryrefslogtreecommitdiff
path: root/services/docker/mail-server/aws-sendmail/mail.ts
diff options
context:
space:
mode:
Diffstat (limited to 'services/docker/mail-server/aws-sendmail/mail.ts')
-rw-r--r--services/docker/mail-server/aws-sendmail/mail.ts42
1 files changed, 42 insertions, 0 deletions
diff --git a/services/docker/mail-server/aws-sendmail/mail.ts b/services/docker/mail-server/aws-sendmail/mail.ts
new file mode 100644
index 0000000..e673593
--- /dev/null
+++ b/services/docker/mail-server/aws-sendmail/mail.ts
@@ -0,0 +1,42 @@
+import { encodeBase64 } from "@std/encoding/base64";
+import { getLogger } from "./logger.ts";
+
+export class Mail {
+ message_id: string | null = null;
+ aws_message_id: string | null = null;
+
+ constructor(public raw: string) {}
+
+ encodeUtf8(): Uint8Array {
+ const utf8Encoder = new TextEncoder();
+ // TODO: A problem here is if mail is VERY long, this will block for a long time.
+ // Maybe some task queue can be used.
+ return utf8Encoder.encode(this.raw);
+ }
+
+ getRawBase64(): string {
+ return encodeBase64(this.raw);
+ }
+
+ appendHeaders(
+ rawMail: string,
+ headers: [key: string, value: string][],
+ ): string {
+ const separatorMatch = rawMail.match(/(\r\n|\n)(\r\n|\n)/);
+ if (separatorMatch == null) {
+ throw new Error(
+ "No header/body separator (2 successive EOLs) found. Cannot append headers.",
+ );
+ }
+
+ if (separatorMatch[1] !== separatorMatch[2]) {
+ getLogger().warn("Different EOLs (\\r\\n and \\n) found in mail!");
+ }
+
+ const headerStr = headers.map(([k, v]) => `${k}: ${v}${separatorMatch[1]}`)
+ .join("");
+ const endOfHeadersIndex = separatorMatch.index! + separatorMatch[1].length;
+ return rawMail.slice(0, endOfHeadersIndex) + headerStr +
+ rawMail.slice(endOfHeadersIndex);
+ }
+}