0

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

为什么我认为这是可能的:在 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?如果存在此信息的资源,请告诉我...我无法在“检查标题”的垃圾中找到它。

4

1 回答 1

0

您将不得不使用Outlook 的自动化界面,或者执行 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 中。你想允许这个吗?

于 2013-09-16T04:10:09.540 回答