diff --git a/smtp_proxy_server/imap_server.py b/smtp_proxy_server/imap_server.py index 556cfe0d..9759054e 100644 --- a/smtp_proxy_server/imap_server.py +++ b/smtp_proxy_server/imap_server.py @@ -51,6 +51,9 @@ class SimpleMessage: def getFlags(self): return ["\\Seen"] + def getInternalDate(self): + return self.email.headers.get("Date", "Mon, 1 Jan 1900 00:00:00 +0000") + @implementer(imap4.IMailboxInfo, imap4.IMailbox) class SimpleMailbox: @@ -129,7 +132,7 @@ class SimpleMailbox: def store(self, messages, flags, mode, uid): # IMailboxIMAP.store - pass + raise NotImplementedError class Account(imap4.MemoryAccount): @@ -141,7 +144,7 @@ class Account(imap4.MemoryAccount): def _emptyMailbox(self, name, id): _logger.info(f"New mailbox: {name}, {id}") if name != "INBOX": - raise imap4.NoSuchMailbox(name) + raise Exception("Mailbox not found") return SimpleMailbox(self.password) def select(self, name, rw=1): diff --git a/smtp_proxy_server/smtp_server.py b/smtp_proxy_server/smtp_server.py index 8436ad46..bd9a0c8a 100644 --- a/smtp_proxy_server/smtp_server.py +++ b/smtp_proxy_server/smtp_server.py @@ -41,20 +41,33 @@ class CustomSMTPHandler: for part in msg.walk(): content_type = part.get_content_type() charset = part.get_content_charset() - payload = part.get_payload(decode=True) + cte = str(part.get('content-transfer-encoding', '')).lower() if content_type not in ["text/plain", "text/html"]: _logger.warning(f"Skipping {content_type}") continue - if not payload: + if cte == "8bit": + value = part.get_payload(decode=False) + else: + payload = part.get_payload(decode=True) + value = payload.decode(charset) if charset else payload + if not value: continue content_list.append({ "type": content_type, - "value": payload.decode(charset) + "value": value }) elif msg.get_content_type() in ["text/plain", "text/html"] and msg.get_payload(decode=True): + cte = str(msg.get('content-transfer-encoding', '')).lower() + charset = msg.get_content_charset() + if cte == "8bit": + value = msg.get_payload(decode=False) + else: + payload = msg.get_payload(decode=True) + value = payload.decode(charset) if charset else payload + _logger.info(f"Payload {msg._payload} charset {charset}") content_list.append({ "type": msg.get_content_type(), - "value": msg.get_payload(decode=True).decode() + "value": value }) if not content_list: diff --git a/worker/src/telegram_api/telegram.ts b/worker/src/telegram_api/telegram.ts index 43b5e408..bddda120 100644 --- a/worker/src/telegram_api/telegram.ts +++ b/worker/src/telegram_api/telegram.ts @@ -61,11 +61,16 @@ export function newTelegramBot(c: Context, token: string): Telegraf { return await ctx.reply("无法获取用户信息"); } try { - // @ts-ignore - const address = ctx?.message?.text.slice("/new".length).trim(); - if (!address) { - return await ctx.reply("请输入邮箱地址"); + if (c.env.RATE_LIMITER) { + const { success } = await c.env.RATE_LIMITER.limit( + { key: `${CONSTANTS.TG_KV_PREFIX}:${userId}` } + ) + if (!success) { + return await ctx.reply("操作过于频繁"); + } } + // @ts-ignore + const address = ctx?.message?.text.slice("/new".length).trim() || Math.random().toString(36).substring(2, 15); const [name, domain] = address.includes("@") ? address.split("@") : [address, null]; const jwtList = await c.env.KV.get(`${CONSTANTS.TG_KV_PREFIX}:${userId}`, { type: 'json' }) || []; if (jwtList.length >= getIntValue(c.env.TG_MAX_ADDRESS, 5)) {