Python脚本导入EML至Gmail后时间戳显示异常求助
解决Gmail导入EML时显示导入时间而非原始日期的问题
可以调整Gmail中邮件的显示日期为EML的原始时间戳,问题大概率出在internalDate的格式或解析逻辑上,以下是具体解决步骤:
1. 正确解析EML中的原始日期
从EML的Date头字段提取原始时间,这是邮件的真实发送/接收时间。用Python的email模块处理日期解析,兼容绝大多数RFC标准格式:
import email import os from datetime import datetime def get_eml_original_timestamp(eml_path): # 读取EML文件 with open(eml_path, 'rb') as f: msg = email.message_from_bytes(f.read()) # 提取Date头 date_header = msg.get('Date') if not date_header: # 无Date头时 fallback 到文件修改时间 file_mtime = os.path.getmtime(eml_path) return int(file_mtime * 1000) # 解析日期为UTC时间戳(毫秒级) try: dt = email.utils.parsedate_to_datetime(date_header) # 转UTC时间后生成毫秒级时间戳 return int(dt.timestamp() * 1000) except ValueError: # 解析失败时用文件修改时间兜底 file_mtime = os.path.getmtime(eml_path) return int(file_mtime * 1000)
2. 调用Gmail API时正确传入internalDate
使用users.messages.insert接口时,internalDate必须是UTC毫秒级时间戳的字符串形式,而非数字或秒级时间戳:
import base64 from googleapiclient.discovery import build def import_eml_to_gmail(service, user_id, eml_path, label_ids): # 获取原始时间戳 original_ts = get_eml_original_timestamp(eml_path) # 读取并编码EML内容 with open(eml_path, 'rb') as f: eml_raw = base64.urlsafe_b64encode(f.read()).decode('utf-8') # 构造请求体 message_body = { 'raw': eml_raw, 'internalDate': str(original_ts), # 必须是字符串类型的毫秒时间戳 'labelIds': label_ids } # 插入邮件到Gmail response = service.users().messages().insert( userId=user_id, body=message_body ).execute() return response
关键注意事项
internalDate必须是UTC时间的毫秒级时间戳:如果传入本地时间的时间戳,Gmail会自动转换为UTC,导致时间显示偏移。- 避免手动解析日期字符串:
email.utils.parsedate_to_datetime能处理Wed, 15 Nov 2023 14:30:00 +0800这类带时区的格式,无需自己写正则。 - 权限检查:确保你的Gmail API凭据拥有
https://www.googleapis.com/auth/gmail.modify或更高权限,否则无法修改邮件元数据。 - 测试验证:导入后在Gmail中查看邮件详情,确认"Received"日期与EML原始日期一致,同时检查时间线排序是否正常。
内容的提问来源于stack exchange,提问作者x0100
相关产品推荐
相关产品推荐

