您必须使用Outlook's automation interface,或者执行与Outlook相同的操作(大概是通过MAPI或AD),或者对其他API执行相同的操作。在
您可以使用win32com作为这三个选项中的第一个。在
将收件人添加到Outlook的“收件人”列表时,它将获得一个^{}对象,该对象具有一个^{}属性,Outlook将向您显示该对象。在
通过OOM获取Recipient对象的最简单(如果不是最干净的)方法是执行完全相同的操作:创建一个虚拟消息,添加一个收件人,然后查看其属性。项具有^{}对象,该对象有一个Add方法,该方法接受标识符并返回Recipient(当然,还将其添加到项目的收件人)。在
因此,代码应该如下所示(未经测试,因为此处没有连接到Exchange的Windows/Outlook box):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中的电子邮件地址。你允许这样做吗?”在