您必须使用Outlook's automation interface,或者执行与Outlook相同的操作(可能通过MAPI或AD),或使用其他API执行等效操作。
您可以使用win32com作为三者中的第一个。
当您将收件人添加到Outlook中的“收件人”列表时,它会获得一个Recipient对象,该对象具有AutoResponse属性,Outlook将向您显示该属性。
通过OOM获取Recipient对象的最简单(如果可能不是最干净的)方法是做同样的事情:创建虚拟消息,添加收件人,然后查看其属性。项目具有Recipients个对象,这些对象具有Add方法,该方法采用标识符并返回Recipient(当然,将其添加到项目的收件人)。
所以,代码看起来应该是这样的(未经测试,因为我没有在这里连接到Exchange的Windows / Outlook框):
session = win32com.client.Dispatch("Mapi.Session")
session.Logon(MY_PROFILE)
outlook = win32com.client.Dispatch("Outlook.Application")
message = outlook.CreateItem(0) # olMailItem
autoresponses = {}
for name in names:
recipient = message.Recipients.Add(name)
autoresponses[name] = recipient.AutoResponse
你当然可以将它组合成单行词典理解,但我认为这可能更清楚。此外,您可能希望丢弃该邮件,以便Outlook最终不会将剩余垃圾粘贴在草稿或其他内容中,并且您可能需要一些错误处理,并且您可能需要为每个收件人使用单独的邮件以使其更容易从错误中恢复并继续前进......等等......但是,这与MSDN和win32com文档一起应该足以让你前进。
当然,这仅在name解析为服务器邮箱时有效;如果您提供仅限本地的名称或地址,或仅提供外部地址,您只需提供本地地址簿条目或裸电子邮件条目,两者都没有AutoResponse。但这与Outlook完全相同,所以可能是预期的。
另请注意,第一次脚本执行任何尝试访问通讯簿的操作时,除非用户故意关闭默认安全功能,否则会弹出“程序正在尝试访问电子邮件地址”你已经存储在Outlook中。你想允许这个吗?“