我正在尝试提取Outlook电子邮件正文,收件人地址,主题和接收日期。
我能够提取主题和接收日期,但无法提取正文和收件人地址:
以下是我的主题和接收日期代码:
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)
答案 0 :(得分:1)
我认为我找到了可行的解决方案。对我来说,这是一个权限问题,但是我在https://www.slipstick.com/developer/change-programmatic-access-options/中进行了注册表编辑,这确实很有效。
编辑:我认为这是通过解除阻止使外部程序能够访问Outlook客户端的一些较低级别的权限而起作用的。
答案 1 :(得分:0)
我刚刚在计算机上的收件箱中运行了类似的代码,其中包含3,000多种混合类型的项目(Skype消息通知,日历邀请/通知,电子邮件等),即使在某些情况下,我也无法复制此错误not 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
属性。
This thread建议可能存在一个阻止用户以编程方式访问Outlook的用户/安全设置,因此您可能需要仔细检查(尽管我认为如果不允许,则所有代码都无法正常工作- -仍然值得一看!)。
我已找出此错误的根源。 comObjectModelGaurd遇到了问题。我们最近将组策略更改为禁止以编程方式访问受保护的mailItem对象。
修改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))
答案 2 :(得分:0)
被召回的电子邮件将没有正文,因此我们可以通过MessageClass来发现它,并排除该特定的类
for i in messages:
if email.MessageClass != "IPM.Outlook.Recall":