我需要创建一个Python脚本,根据他们的电子邮件,抓取关于1500个Outlook联系人(20000个)的不同信息。到目前为止,我设法做到了:
def grab_user_details(email):
first_name, last_name, department, location = '', '', '', ''
outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")
gal = outlook.Session.GetGlobalAddressList()
entries = gal.AddressEntries
for i in entries:
user = i.GetExchangeUser()
if user is not None:
if user.PrimarySmtpAddress == email:
first_name = email.split("@")[0].split(".")[0].title()
last_name = email.split("@")[0].split(".")[1].title()
department = user.Department
location = user.OfficeLocation
print(email, first_name, last_name, department, location)
break
最后,代码只是为特定的电子邮件遍历GAL。在找到它之后,它会中断,并继续搜索下一封电子邮件。这种方法对于以A开头的电子邮件来说很快,或者至少是B……但是当你有一个有20000封邮件的女孩时,你不能只等两天就把整个字母表写完。
有更快的方法吗?
谢谢!
使用Namespace
类的createrrecipient方法获取一个基于email地址的receiver类的实例
Sub TestRecipient()
Dim myNamespace As Outlook.NameSpace
Dim myRecipient As Outlook.Recipient
Set myNamespace = Application.GetNamespace("MAPI")
Set myRecipient = myNamespace.CreateRecipient("address@domain.com")
myRecipient.Resolve
If myRecipient.Resolved Then
' do some stuff here
End If
End Sub
收件人。AddressEntry属性返回与解析的收件人对应的AddressEntry
对象。访问AddressEntry
属性强制解析未解析的收件人名称。如果无法解析该名称,则返回错误。如果收件人被解析,则Resolved
属性为True
。
那么你可以使用AddressEntry。GetExchangeUser方法,如果AddressEntry
属于ExchangeAddressList
对象(如全局地址列表(GAL))并且对应于Exchange用户,则返回一个代表AddressEntry
的ExchangeUser对象。
根据@Eugene Astafiev的回答(谢谢!),我想出了以下代码:
def grab_user_details(email):
name, department, location = '', '', ''
outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")
user = outlook.Session.CreateRecipient(email)
user.Resolve()
print(user.Resolved)
try:
name = user.AddressEntry.GetExchangeUser().Name
department = user.AddressEntry.GetExchangeUser().Department
location = user.AddressEntry.GetExchangeUser().OfficeLocation
print(email, name, department, location)
except:
print("user NA")
这个方法比在GAL中搜索要快得多。
还有一件事我需要修复:不幸的是,一些用户有2个电子邮件地址',和。createrrecipient(电子邮件)返回什么,虽然outlook可以找到它。我需要再深入研究一下。