aboutsummaryrefslogtreecommitdiff
path: root/services/docker/mail-server/aws-sendmail/aws
diff options
context:
space:
mode:
Diffstat (limited to 'services/docker/mail-server/aws-sendmail/aws')
-rw-r--r--services/docker/mail-server/aws-sendmail/aws/base.ts15
-rw-r--r--services/docker/mail-server/aws-sendmail/aws/context.ts41
-rw-r--r--services/docker/mail-server/aws-sendmail/aws/deliver.ts2
-rw-r--r--services/docker/mail-server/aws-sendmail/aws/retriver.ts32
4 files changed, 59 insertions, 31 deletions
diff --git a/services/docker/mail-server/aws-sendmail/aws/base.ts b/services/docker/mail-server/aws-sendmail/aws/base.ts
deleted file mode 100644
index 1e23009..0000000
--- a/services/docker/mail-server/aws-sendmail/aws/base.ts
+++ /dev/null
@@ -1,15 +0,0 @@
-import { getEnvRequired } from "../base.ts";
-
-export class AwsContext {
- readonly region = "ap-southeast-1";
-
- accessKeyId = getEnvRequired("AWS_USER", "aws access key id");
- secretAccessKey = getEnvRequired("AWS_PASSWORD", "aws secret access key");
-
- getCredentials() {
- const { accessKeyId, secretAccessKey } = this;
- return Promise.resolve({ accessKeyId, secretAccessKey });
- }
-
- readonly credentials = this.getCredentials.bind(this);
-}
diff --git a/services/docker/mail-server/aws-sendmail/aws/context.ts b/services/docker/mail-server/aws-sendmail/aws/context.ts
new file mode 100644
index 0000000..65c8371
--- /dev/null
+++ b/services/docker/mail-server/aws-sendmail/aws/context.ts
@@ -0,0 +1,41 @@
+import {
+ CopyObjectCommand,
+ DeleteObjectCommand,
+ S3Client,
+} from "@aws-sdk/client-s3";
+
+import { getConfig } from "../config.ts";
+
+export class AwsContext {
+ readonly region = "ap-southeast-1";
+
+ accessKeyId = getConfig().getValue("awsAccessKeyId");
+ secretAccessKey = getConfig().getValue("awsSecretAccessKey");
+
+ getCredentials() {
+ const { accessKeyId, secretAccessKey } = this;
+ return Promise.resolve({ accessKeyId, secretAccessKey });
+ }
+
+ readonly credentials = this.getCredentials.bind(this);
+}
+
+export async function s3MoveObject(
+ client: S3Client,
+ bucket: string,
+ path: string,
+ newPath: string,
+): Promise<void> {
+ const copyCommand = new CopyObjectCommand({
+ Bucket: bucket,
+ Key: newPath,
+ CopySource: path,
+ });
+ await client.send(copyCommand);
+
+ const deleteCommand = new DeleteObjectCommand({
+ Bucket: bucket,
+ Key: path,
+ });
+ await client.send(deleteCommand);
+}
diff --git a/services/docker/mail-server/aws-sendmail/aws/deliver.ts b/services/docker/mail-server/aws-sendmail/aws/deliver.ts
index da100f5..5982d56 100644
--- a/services/docker/mail-server/aws-sendmail/aws/deliver.ts
+++ b/services/docker/mail-server/aws-sendmail/aws/deliver.ts
@@ -1,6 +1,6 @@
import { SendEmailCommand, SESv2Client } from "@aws-sdk/client-sesv2";
-import { AwsContext } from "./base.ts";
+import { AwsContext } from "./context.ts";
import { Mail, MailDeliverer } from "../mail.ts";
export class AwsMailDeliverer extends MailDeliverer {
diff --git a/services/docker/mail-server/aws-sendmail/aws/retriver.ts b/services/docker/mail-server/aws-sendmail/aws/retriver.ts
index cdfe6f1..1544c04 100644
--- a/services/docker/mail-server/aws-sendmail/aws/retriver.ts
+++ b/services/docker/mail-server/aws-sendmail/aws/retriver.ts
@@ -6,23 +6,23 @@ import {
S3Client,
} from "@aws-sdk/client-s3";
-import { generateTimeStringForFileName, getEnvRequired } from "../base.ts";
+import { generateTimeStringForFileName } from "../util.ts";
import { getLogger } from "../logger.ts";
-import { AwsContext } from "./base.ts";
-import { MailDeliverer } from "../mail.ts";
+import { AwsContext, s3MoveObject } from "./context.ts";
+import { getConfig } from "../config.ts";
export class AwsMailRetriever {
- mailBucket = getEnvRequired(
- "AWS_MAIL_BUCKET",
- "aws s3 bucket saving raw mails",
- );
- liveMailPrefix = "mail/live/";
- archiveMailPrefix = "mail/archive/";
+ readonly liveMailPrefix = "mail/live/";
+ readonly archiveMailPrefix = "mail/archive/";
+ readonly mailBucket = getConfig().getValue("awsMailBucket");
- private s3Client;
- private liveMailRecyclerAborter = new AbortController();
+ private readonly s3Client;
+ private readonly liveMailRecyclerAborter = new AbortController();
- constructor(private aws: AwsContext, private localDeliverer: MailDeliverer) {
+ constructor(
+ aws: AwsContext,
+ private readonly callback: (rawMail: string) => Promise<void>,
+ ) {
const { region, credentials } = aws;
this.s3Client = new S3Client({ region, credentials });
}
@@ -66,9 +66,10 @@ export class AwsMailRetriever {
}
async deliverS3MailObject(messageId: string) {
+ const mailPath = `${this.liveMailPrefix}${messageId}`;
const command = new GetObjectCommand({
Bucket: this.mailBucket,
- Key: `${this.liveMailPrefix}${messageId}`,
+ Key: mailPath,
});
const res = await this.s3Client.send(command);
@@ -78,9 +79,10 @@ export class AwsMailRetriever {
}
const rawMail = await res.Body.transformToString();
- await this.localDeliverer.deliverRaw(rawMail);
+ await this.callback(rawMail);
- const archiveCommand = new
+ // TODO: Continue here.
+ await s3MoveObject(this.s3Client, this.mailBucket, mailPath, );
}
async recycleLiveMails() {