在发送消息之前使用python检测outlook自动应答器

时间:2013-09-16 01:26:47

标签: python outlook win32com exchange-server-2010

我找到了很多关于检查电子邮件中标题的资源,以检测邮件是否是使用自动回复程序发送的。我希望在进行任何联系之前检测到自动应答器已配置。

为什么我认为这是可能的:在Outlook中,如果您从地址簿添加收件人,它会在点击发送之前在“收件人:”行上方显示他们的自动回复邮件。

目标:我想将一份员工列表传递给一个函数,并根据自动回复开/关状态返回一个二进制列表,列出他们是否在办公室。

一些糟糕的伪代码(请原谅类和列表的混合,这只是一个简单的例子)。

list = ['Ted Jones', 'Michael Brickman', 'This name', 'That name']

for employee in list:
    if employee.autoresponse != '':
        employee.inoffice = 0

output = [0,1,1,1] #-- So, Ted Jones is out of the office

我当然不会坚持这种输出方式,只是试图具体。我需要一些有序的列表或其他东西来绑名称 - >在/不在办公室

如果可能的话,我想留在Python中,但我很想听听其他解决方案。

有没有这样做?也许使用win32com或pyad?如果存在此信息的资源,请告诉我...我无法在“检查标题”中找到它。

1 个答案:

答案 0 :(得分:0)

您必须使用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中。你想允许这个吗?“