feat: telegram bot TelegramSettings && webhook (#244)

* feat: telegram bot TelegramSettings

* feat: webhook
This commit is contained in:
Dream Hunter
2024-05-18 14:02:18 +08:00
committed by GitHub
parent 53a06fc9d6
commit ca00a877ad
32 changed files with 777 additions and 112 deletions

View File

@@ -0,0 +1,40 @@
import { createMimeMessage } from "mimetext";
// @ts-ignore
import { getBooleanValue } from "../utils";
import { Bindings } from "../types";
export const auto_reply = async (message: ForwardableEmailMessage, env: Bindings): Promise<void> => {
const message_id = message.headers.get("Message-ID");
// auto reply email
if (getBooleanValue(env.ENABLE_AUTO_REPLY) && message_id) {
try {
const results = await env.DB.prepare(
`SELECT * FROM auto_reply_mails where address = ? and enabled = 1`
).bind(message.to).first<Record<string, string>>();
if (results && results.source_prefix && message.from.startsWith(results.source_prefix)) {
const msg = createMimeMessage();
msg.setHeader("In-Reply-To", message_id);
msg.setSender({
name: results.name || results.address,
addr: results.address
});
msg.setRecipient(message.from);
msg.setSubject(results.subject || "Auto-reply");
msg.addMessage({
contentType: 'text/plain',
data: results.message || "This is an auto-reply message, please reconact later."
});
const { EmailMessage } = await import('cloudflare:email');
const replyMessage = new EmailMessage(
message.to,
message.from,
msg.asRaw()
);
// @ts-ignore
await message.reply(replyMessage);
}
} catch (error) {
console.log("reply email error", error);
}
}
}

51
worker/src/email/index.ts Normal file
View File

@@ -0,0 +1,51 @@
import { Context } from "hono";
import { sendMailToTelegram } from "../telegram_api";
import { Bindings } from "../types";
import { auto_reply } from "./auto_reply";
import { trigerWebhook } from "../mails_api/webhook_settings";
async function email(message: ForwardableEmailMessage, env: Bindings, ctx: ExecutionContext) {
if (env.BLACK_LIST && env.BLACK_LIST.split(",").some(word => message.from.includes(word))) {
message.setReject("Missing from address");
console.log(`Reject message from ${message.from} to ${message.to}`);
return;
}
const rawEmail = await new Response(message.raw).text();
const message_id = message.headers.get("Message-ID");
// save email
const { success } = await env.DB.prepare(
`INSERT INTO raw_mails (source, address, raw, message_id) VALUES (?, ?, ?, ?)`
).bind(
message.from, message.to, rawEmail, message_id
).run();
if (!success) {
message.setReject(`Failed save message to ${message.to}`);
console.log(`Failed save message from ${message.from} to ${message.to}`);
}
// send email to telegram
try {
await sendMailToTelegram(
{ env: env } as Context<{ Bindings: Bindings }>,
message.to, rawEmail);
} catch (error) {
console.log("send mail to telegram error", error);
}
// send webhook
try {
await trigerWebhook(
{ env: env } as Context<{ Bindings: Bindings }>,
message.to, rawEmail
);
} catch (error) {
console.log("send webhook error", error);
}
// auto reply email
await auto_reply(message, env);
}
export { email }