海外邮件推送更新
This commit is contained in:
Generated
+7
@@ -38,6 +38,13 @@
|
|||||||
</Attribute>
|
</Attribute>
|
||||||
</value>
|
</value>
|
||||||
</entry>
|
</entry>
|
||||||
|
<entry key="\test\异常服务待办派发.csv">
|
||||||
|
<value>
|
||||||
|
<Attribute>
|
||||||
|
<option name="separator" value="," />
|
||||||
|
</Attribute>
|
||||||
|
</value>
|
||||||
|
</entry>
|
||||||
</map>
|
</map>
|
||||||
</option>
|
</option>
|
||||||
</component>
|
</component>
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -58,6 +58,8 @@ class EmailProcessor:
|
|||||||
port=self.pop_server_port,
|
port=self.pop_server_port,
|
||||||
timeout=10
|
timeout=10
|
||||||
)
|
)
|
||||||
|
# 设置为10MB,避免line too long错误(某些邮件包含大型内联图片或附件)
|
||||||
|
email_server._maxline = 10485760
|
||||||
print("POP服务器连接成功,开始用户邮箱验证")
|
print("POP服务器连接成功,开始用户邮箱验证")
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"POP服务器连接失败。错误: {str(e)}")
|
print(f"POP服务器连接失败。错误: {str(e)}")
|
||||||
@@ -80,7 +82,7 @@ class EmailProcessor:
|
|||||||
exit(1)
|
exit(1)
|
||||||
|
|
||||||
# 处理邮件
|
# 处理邮件
|
||||||
self.parse_email_server(email_server)
|
return self.parse_email_server(email_server)
|
||||||
|
|
||||||
def parse_email_server(self, 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 = datetime(now.year, now.month, now.day) # 当天零点
|
||||||
today_start_timestamp = int(today_start.timestamp()) # 转换为时间戳
|
today_start_timestamp = int(today_start.timestamp()) # 转换为时间戳
|
||||||
|
|
||||||
|
target_email_found = False # 标记是否找到目标邮件
|
||||||
|
|
||||||
# 按逆序处理邮件(最新的先处理)
|
# 按逆序处理邮件(最新的先处理)
|
||||||
for i in range(index, 0, -1):
|
for i in range(index, 0, -1):
|
||||||
|
|
||||||
@@ -106,7 +110,7 @@ class EmailProcessor:
|
|||||||
# 处理邮件时间
|
# 处理邮件时间
|
||||||
mail_datetime = self.parse_mail_time(msg.get("date"))
|
mail_datetime = self.parse_mail_time(msg.get("date"))
|
||||||
if not mail_datetime: # 如果邮件时间解析失败,跳过
|
if not mail_datetime: # 如果邮件时间解析失败,跳过
|
||||||
# logging.warning(f"Failed to parse date for email {i}. Skipping...")
|
logger.warning(f"邮件 {i} 的时间解析失败,跳过")
|
||||||
continue
|
continue
|
||||||
|
|
||||||
# 将邮件时间转换为时间戳
|
# 将邮件时间转换为时间戳
|
||||||
@@ -124,14 +128,33 @@ class EmailProcessor:
|
|||||||
|
|
||||||
# 处理邮件内容
|
# 处理邮件内容
|
||||||
self.parser_content(msg, 0)
|
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:
|
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
|
continue
|
||||||
|
|
||||||
|
if not target_email_found:
|
||||||
|
logger.warning(f"未找到来自 {self.send_name} 的目标邮件")
|
||||||
|
|
||||||
# 退出服务器
|
# 退出服务器
|
||||||
email_server.quit()
|
email_server.quit()
|
||||||
|
|
||||||
|
return target_email_found
|
||||||
|
|
||||||
def parser_content(self, msg, indent):
|
def parser_content(self, msg, indent):
|
||||||
if indent == 0:
|
if indent == 0:
|
||||||
@@ -174,26 +197,39 @@ class EmailProcessor:
|
|||||||
logger.info(f"邮件内容: {content}")
|
logger.info(f"邮件内容: {content}")
|
||||||
|
|
||||||
def parser_email_header(self, msg):
|
def parser_email_header(self, msg):
|
||||||
# 解析邮件主题
|
try:
|
||||||
subject = msg['Subject']
|
# 解析邮件主题
|
||||||
value, charset = decode_header(subject)[0]
|
subject = msg['Subject']
|
||||||
if charset:
|
if subject:
|
||||||
value = value.decode(charset)
|
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'])
|
to_header = msg['To']
|
||||||
name1, charset = decode_header(hdr)[0]
|
if to_header:
|
||||||
if charset:
|
hdr, addr = parseaddr(to_header)
|
||||||
name1 = name1.decode(charset)
|
name, charset = decode_header(hdr)[0] if hdr else ("", None)
|
||||||
|
if charset and isinstance(name, bytes):
|
||||||
|
name = name.decode(charset)
|
||||||
# 解析收件人信息
|
else:
|
||||||
hdr, addr = parseaddr(msg['To'])
|
name = ""
|
||||||
name, charset = decode_header(hdr)[0]
|
|
||||||
if charset:
|
logger.info(f"邮件主题: {value}, 发件人: {name1}, 收件人: {name}")
|
||||||
name = name.decode(charset)
|
except Exception as e:
|
||||||
logger.info(f"邮件主题: {value}, 发件人: {name1}, 收件人: {name}")
|
error_task_logger.error(f"解析邮件头部信息时出错: {e}")
|
||||||
|
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
@@ -301,10 +337,10 @@ class EmailProcessor:
|
|||||||
|
|
||||||
except Error as e:
|
except Error as e:
|
||||||
error_task_logger.error(f"数据库写入数据时发生异常: {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:
|
if connection:
|
||||||
connection.rollback()
|
connection.rollback()
|
||||||
|
# 重新抛出异常,让main方法统一处理错误通知
|
||||||
|
raise
|
||||||
finally:
|
finally:
|
||||||
if connection:
|
if connection:
|
||||||
connection.close()
|
connection.close()
|
||||||
@@ -315,14 +351,25 @@ class EmailProcessor:
|
|||||||
task_start_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
task_start_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
||||||
try:
|
try:
|
||||||
processor = cls()
|
processor = cls()
|
||||||
processor.connect_email_by_pop3()
|
target_email_found = processor.connect_email_by_pop3()
|
||||||
logger.info("邮件获取完成")
|
|
||||||
|
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()
|
email_df = processor.update_email()
|
||||||
processor.up_to_BI(email_df) # 发送到BI
|
processor.up_to_BI(email_df) # 发送到BI
|
||||||
common_module.send_task_status(task_start_time, "海外邮件推送")
|
common_module.send_task_status(task_start_time, "海外邮件推送")
|
||||||
|
logger.info("海外邮件推送任务完成")
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
common_module.send_task_error(task_start_time, "海外邮件推送", "失败")
|
error_msg = f"任务执行失败: {str(e)}"
|
||||||
error_task_logger.error(f"任务执行时发生异常: {e}")
|
error_task_logger.error(error_msg)
|
||||||
|
common_module.send_task_error(task_start_time, "海外邮件推送", error_msg)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|||||||
Reference in New Issue
Block a user