使用python

时间:2018-08-01 13:28:41

标签: python email outlook win32com

我正在尝试提取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)

3 个答案:

答案 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":