fix: webhook JSON.stringify (#263)

This commit is contained in:
Dream Hunter
2024-05-22 20:48:03 +08:00
committed by GitHub
parent dd49768cfc
commit 37ed2955ff
3 changed files with 33 additions and 16 deletions

View File

@@ -73,7 +73,7 @@ class SimpleMailbox:
return 0
def getMessageCount(self):
return 2 ** 31 - 1
return self.message_count or 1000
def getRecentCount(self):
return 0
@@ -99,7 +99,7 @@ class SimpleMailbox:
if "UIDNEXT" in names:
r["UIDNEXT"] = self.getMessageCount() + 1
if "UIDVALIDITY" in names:
r["UIDVALIDITY"] = self.getUID()
r["UIDVALIDITY"] = self.getUIDValidity()
if "UNSEEN" in names:
r["UNSEEN"] = self.getUnseenCount()
return defer.succeed(r)
@@ -114,10 +114,11 @@ class SimpleMailbox:
def fetchINBOX(self, messages):
start, end = messages.ranges[0]
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:
return []
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}",
"Content-Type": "application/json"
}
@@ -138,10 +139,11 @@ class SimpleMailbox:
def fetchSENT(self, messages):
start, end = messages.ranges[0]
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:
return []
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}",
"Content-Type": "application/json"
}
@@ -194,8 +196,13 @@ class SimpleIMAPServer(imap4.IMAP4Server):
self.factory = factory
def lineReceived(self, line):
# _logger.info(f"Received: {line}")
super().lineReceived(line)
def sendLine(self, line):
# _logger.info(f"Sent: {line}")
super().sendLine(line)
@implementer(IRealm)
class SimpleRealm:

View File

@@ -3,7 +3,6 @@ import json
import logging
import email
from email.header import Header
from email.message import Message
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText

View File

@@ -59,7 +59,12 @@ async function sendWebhook(settings: WebhookSettings, formatMap: WebhookMail): P
// send webhook
let body = settings.body;
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, {
method: settings.method,
@@ -95,10 +100,10 @@ export async function trigerWebhook(
const res = await sendWebhook(settings, {
from: parsedEmail.from.address || "",
to: address,
headers: JSON.stringify(parsedEmail.headers, null, 2),
subject: JSON.stringify(parsedEmail.subject) || "",
raw: JSON.stringify(raw_mail),
parsedText: JSON.stringify(parsedEmail.text) || JSON.stringify(parsedEmail.html) || ""
headers: JSON.stringify(parsedEmail.headers),
subject: parsedEmail.subject || "",
raw: raw_mail,
parsedText: parsedEmail.text || parsedEmail.html || ""
});
if (!res.success) {
console.log(res.message);
@@ -107,13 +112,19 @@ export async function trigerWebhook(
async function testWebhookSettings(c: Context<HonoCustomType>): Promise<Response> {
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, {
from: "from@test.com",
to: "to@test.com",
headers: "headers",
subject: "test",
raw: "test",
parsedText: "test"
from: parsedEmail?.from?.address || "test@test.com",
to: address,
headers: JSON.stringify(parsedEmail?.headers || { "X-Test": "test" }),
subject: parsedEmail?.subject || "test subject",
raw: raw || "test raw email",
parsedText: parsedEmail?.text || parsedEmail?.html || "test parsed text"
});
if (!res.success) {
return c.text(res.message || "send webhook error", 400);