海外邮件推送更新
This commit is contained in:
Generated
+7
@@ -38,6 +38,13 @@
|
||||
</Attribute>
|
||||
</value>
|
||||
</entry>
|
||||
<entry key="\test\异常服务待办派发.csv">
|
||||
<value>
|
||||
<Attribute>
|
||||
<option name="separator" value="," />
|
||||
</Attribute>
|
||||
</value>
|
||||
</entry>
|
||||
</map>
|
||||
</option>
|
||||
</component>
|
||||
|
||||
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__":
|
||||
|
||||
Reference in New Issue
Block a user