feat: add email summary script and configuration
- Add Tencent enterprise email IMAP config to TOOLS.md - Create email_summary.py script to fetch yesterday's emails - Set up daily cron job at 9 AM - Note: fj@77ircloud.com emails are marked as important
This commit is contained in:
157
scripts/email_summary.py
Normal file
157
scripts/email_summary.py
Normal file
@@ -0,0 +1,157 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
邮件摘要脚本 - 每天早上9点推送前一天的邮件摘要
|
||||
重点关注 fj@77ircloud.com 的邮件
|
||||
"""
|
||||
|
||||
import imaplib
|
||||
import ssl
|
||||
import email
|
||||
from email.header import decode_header
|
||||
from datetime import datetime, timedelta
|
||||
import json
|
||||
import sys
|
||||
|
||||
def decode_str(s):
|
||||
if s is None:
|
||||
return ''
|
||||
parts = decode_header(s)
|
||||
result = []
|
||||
for part, charset in parts:
|
||||
if isinstance(part, bytes):
|
||||
charset = charset or 'utf-8'
|
||||
try:
|
||||
result.append(part.decode(charset, errors='replace'))
|
||||
except:
|
||||
result.append(part.decode('utf-8', errors='replace'))
|
||||
else:
|
||||
result.append(part)
|
||||
return ''.join(result)
|
||||
|
||||
def get_email_body(msg):
|
||||
"""获取邮件正文"""
|
||||
body = ''
|
||||
if msg.is_multipart():
|
||||
for part in msg.walk():
|
||||
content_type = part.get_content_type()
|
||||
if content_type == 'text/plain':
|
||||
try:
|
||||
charset = part.get_content_charset() or 'utf-8'
|
||||
body = part.get_payload(decode=True).decode(charset, errors='replace')
|
||||
break
|
||||
except:
|
||||
pass
|
||||
elif content_type == 'text/html':
|
||||
try:
|
||||
charset = part.get_content_charset() or 'utf-8'
|
||||
body = part.get_payload(decode=True).decode(charset, errors='replace')
|
||||
except:
|
||||
pass
|
||||
else:
|
||||
try:
|
||||
charset = msg.get_content_charset() or 'utf-8'
|
||||
body = msg.get_payload(decode=True).decode(charset, errors='replace')
|
||||
except:
|
||||
pass
|
||||
return body[:500] if body else '(无正文)'
|
||||
|
||||
def fetch_yesterday_emails():
|
||||
"""获取昨天的邮件"""
|
||||
try:
|
||||
context = ssl.create_default_context()
|
||||
mail = imaplib.IMAP4_SSL('imap.exmail.qq.com', 993, ssl_context=context)
|
||||
mail.login('lgc@77ircloud.com', 'bVPPcg6XgB7qRPw7')
|
||||
|
||||
mail.select('INBOX')
|
||||
status, messages = mail.search(None, 'ALL')
|
||||
email_ids = messages[0].split()
|
||||
|
||||
yesterday = (datetime.now() - timedelta(days=1)).date()
|
||||
yesterday_start = yesterday.strftime('%d-%b-%Y')
|
||||
|
||||
all_emails = []
|
||||
important_emails = []
|
||||
|
||||
for uid in reversed(email_ids[-50:] if len(email_ids) >= 50 else email_ids):
|
||||
status, msg_data = mail.fetch(uid, '(RFC822.HEADER RFC822.TEXT)')
|
||||
if not msg_data or not msg_data[0]:
|
||||
continue
|
||||
|
||||
raw_email = msg_data[0][1] if isinstance(msg_data[0], tuple) else msg_data[0]
|
||||
if isinstance(raw_email, tuple):
|
||||
raw_email = raw_email[1]
|
||||
|
||||
try:
|
||||
msg = email.message_from_bytes(raw_email if isinstance(raw_email, bytes) else raw_email.encode('utf-8'))
|
||||
except:
|
||||
continue
|
||||
|
||||
subject = decode_str(msg.get('Subject', '(无主题)'))
|
||||
sender = decode_str(msg.get('From', ''))
|
||||
date_str = msg.get('Date', '')
|
||||
|
||||
# 解析日期
|
||||
try:
|
||||
email_date = email.utils.parsedate_to_datetime(date_str).date()
|
||||
except:
|
||||
continue
|
||||
|
||||
# 只取昨天的邮件
|
||||
if email_date != yesterday:
|
||||
continue
|
||||
|
||||
email_info = {
|
||||
'subject': subject,
|
||||
'sender': sender,
|
||||
'date': date_str,
|
||||
'body': get_email_body(msg)
|
||||
}
|
||||
|
||||
all_emails.append(email_info)
|
||||
|
||||
# 重点关注 fj@77ircloud.com
|
||||
if 'fj@77ircloud.com' in sender:
|
||||
important_emails.append(email_info)
|
||||
|
||||
mail.logout()
|
||||
|
||||
return all_emails, important_emails, yesterday.strftime('%Y年%m月%d日')
|
||||
|
||||
except Exception as e:
|
||||
return [], [], str(e)
|
||||
|
||||
def format_summary():
|
||||
"""格式化邮件摘要"""
|
||||
emails, important, date_str = fetch_yesterday_emails()
|
||||
|
||||
if isinstance(important, str):
|
||||
return f"⚠️ 获取邮件失败: {important}"
|
||||
|
||||
if not emails:
|
||||
return f"📬 {date_str} 无新邮件"
|
||||
|
||||
lines = [f"📬 {date_str} 邮件摘要(共 {len(emails)} 封)\n"]
|
||||
|
||||
if important:
|
||||
lines.append(f"⭐ 重点关注(fj@77ircloud.com):{len(important)} 封\n")
|
||||
for i, mail in enumerate(important, 1):
|
||||
lines.append(f" {i}. 📧 {mail['subject']}")
|
||||
lines.append(f" 发件人: {mail['sender']}")
|
||||
lines.append(f" 时间: {mail['date']}")
|
||||
if mail['body'] and mail['body'] != '(无正文)':
|
||||
lines.append(f" 摘要: {mail['body'][:200]}...")
|
||||
lines.append("")
|
||||
|
||||
lines.append(f"\n📋 其他邮件({len(emails) - len(important)} 封):")
|
||||
other = [e for e in emails if e not in important]
|
||||
for i, mail in enumerate(other[:5], 1):
|
||||
lines.append(f" {i}. 📧 {mail['subject']} - {mail['sender']} ({mail['date']})")
|
||||
|
||||
if len(other) > 5:
|
||||
lines.append(f" ... 还有 {len(other) - 5} 封邮件")
|
||||
|
||||
return "\n".join(lines)
|
||||
|
||||
if __name__ == '__main__':
|
||||
print(format_summary())
|
||||
Reference in New Issue
Block a user