You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 23:36:08