check_new_email.py 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. from mysql_db import DBManager
  2. from email_client import EmailClient
  3. from notice import AiYuFeiFei
  4. EMAIL_CONFIG_SQL = '''
  5. select email_address, -- 邮件地址
  6. email_password, -- 邮件密码
  7. connection_type, -- 连接类型
  8. receive_server_address, -- 接收邮件服务器地址
  9. receive_server_port, -- 接收邮件服务器端口号
  10. iyuu_token, -- 爱语飞飞token
  11. last_check_uid -- 上次检查的UID
  12. from check_email_config;
  13. '''
  14. EMAIL_UPDATE_LAST_CHECK_UID_SQL = '''
  15. update check_email_config
  16. set last_check_uid = %s
  17. where email_address = %s;
  18. '''
  19. def fetch_all_data(db_manager):
  20. """
  21. 获取所有数据
  22. :param db_manager: 数据库管理器
  23. :return:
  24. """
  25. try:
  26. with db_manager.managed_cursor() as cursor:
  27. cursor.execute(EMAIL_CONFIG_SQL)
  28. records = cursor.fetchall()
  29. if not records:
  30. return []
  31. return [
  32. {
  33. "email_account": record[0],
  34. "email_password": record[1],
  35. "connection_type": record[2],
  36. "receive_server_address": record[3],
  37. "receive_server_port": record[4],
  38. "iyuu_token": record[5],
  39. "last_check_uid": record[6]
  40. }
  41. for record in records
  42. ]
  43. except Exception as e:
  44. print(f"查询邮箱配置失败: {e}")
  45. return []
  46. def update_last_check_uid(db_manager, email_account, last_check_uid):
  47. """
  48. 更新检查邮件的UID
  49. :param db_manager: 数据库管理器
  50. :param email_account: 邮箱账号
  51. :param last_check_uid: 最后检查的UID
  52. :return:
  53. """
  54. try:
  55. with db_manager.managed_cursor() as cursor:
  56. cursor.execute(EMAIL_UPDATE_LAST_CHECK_UID_SQL, (last_check_uid, email_account))
  57. db_manager.connection.commit()
  58. print(f"更新 {email_account} 的本次检测UID为: {last_check_uid}")
  59. except Exception as e:
  60. print(f"更新UID失败: {e}")
  61. db_manager.connection.rollback()
  62. def check_new_email(email_config: dict):
  63. """
  64. 检查新邮件
  65. :param email_config: 邮箱配置
  66. :return:
  67. """
  68. email_account = email_config['email_account']
  69. print(f"正在检查 {email_account} 的邮件...")
  70. # 检查新邮件
  71. client = EmailClient(email_config)
  72. new_emails = client.check_new_email(email_config['last_check_uid'])
  73. print(f"新邮件数量: {len(new_emails)}")
  74. # 发送通知
  75. current_email = None
  76. try:
  77. notice = AiYuFeiFei(email_config['iyuu_token'])
  78. for email in new_emails:
  79. current_email = email
  80. sender = email['sender']
  81. index = sender.index("@")
  82. title = f"来自【{sender[:index]}】新的邮件"
  83. context = f'发件人:{email["sender"]} \n主题:{email["subject"]} \n发送时间:{email["date"]}'
  84. notice.send_notification(title, context)
  85. except Exception as e:
  86. print(f"邮箱账户{email_account} 发送邮件[{current_email['subject']}]通知失败: {e}")
  87. # 更新最大UID
  88. if current_email and current_email['uid'] > email_config['last_check_uid']:
  89. update_last_check_uid(db_manager, email_account, current_email['uid'])
  90. if __name__ == '__main__':
  91. db_manager = DBManager()
  92. records = fetch_all_data(db_manager)
  93. if not records:
  94. print("没有查询到邮箱配置")
  95. else:
  96. for row in records:
  97. check_new_email(row)