使用Python实现Outlook多邮件Titus分类自动选择的方案咨询
Python自动化设置新版Titus邮件分类实现方法
旧代码失效的核心原因是2020及之后版本的Titus for Outlook插件,不再读取UserProperties下的outlook.comClassification字段触发分类校验,直接写入该自定义字段不会被插件识别,发送时会被拦截或者弹出分类缺失提示。
下面是两种可落地的实现方案,支持批量邮件发送场景:
方案1:直接写入MAPI属性(稳定性最高,无界面干扰)
新版Titus将分类标识存储在邮件底层MAPI命名属性中,通过Outlook的PropertyAccessor接口直接写入对应属性即可被插件识别,全程不需要弹出邮件窗口,适合批量发信场景。
注意:不同企业部署Titus时可能自定义分类枚举值和属性命名,如果默认参数不生效,可以手动给一封草稿邮件打上目标分类,用MFCMAPI工具查看该草稿的字符串命名属性,找到Titus相关的属性名和存储值替换即可。
可直接运行的参考代码:
import win32com.client import time # 基础常量 olMailItem = 0x0 # 默认部署环境下Titus分类的MAPI属性地址 TITUS_CLASS_PROP = "http://schemas.microsoft.com/mapi/string/{893E83A7-2EDC-4F8F-B14C-D18B0763D02A}/TitusClassification" # 替换为你需要设置的分类值,常见枚举:Public/Internal/Confidential/Restricted TARGET_CLASS = "Internal" def send_titus_classified_mail(recipient, subject, body): outlook_app = win32com.client.Dispatch("Outlook.Application") mail = outlook_app.CreateItem(olMailItem) mail.To = recipient mail.Subject = subject mail.Body = body # 写入分类属性 prop_accessor = mail.PropertyAccessor prop_accessor.SetProperty(TITUS_CLASS_PROP, TARGET_CLASS) # 保存邮件触发Titus插件校验分类标记,避免发送拦截 mail.Save() mail.Send() # 批量发信示例 if __name__ == "__main__": mail_task_list = [ ("user01@company.com", "月度工作汇报", "请查收本月工作汇报内容"), ("user02@company.com", "项目进度同步", "本周项目进度同步如下:") ] for to, sub, content in mail_task_list: send_titus_classified_mail(to, sub, content) # 加间隔避免触发频率限制 time.sleep(1)
方案2:UI自动化兜底(适配高度定制化部署场景)
如果你们公司的Titus插件做过二次开发,MAPI属性写入逻辑不生效,可以用pywinauto做界面操作兜底:创建邮件后先调用Display()呼出窗口,自动定位Titus分类控件选择目标分类、点击确认后再发送。
核心参考逻辑:
import win32com.client from pywinauto import Application import time olMailItem = 0x0 outlook_app = win32com.client.Dispatch("Outlook.Application") mail = outlook_app.CreateItem(olMailItem) # 填充邮件内容逻辑和上述方案一致 mail.To = "user@company.com" mail.Subject = "测试邮件" mail.Body = "测试正文" # 呼出邮件窗口 mail.Display() time.sleep(1.5) # 连接邮件窗口,backend选uia兼容新版Outlook和Titus插件 app = Application(backend="uia").connect(title_re=".* - 邮件", timeout=10) mail_win = app.top_window() # 定位Titus分类下拉框选择对应分类,控件名称需要根据你本地实际插件界面调整 class_combo = mail_win.descendants(title="信息分类", control_type="ComboBox")[0] class_combo.select("Internal") # 点击分类确认按钮 mail_win.descendants(title="确定", control_type="Button")[0].click() time.sleep(0.5) mail.Send()
注意事项
- 用UI自动化方案时,脚本运行过程中不要手动操作鼠标键盘、不要切换窗口焦点,否则会导致控件定位失败。
- 批量发信时建议单封邮件发送间隔设置为1~2秒,避免触发Titus反自动化拦截或者邮件服务器的发信频率限制。
内容的提问来源于stack exchange,提问作者sloth143chunk
相关产品推荐
相关产品推荐

