mirror of
https://github.com/dreamhunter2333/cloudflare_temp_email.git
synced 2026-07-01 12:21:57 +08:00
feat: |Worker| add REMOVE_ALL_ATTACHMENT and REMOVE_EXCEED_SIZE_ATTAC… (#562)
feat: |Worker| add REMOVE_ALL_ATTACHMENT and REMOVE_EXCEED_SIZE_ATTACHMENT
This commit is contained in:
48
worker/src/email/check_attachment.ts
Normal file
48
worker/src/email/check_attachment.ts
Normal file
@@ -0,0 +1,48 @@
|
||||
import { Bindings, ParsedEmailContext } from "../types";
|
||||
import { getBooleanValue } from "../utils";
|
||||
import { commonParseMail } from "../common";
|
||||
import { createMimeMessage } from "mimetext";
|
||||
|
||||
export const remove_attachment_if_need = async (
|
||||
env: Bindings,
|
||||
parsedEmailContext: ParsedEmailContext,
|
||||
from_address: string,
|
||||
to_address: string,
|
||||
size: number
|
||||
): Promise<void> => {
|
||||
// if configured, remove all attachment
|
||||
const removeAllAttachment = getBooleanValue(env.REMOVE_ALL_ATTACHMENT);
|
||||
// if attachment size > 2MB, remove attachment
|
||||
const removeExceedSizeAttachment = getBooleanValue(env.REMOVE_EXCEED_SIZE_ATTACHMENT) && size >= 2 * 1024 * 1024;
|
||||
const shouldRemoveAttachment = removeAllAttachment || removeExceedSizeAttachment;
|
||||
if (!shouldRemoveAttachment) return;
|
||||
|
||||
const parsedEmail = await commonParseMail(parsedEmailContext);
|
||||
if (!parsedEmail) return;
|
||||
|
||||
const msg = createMimeMessage();
|
||||
if (parsedEmail?.headers) {
|
||||
for (const header of parsedEmail.headers) {
|
||||
msg.setHeader(header["key"], header["value"]);
|
||||
}
|
||||
}
|
||||
msg.setSender({
|
||||
name: parsedEmail?.sender || from_address,
|
||||
addr: from_address
|
||||
});
|
||||
msg.setRecipient(to_address);
|
||||
msg.setSubject(parsedEmail?.subject || "Failed to parse email subject");
|
||||
if (parsedEmail?.html) {
|
||||
msg.addMessage({
|
||||
contentType: 'text/html',
|
||||
data: parsedEmail.html
|
||||
});
|
||||
}
|
||||
if (parsedEmail?.text) {
|
||||
msg.addMessage({
|
||||
contentType: 'text/plain',
|
||||
data: parsedEmail.text
|
||||
});
|
||||
}
|
||||
parsedEmailContext.rawEmail = msg.asRaw();
|
||||
}
|
||||
@@ -7,6 +7,7 @@ import { auto_reply } from "./auto_reply";
|
||||
import { isBlocked } from "./black_list";
|
||||
import { triggerWebhook, triggerAnotherWorker, commonParseMail } from "../common";
|
||||
import { check_if_junk_mail } from "./check_junk";
|
||||
import { remove_attachment_if_need } from "./check_attachment";
|
||||
|
||||
|
||||
async function email(message: ForwardableEmailMessage, env: Bindings, ctx: ExecutionContext) {
|
||||
@@ -32,13 +33,20 @@ async function email(message: ForwardableEmailMessage, env: Bindings, ctx: Execu
|
||||
console.log("check junk mail error", error);
|
||||
}
|
||||
|
||||
// remove attachment if configured or size > 2MB
|
||||
try {
|
||||
await remove_attachment_if_need(env, parsedEmailContext, message.from, message.to, message.rawSize);
|
||||
} catch (error) {
|
||||
console.log("remove attachment error", error);
|
||||
}
|
||||
|
||||
const message_id = message.headers.get("Message-ID");
|
||||
// save email
|
||||
try {
|
||||
const { success } = await env.DB.prepare(
|
||||
`INSERT INTO raw_mails (source, address, raw, message_id) VALUES (?, ?, ?, ?)`
|
||||
).bind(
|
||||
message.from, message.to, rawEmail, message_id
|
||||
message.from, message.to, parsedEmailContext.rawEmail, message_id
|
||||
).run();
|
||||
if (!success) {
|
||||
message.setReject(`Failed save message to ${message.to}`);
|
||||
|
||||
Reference in New Issue
Block a user