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 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:

View File

@@ -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

View File

@@ -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);