mirror of
https://github.com/dreamhunter2333/cloudflare_temp_email.git
synced 2026-06-12 02:50:46 +08:00
fix: webhook JSON.stringify (#263)
This commit is contained in:
@@ -73,7 +73,7 @@ class SimpleMailbox:
|
|||||||
return 0
|
return 0
|
||||||
|
|
||||||
def getMessageCount(self):
|
def getMessageCount(self):
|
||||||
return 2 ** 31 - 1
|
return self.message_count or 1000
|
||||||
|
|
||||||
def getRecentCount(self):
|
def getRecentCount(self):
|
||||||
return 0
|
return 0
|
||||||
@@ -99,7 +99,7 @@ class SimpleMailbox:
|
|||||||
if "UIDNEXT" in names:
|
if "UIDNEXT" in names:
|
||||||
r["UIDNEXT"] = self.getMessageCount() + 1
|
r["UIDNEXT"] = self.getMessageCount() + 1
|
||||||
if "UIDVALIDITY" in names:
|
if "UIDVALIDITY" in names:
|
||||||
r["UIDVALIDITY"] = self.getUID()
|
r["UIDVALIDITY"] = self.getUIDValidity()
|
||||||
if "UNSEEN" in names:
|
if "UNSEEN" in names:
|
||||||
r["UNSEEN"] = self.getUnseenCount()
|
r["UNSEEN"] = self.getUnseenCount()
|
||||||
return defer.succeed(r)
|
return defer.succeed(r)
|
||||||
@@ -114,10 +114,11 @@ class SimpleMailbox:
|
|||||||
def fetchINBOX(self, messages):
|
def fetchINBOX(self, messages):
|
||||||
start, end = messages.ranges[0]
|
start, end = messages.ranges[0]
|
||||||
start = max(start, 1)
|
start = max(start, 1)
|
||||||
|
limit = min(20, end - start + 1) if end and end >= start else 20
|
||||||
if self.message_count > 0 and start > self.message_count:
|
if self.message_count > 0 and start > self.message_count:
|
||||||
return []
|
return []
|
||||||
res = requests.get(
|
res = requests.get(
|
||||||
f"{settings.proxy_url}/api/mails?limit=20&offset={start - 1}", headers={
|
f"{settings.proxy_url}/api/mails?limit={limit}&offset={start - 1}", headers={
|
||||||
"Authorization": f"Bearer {self.password}",
|
"Authorization": f"Bearer {self.password}",
|
||||||
"Content-Type": "application/json"
|
"Content-Type": "application/json"
|
||||||
}
|
}
|
||||||
@@ -138,10 +139,11 @@ class SimpleMailbox:
|
|||||||
def fetchSENT(self, messages):
|
def fetchSENT(self, messages):
|
||||||
start, end = messages.ranges[0]
|
start, end = messages.ranges[0]
|
||||||
start = max(start, 1)
|
start = max(start, 1)
|
||||||
|
limit = min(20, end - start + 1) if end >= start else 20
|
||||||
if self.message_count > 0 and start > self.message_count:
|
if self.message_count > 0 and start > self.message_count:
|
||||||
return []
|
return []
|
||||||
res = requests.get(
|
res = requests.get(
|
||||||
f"{settings.proxy_url}/api/sendbox?limit=20&offset={start - 1}", headers={
|
f"{settings.proxy_url}/api/sendbox?limit={limit}&offset={start - 1}", headers={
|
||||||
"Authorization": f"Bearer {self.password}",
|
"Authorization": f"Bearer {self.password}",
|
||||||
"Content-Type": "application/json"
|
"Content-Type": "application/json"
|
||||||
}
|
}
|
||||||
@@ -194,8 +196,13 @@ class SimpleIMAPServer(imap4.IMAP4Server):
|
|||||||
self.factory = factory
|
self.factory = factory
|
||||||
|
|
||||||
def lineReceived(self, line):
|
def lineReceived(self, line):
|
||||||
|
# _logger.info(f"Received: {line}")
|
||||||
super().lineReceived(line)
|
super().lineReceived(line)
|
||||||
|
|
||||||
|
def sendLine(self, line):
|
||||||
|
# _logger.info(f"Sent: {line}")
|
||||||
|
super().sendLine(line)
|
||||||
|
|
||||||
|
|
||||||
@implementer(IRealm)
|
@implementer(IRealm)
|
||||||
class SimpleRealm:
|
class SimpleRealm:
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ import json
|
|||||||
import logging
|
import logging
|
||||||
import email
|
import email
|
||||||
|
|
||||||
from email.header import Header
|
|
||||||
from email.message import Message
|
from email.message import Message
|
||||||
from email.mime.multipart import MIMEMultipart
|
from email.mime.multipart import MIMEMultipart
|
||||||
from email.mime.text import MIMEText
|
from email.mime.text import MIMEText
|
||||||
|
|||||||
@@ -59,7 +59,12 @@ async function sendWebhook(settings: WebhookSettings, formatMap: WebhookMail): P
|
|||||||
// send webhook
|
// send webhook
|
||||||
let body = settings.body;
|
let body = settings.body;
|
||||||
for (const key of Object.keys(formatMap)) {
|
for (const key of Object.keys(formatMap)) {
|
||||||
body = body.replace(new RegExp(`\\$\\{${key}\\}`, "g"), formatMap[key as keyof WebhookMail]);
|
body = body.replace(
|
||||||
|
new RegExp(`\\$\\{${key}\\}`, "g"),
|
||||||
|
JSON.stringify(
|
||||||
|
formatMap[key as keyof WebhookMail]
|
||||||
|
).replace(/^"(.*)"$/, '\$1')
|
||||||
|
);
|
||||||
}
|
}
|
||||||
const response = await fetch(settings.url, {
|
const response = await fetch(settings.url, {
|
||||||
method: settings.method,
|
method: settings.method,
|
||||||
@@ -95,10 +100,10 @@ export async function trigerWebhook(
|
|||||||
const res = await sendWebhook(settings, {
|
const res = await sendWebhook(settings, {
|
||||||
from: parsedEmail.from.address || "",
|
from: parsedEmail.from.address || "",
|
||||||
to: address,
|
to: address,
|
||||||
headers: JSON.stringify(parsedEmail.headers, null, 2),
|
headers: JSON.stringify(parsedEmail.headers),
|
||||||
subject: JSON.stringify(parsedEmail.subject) || "",
|
subject: parsedEmail.subject || "",
|
||||||
raw: JSON.stringify(raw_mail),
|
raw: raw_mail,
|
||||||
parsedText: JSON.stringify(parsedEmail.text) || JSON.stringify(parsedEmail.html) || ""
|
parsedText: parsedEmail.text || parsedEmail.html || ""
|
||||||
});
|
});
|
||||||
if (!res.success) {
|
if (!res.success) {
|
||||||
console.log(res.message);
|
console.log(res.message);
|
||||||
@@ -107,13 +112,19 @@ export async function trigerWebhook(
|
|||||||
|
|
||||||
async function testWebhookSettings(c: Context<HonoCustomType>): Promise<Response> {
|
async function testWebhookSettings(c: Context<HonoCustomType>): Promise<Response> {
|
||||||
const settings = await c.req.json<WebhookSettings>();
|
const settings = await c.req.json<WebhookSettings>();
|
||||||
|
const { address } = c.get("jwtPayload");
|
||||||
|
// random raw email
|
||||||
|
const raw = await c.env.DB.prepare(
|
||||||
|
`SELECT raw FROM raw_mails WHERE address = ? ORDER BY RANDOM() LIMIT 1`
|
||||||
|
).bind(address).first<string>("raw");
|
||||||
|
const parsedEmail = raw ? await PostalMime.parse(raw) : {} as any;
|
||||||
const res = await sendWebhook(settings, {
|
const res = await sendWebhook(settings, {
|
||||||
from: "from@test.com",
|
from: parsedEmail?.from?.address || "test@test.com",
|
||||||
to: "to@test.com",
|
to: address,
|
||||||
headers: "headers",
|
headers: JSON.stringify(parsedEmail?.headers || { "X-Test": "test" }),
|
||||||
subject: "test",
|
subject: parsedEmail?.subject || "test subject",
|
||||||
raw: "test",
|
raw: raw || "test raw email",
|
||||||
parsedText: "test"
|
parsedText: parsedEmail?.text || parsedEmail?.html || "test parsed text"
|
||||||
});
|
});
|
||||||
if (!res.success) {
|
if (!res.success) {
|
||||||
return c.text(res.message || "send webhook error", 400);
|
return c.text(res.message || "send webhook error", 400);
|
||||||
|
|||||||
Reference in New Issue
Block a user