diff options
author | Yuqian Yang <crupest@crupest.life> | 2025-04-30 00:20:23 +0800 |
---|---|---|
committer | Yuqian Yang <crupest@crupest.life> | 2025-04-30 00:20:54 +0800 |
commit | 84148346e29547cfba92dd697be9bbf31a23a926 (patch) | |
tree | 6750ed1d0ee974cc6144afcc294fd3bdc03defa1 /services/docker/mail-server/aws-sendmail/mail.ts | |
parent | 6aeff979ada4a1775bddb87a0ccad354faaa8093 (diff) | |
download | crupest-84148346e29547cfba92dd697be9bbf31a23a926.tar.gz crupest-84148346e29547cfba92dd697be9bbf31a23a926.tar.bz2 crupest-84148346e29547cfba92dd697be9bbf31a23a926.zip |
HALF WORK!: 2025-4-30
Diffstat (limited to 'services/docker/mail-server/aws-sendmail/mail.ts')
-rw-r--r-- | services/docker/mail-server/aws-sendmail/mail.ts | 42 |
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); + } +} |