使用python提取outlook电子邮件正文和收件人电子邮件地址
我正在尝试提取outlook电子邮件正文、收件人地址、主题和接收日期 我能够提取主题和接收日期,但无法提取正文和收件人地址: 以下是我的主题代码和接收日期:使用python提取outlook电子邮件正文和收件人电子邮件地址,python,email,outlook,win32com,Python,Email,Outlook,Win32com,我正在尝试提取outlook电子邮件正文、收件人地址、主题和接收日期 我能够提取主题和接收日期,但无法提取正文和收件人地址: 以下是我的主题代码和接收日期: outlook = win32com.client.Dispatch('Outlook.Application').GetNamespace('MAPI') namespace = outlook.Session recipient = namespace.CreateRecipient("abc@xyz.com") inbox =
outlook = win32com.client.Dispatch('Outlook.Application').GetNamespace('MAPI')
namespace = outlook.Session
recipient = namespace.CreateRecipient("abc@xyz.com")
inbox = outlook.GetSharedDefaultFolder(recipient, 6)
messages = inbox.Items
email_subject = []
email_date = []
email_date_time = []
for x in messages:
sub = x.Subject
received_date = x.senton.date()
received_date_time = str(x.ReceivedTime)
email_subject.append(sub)
email_date.append(received_date)
email_date_time.append(received_date_time)
对于身体,我正在尝试:
for x in messages:
body = x.Body
print(body)
但这不起作用,我得到以下错误:
Traceback (most recent call last):
File "<ipython-input-85-d79967933b99>", line 2, in <module>
sub = x.Body
File "C:\ProgramData\Anaconda3\lib\site-packages\win32com\client\dynamic.py", line 516, in __getattr__
ret = self._oleobj_.Invoke(retEntry.dispid,0,invoke_type,1)
com_error: (-2147467259, 'Unspecified error', None, None)
回溯(最近一次呼叫最后一次):
文件“”,第2行,在
sub=x.体
文件“C:\ProgramData\Anaconda3\lib\site packages\win32com\client\dynamic.py”,第516行,在\uuu getattr中__
ret=self.\u oleobj\u.Invoke(retEntry.dispid,0,Invoke\u类型,1)
com_错误:(-2147467259,“未指定错误”,无,无)
我刚刚在我的计算机上运行了类似的代码,收件箱中有3000多个混合类型的项目(skype消息通知、日历邀请/通知、电子邮件等),我无法复制此错误,即使是不是m.Body的项目也无法复制此错误
——我认为这可能是罪魁祸首,可能某类没有正文的项目会抛出错误——但情况似乎并非如此:
>>> for m in messages:
... if not m.body:
... print(m.Subject)
... print(m.Body)
...
Accepted: Tables discussion
Message Recall Failure: tables/ new data status
Message Recall Failure: A few issues with the data
您可能应该添加一个print(m.Class)
,因为我仍然认为某些类型的项目可能没有Body
属性
建议可能存在阻止对Outlook进行编程访问的用户/安全设置,因此您可能希望对此进行双重检查(尽管我认为如果不允许,您的所有代码都将无法工作--仍然值得查看!)
我已经找出了这个错误的根源。我们遇到了与comObjectModelGaurd有关的问题。我们的组策略最近更改为不允许对受保护的邮件项对象进行编程访问
修改Outlook用户信任设置或注册表将解决此问题
由于我无法复制错误,也许我仍然可以帮助您调试并确定问题的根源,从中我们可能会找到一个好的解决方案
使用函数获取项目的正文,并使用try/except
识别导致错误的项目
def getBody(m):
s = ""
try:
s = m.Body
except COMError:
s = '\t'.join(('Error!', m.Class, m.senton.date(), m.Subject))
return s
for m in messages:
print(getBody(m))
我想我找到了一个有效的解决方案。对我来说,这是一个权限问题,但我在中对注册表进行了编辑,效果很好
编辑:我认为这是通过取消阻止一些较低级别的权限来实现的,这些权限使外部程序能够访问outlook客户端 被召回的电子邮件将没有正文,因此我们可以通过MessageClass找到并排除该特定类别
for i in messages:
if email.MessageClass != "IPM.Outlook.Recall":
“这不起作用”是什么意思?请包括错误的完整堆栈跟踪,或者如果没有错误,您需要描述实际输出可能与您预期的不同。我收到了此错误:回溯(最近一次调用):文件“”,第2行,在sub=x.Body文件“C:\ProgramData\Anaconda3\lib\site packages\win32com\client\dynamic.py”第516行,在getattr ret=self._oleobj_uj.Invoke(retEntry.dispid,0,Invoke_type,1)中,com_错误:(-2147467259,“未指定错误”,无,无)也应该是
收到的吗?日期=x.SentOn
?我很确定senton.date()
在Outlook对象模型中无效。Python对于初学者来说是区分大小写的,并且没有date
属性或SentOn
属性的方法。此外,您在注释中提供的回溯与您提供的代码的任何部分都不一致。请修改您的问题,使其连贯一致。received\u date=x.senton.date()
…这对我来说非常有效。我也更新了问题。非常感谢你的帮助。我根据您的建议尝试了以下代码:def getBody(m):s=”“try:s=m.Body,除了comer:s='\t'.join('Error!',m.Class,m.senton.date(),m.Subject))在messages:print(getBody(m))
中为m返回s,然后我得到了这个错误-->回溯(最近一次调用):文件“”,第11行,打印中(getBody(m))文件“”,第5行,getBody中除Comeror外:NameError:未定义名称“Comeror”
您可以在尝试此代码后将其更改为Error,而不是Comerordef getBody(m):s=”“尝试:s=m。正文除错误:s='\t'(('Error!',m.Class,m.senton.date(),m.Subject))在消息中为m返回s:print(getBody(m))
我仍然收到一个错误-->>回溯(上次调用):文件“”,第11行,在print(getBody(m))文件“”中,第5行,在getBody中,除了错误:NameError:name'Error'没有定义
@biker007好的,把它切换回异常
,而不是错误
。你明白什么是NameError吗?你应该看看它,还应该看看python中的基本错误处理:)谢谢分享,Rory。请在你的答案中解释解决方案以及为什么它对你有效,而不是仅仅发布链接,因为它们迟早会消亡。