Python如何发送带Outlook跟进标记及定时提醒的邮件
问题描述
通过Python脚本基于MIMEMultipart对象实现邮件发送时,基础发送功能运行正常,但需要为邮件添加带闹钟铃铛图标的「跟进」标记并设置指定提醒时间。当前配置的Reply-By字段无法为收件人生成对应提醒,目标效果和用户在Outlook中手动添加跟进标记、勾选「提醒」选项的效果完全一致:收件人查看邮件时能看到闹钟铃铛图标,且在指定时间会收到提醒。
当前实现代码
# 配置发件人、收件人、抄送、邮件主题、高优先级等基础信息 msg = MIMEMultipart() msg['From'] = email_user msg['To'] = ", ".join(email_recipients) msg['Cc'] = ", ".join(cc_recipients) msg['Subject'] = '''UPDATE OF PAYMENT SCHEDULE FOR ''' + next_month_name.upper() + ''' ''' + next_month_year msg['X-Priority'] = '2' msg['X-Message-Flag'] = 'Follow up' msg['Reply-By'] = '16/06/2022 09:00:00' msg.attach(MIMEText(email_body, 'html')) # 发送邮件逻辑 server = smtplib.SMTP('smtp.office365.com', 587) server.ehlo() server.starttls() server.ehlo() server.login(email_user, email_pass) server.send_message(msg) server.quit()
问题原因
之前配置的X-Message-Flag、Reply-By属于通用邮件头,Outlook不会通过这两个字段识别跟进标记和提醒规则:
X-Message-Flag仅会给邮件加普通分类标记,不会触发铃铛图标和提醒- 写入的
Reply-By时间格式不符合邮件标准时间规范,Outlook无法解析,且该字段本身仅用于标识要求回复的截止时间,和Outlook的跟进提醒功能没有关联。
Outlook的带提醒跟进标记是Exchange/Outlook专属功能,需要配置对应的专属扩展邮件头才能生效。
修复方案
- 删除无效的
X-Message-Flag和格式错误的Reply-By头 - 添加Outlook可识别的专属扩展头,明确标记跟进状态、开启提醒、设置正确格式的UTC提醒时间
- 所有时间必须使用标准RFC格式的UTC时间,不要使用自定义的
日/月/年 时:分:秒格式
修改后可直接使用的代码示例
from email.utils import formatdate from datetime import datetime, timezone from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText import smtplib msg = MIMEMultipart() msg['From'] = email_user msg['To'] = ", ".join(email_recipients) msg['Cc'] = ", ".join(cc_recipients) msg['Subject'] = '''UPDATE OF PAYMENT SCHEDULE FOR ''' + next_month_name.upper() + ''' ''' + next_month_year msg['X-Priority'] = '2' # 配置Outlook跟进提醒相关头 # 1. 设置跟进标记请求 msg['X-Flag-Request'] = 'Follow up' # 2. 标记跟进状态为待处理 msg['X-Message-Flag-Status'] = '2' # 3. 开启提醒(对应Outlook里的「提醒」勾选框) msg['X-Reminder-Set'] = '1' # 4. 设置提醒时间:注意要转成UTC时间,示例为2022年6月16日UTC 1点(对应北京时间9点) # 如果用本地时间计算,记得先转UTC再生成标准格式时间串 remind_utc_time = datetime(2022, 6, 16, 1, 0, 0, tzinfo=timezone.utc) msg['X-Reminder-Due'] = formatdate(remind_utc_time.timestamp(), localtime=False, usegmt=True) # 可选:如果需要同时设置Reply-By,用标准格式写入 msg['Reply-By'] = formatdate(remind_utc_time.timestamp(), localtime=False, usegmt=True) msg.attach(MIMEText(email_body, 'html')) # 发送逻辑和原有逻辑一致 server = smtplib.SMTP('smtp.office365.com', 587) server.ehlo() server.starttls() server.ehlo() server.login(email_user, email_pass) server.send_message(msg) server.quit()
注意事项
- 上述专属头仅对Outlook客户端、Office365网页版邮箱生效,其他第三方邮箱客户端(Gmail、QQ邮箱、网易邮箱等)无法识别跟进铃铛和提醒逻辑
- 提醒时间一定要转成UTC时区后再写入,否则会出现提醒时间和预期不符的问题
- 不要使用自定义时间格式,必须通过
email.utils.formatdate生成符合RFC2822规范的时间串,避免Outlook解析失败
内容的提问来源于stack exchange,提问作者TMY
相关产品推荐
相关产品推荐

