修复邮件系统: 1.处理收件人为None的情况 2.增强SMTP服务器对空收件人的检查

This commit is contained in:
huangzhenpc
2025-02-26 13:54:55 +08:00
parent d277409598
commit b6ec8222e8
2 changed files with 40 additions and 21 deletions

View File

@@ -84,7 +84,13 @@ class MailStore:
try:
# 查找收件人对应的邮箱
mailbox_id = None
recipients_list = recipients if isinstance(recipients, list) else [recipients]
# 处理recipients为None的情况
if recipients is None:
logging.warning("收件人列表为None将使用空列表")
recipients_list = []
else:
recipients_list = recipients if isinstance(recipients, list) else [recipients]
# 确保收件人列表不为空
if not recipients_list:

View File

@@ -39,36 +39,49 @@ class EmailHandler(Message):
async def handle_DATA(self, server, session, envelope):
"""处理邮件数据"""
try:
# 获取邮件数据
message_data = envelope.content.decode('utf-8', errors='replace')
logging.info(f"收到邮件: 发件人={envelope.mail_from}, 收件人={envelope.rcpt_tos}")
# 记录接收到的邮件
sender = envelope.mail_from
recipients = envelope.rcpt_tos
# 检查收件人列表是否有效
if not envelope.rcpt_tos:
logging.warning("收到邮件但没有有效收件人,将拒绝")
return '550 无效的收件人'
logging.info(f"SMTP服务收到邮件: 发件人={sender}, 收件人={recipients}")
# 保存原始邮件数据
raw_data = envelope.content.decode('utf-8', errors='replace')
# 使用email.parser解析邮件
parser = email.parser.Parser(policy=default)
message = parser.parsestr(message_data)
# 解析邮件数据
message = email_parser.Parser(policy=default).parsestr(raw_data)
subject = message.get('Subject', '')
logging.info(f"邮件主题: {subject}")
# 保存邮件
success, result_message = await self.mail_store.save_email(message, sender, recipients, message_data)
# 记录邮件结构和内容
logging.debug(f"邮件结构: is_multipart={message.is_multipart()}")
if message.is_multipart():
logging.debug(f"多部分邮件: 部分数量={len(list(message.walk()))}")
for i, part in enumerate(message.walk()):
content_type = part.get_content_type()
logging.debug(f"部分 {i+1}: 内容类型={content_type}")
# 使用邮件存储服务保存邮件
success, error_msg = await self.mail_store.save_email(
message,
envelope.mail_from,
envelope.rcpt_tos,
raw_data=raw_data
)
if success:
logging.info(f"邮件已成功保存: {result_message}")
return '250 Message accepted for delivery'
logging.info(f"邮件保存成功: 来自 {envelope.mail_from} 发送给 {envelope.rcpt_tos}")
return '250 消息接收完成'
else:
logging.error(f"邮件保存失败: {result_message}")
# 注意:即使保存失败,我们仍然返回成功,避免发件方重试
# 这是因为问题通常在我们的系统中,重试不会解决问题
return '250 Message accepted for delivery (warning: internal processing error)'
logging.error(f"邮件保存失败: {error_msg}")
# 即使保存失败,也返回成功状态码,避免邮件服务器重试
return '250 消息已收到'
except Exception as e:
logging.error(f"处理邮件时出错: {str(e)}")
traceback.print_exc()
# 返回临时错误,让发件方可以重试
return '451 Requested action aborted: local error in processing'
return '451 处理邮件时出现错误,请稍后重试'
# 为Windows环境自定义SMTP控制器