海外邮件推送更新

This commit is contained in:
z66
2025-10-28 09:57:50 +08:00
parent 80ab4019c8
commit 68ae53c0ae
3 changed files with 8538 additions and 28 deletions
File diff suppressed because it is too large Load Diff
@@ -58,6 +58,8 @@ class EmailProcessor:
port=self.pop_server_port,
timeout=10
)
# 设置为10MB,避免line too long错误(某些邮件包含大型内联图片或附件)
email_server._maxline = 10485760
print("POP服务器连接成功,开始用户邮箱验证")
except Exception as e:
print(f"POP服务器连接失败。错误: {str(e)}")
@@ -80,7 +82,7 @@ class EmailProcessor:
exit(1)
# 处理邮件
self.parse_email_server(email_server)
return self.parse_email_server(email_server)
def parse_email_server(self, email_server):
# 获取所有邮件列表
@@ -92,6 +94,8 @@ class EmailProcessor:
today_start = datetime(now.year, now.month, now.day) # 当天零点
today_start_timestamp = int(today_start.timestamp()) # 转换为时间戳
target_email_found = False # 标记是否找到目标邮件
# 按逆序处理邮件(最新的先处理)
for i in range(index, 0, -1):
@@ -106,7 +110,7 @@ class EmailProcessor:
# 处理邮件时间
mail_datetime = self.parse_mail_time(msg.get("date"))
if not mail_datetime: # 如果邮件时间解析失败,跳过
# logging.warning(f"Failed to parse date for email {i}. Skipping...")
logger.warning(f"邮件 {i} 的时间解析失败,跳过")
continue
# 将邮件时间转换为时间戳
@@ -124,14 +128,33 @@ class EmailProcessor:
# 处理邮件内容
self.parser_content(msg, 0)
# 检查是否是目标邮件(来自f6car的邮件)
hdr, addr = parseaddr(msg['From'])
name, charset = decode_header(hdr)[0] if hdr else ("", None)
if charset and isinstance(name, bytes):
name = name.decode(charset)
if name == self.send_name:
target_email_found = True
logger.info(f"已找到并处理目标邮件(来自 {self.send_name}),退出邮件循环")
break # 找到目标邮件后立即退出循环
except poplib.error_proto as e:
# POP3协议错误(如line too long
error_task_logger.error(f"邮件 {i} POP3协议错误: {e},跳过该邮件继续处理")
continue
except Exception as e:
# logging.error(f"Error processing email {i}: {e}")
print(f"Error processing email {i}: {e}")
# 其他错误
error_task_logger.error(f"处理邮件 {i} 时发生错误: {e},跳过该邮件继续处理")
continue
if not target_email_found:
logger.warning(f"未找到来自 {self.send_name} 的目标邮件")
# 退出服务器
email_server.quit()
return target_email_found
def parser_content(self, msg, indent):
if indent == 0:
@@ -174,26 +197,39 @@ class EmailProcessor:
logger.info(f"邮件内容: {content}")
def parser_email_header(self, msg):
# 解析邮件主题
subject = msg['Subject']
value, charset = decode_header(subject)[0]
if charset:
value = value.decode(charset)
try:
# 解析邮件主题
subject = msg['Subject']
if subject:
value, charset = decode_header(subject)[0]
if charset:
value = value.decode(charset)
else:
value = "(无主题)"
# 解析发件人信息
from_header = msg['From']
if from_header:
hdr, addr = parseaddr(from_header)
name1, charset = decode_header(hdr)[0] if hdr else ("", None)
if charset and isinstance(name1, bytes):
name1 = name1.decode(charset)
else:
name1 = ""
# 解析件人信息
hdr, addr = parseaddr(msg['From'])
name1, charset = decode_header(hdr)[0]
if charset:
name1 = name1.decode(charset)
# 解析收件人信息
hdr, addr = parseaddr(msg['To'])
name, charset = decode_header(hdr)[0]
if charset:
name = name.decode(charset)
logger.info(f"邮件主题: {value}, 发件人: {name1}, 收件人: {name}")
# 解析件人信息
to_header = msg['To']
if to_header:
hdr, addr = parseaddr(to_header)
name, charset = decode_header(hdr)[0] if hdr else ("", None)
if charset and isinstance(name, bytes):
name = name.decode(charset)
else:
name = ""
logger.info(f"邮件主题: {value}, 发件人: {name1}, 收件人: {name}")
except Exception as e:
error_task_logger.error(f"解析邮件头部信息时出错: {e}")
@staticmethod
@@ -301,10 +337,10 @@ class EmailProcessor:
except Error as e:
error_task_logger.error(f"数据库写入数据时发生异常: {e}")
task_start_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
common_module.send_task_error(task_start_time, "海外邮件推送", str(e))
if connection:
connection.rollback()
# 重新抛出异常,让main方法统一处理错误通知
raise
finally:
if connection:
connection.close()
@@ -315,14 +351,25 @@ class EmailProcessor:
task_start_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
try:
processor = cls()
processor.connect_email_by_pop3()
logger.info("邮件获取完成")
target_email_found = processor.connect_email_by_pop3()
if not target_email_found:
# 未找到目标邮件,发送错误通知
error_msg = f"未找到来自 {processor.send_name} 的目标邮件"
error_task_logger.error(error_msg)
common_module.send_task_error(task_start_time, "海外邮件推送", error_msg)
return
logger.info("邮件获取完成,开始处理数据")
email_df = processor.update_email()
processor.up_to_BI(email_df) # 发送到BI
common_module.send_task_status(task_start_time, "海外邮件推送")
logger.info("海外邮件推送任务完成")
except Exception as e:
common_module.send_task_error(task_start_time, "海外邮件推送", "失败")
error_task_logger.error(f"任务执行时发生异常: {e}")
error_msg = f"任务执行失败: {str(e)}"
error_task_logger.error(error_msg)
common_module.send_task_error(task_start_time, "海外邮件推送", error_msg)
if __name__ == "__main__":