aboutsummaryrefslogtreecommitdiff
path: root/services/docker/mail-server/aws-sendmail/aws/retriver.ts
diff options
context:
space:
mode:
Diffstat (limited to 'services/docker/mail-server/aws-sendmail/aws/retriver.ts')
-rw-r--r--services/docker/mail-server/aws-sendmail/aws/retriver.ts89
1 files changed, 89 insertions, 0 deletions
diff --git a/services/docker/mail-server/aws-sendmail/aws/retriver.ts b/services/docker/mail-server/aws-sendmail/aws/retriver.ts
new file mode 100644
index 0000000..cdfe6f1
--- /dev/null
+++ b/services/docker/mail-server/aws-sendmail/aws/retriver.ts
@@ -0,0 +1,89 @@
+/// <reference types="npm:@types/node" />
+
+import {
+ GetObjectCommand,
+ ListObjectsV2Command,
+ S3Client,
+} from "@aws-sdk/client-s3";
+
+import { generateTimeStringForFileName, getEnvRequired } from "../base.ts";
+import { getLogger } from "../logger.ts";
+import { AwsContext } from "./base.ts";
+import { MailDeliverer } from "../mail.ts";
+
+export class AwsMailRetriever {
+ mailBucket = getEnvRequired(
+ "AWS_MAIL_BUCKET",
+ "aws s3 bucket saving raw mails",
+ );
+ liveMailPrefix = "mail/live/";
+ archiveMailPrefix = "mail/archive/";
+
+ private s3Client;
+ private liveMailRecyclerAborter = new AbortController();
+
+ constructor(private aws: AwsContext, private localDeliverer: MailDeliverer) {
+ const { region, credentials } = aws;
+ this.s3Client = new S3Client({ region, credentials });
+ }
+
+ setupLiveMailRecycler() {
+ Deno.cron("live-mail-recycler", "0 */6 * * *", {
+ signal: this.liveMailRecyclerAborter.signal,
+ }, () => {
+ });
+ }
+
+ generateArchivePrefix(instant: Date | Temporal.Instant): string {
+ return `${this.archiveMailPrefix}${
+ generateTimeStringForFileName(instant, true)
+ }/`;
+ }
+
+ async listLiveMails(): Promise<string[]> {
+ const listCommand = new ListObjectsV2Command({
+ Bucket: this.mailBucket,
+ Prefix: this.liveMailPrefix,
+ });
+ const res = await this.s3Client.send(listCommand);
+
+ if (res.Contents == null) {
+ getLogger().warn("Listing live mails in S3 returns null Content.");
+ return [];
+ }
+
+ const result: string[] = [];
+ for (const object of res.Contents) {
+ if (object.Key != null) {
+ result.push(object.Key);
+ } else {
+ getLogger().warn(
+ "Listing live mails in S3 returns an object with no Key.",
+ );
+ }
+ }
+ return result;
+ }
+
+ async deliverS3MailObject(messageId: string) {
+ const command = new GetObjectCommand({
+ Bucket: this.mailBucket,
+ Key: `${this.liveMailPrefix}${messageId}`,
+ });
+ const res = await this.s3Client.send(command);
+
+ if (res.Body == null) {
+ // TODO: Better error.
+ throw new Error();
+ }
+
+ const rawMail = await res.Body.transformToString();
+ await this.localDeliverer.deliverRaw(rawMail);
+
+ const archiveCommand = new
+ }
+
+ async recycleLiveMails() {
+ const mails = await this.listLiveMails();
+ }
+}