Python Outlook处理发件人撤回的电子邮件

时间:2018-12-17 08:40:41

标签: python email outlook pywin32 win32com

我目前正在用Python 2.7编写脚本,该脚本在Outlook文件夹中的电子邮件中进行迭代,检索电子邮件发件人并将电子邮件保存到本地计算机上的文件夹中。 但是有一个问题,当发件人撤回电子邮件时,会发生错误并且脚本无法正常工作。这是引起错误的代码:

    if message.Class == 43:
        if message.SenderEmailType == 'EX':
            Sender = message.Sender.GetExchangeUser().PrimarySmtpAddress
        else:
            Sender = message.SenderEmailAddress

和错误:

  

如果message.SenderEmailType =='EX':文件   “ C:\ Python27 \ lib \ site-packages \ win32com \ client \ dynamic.py”,第516行,   在 getattr 中ret =   self。 oleobj .Invoke(retEntry.dispid,0,invoke_type,1)   pywintypes.com_error:(-2147467262,“不支持此类接口”,   无,无)

问题是,我该如何处理发件人撤回电子邮件的对象?我必须跳过它们或将它们移动到其他文件夹,但消息。移动对撤回的电子邮件均无效(相同的错误,不支持这种界面)。

整个代码:

import os
import win32com.client
import itertools
import shutil


OlSaveAsType = {
    "olTXT": 0,
    "olRTF": 1,
    "olTemplate": 2,
    "olMSG": 3,
    "olDoc": 4,
    "olHTML": 5,
    "olVCard": 6,
    "olVCal": 7,
    "olICal": 8
}

outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")
folder = outlook.Folders("MyFolder")
inbox = folder.Folders("Inbox")
Checked = inbox.Folders("Checked")
Sent = inbox.Folders("Sent")


messages = Checked.Items
a = (len(messages))
message = messages.GetFirst()
id = 1


for _ in itertools.repeat(None, a):

    messages = Checked.Items
    message = messages.GetFirst()
    Subject = message.subject

    if message.Class == 43:
        if message.SenderEmailType == 'EX':
            Sender = message.Sender.GetExchangeUser().PrimarySmtpAddress
        else:
            Sender = message.SenderEmailAddress

    message.SaveAs(newpath + '\\' + Sender + " " + str(id) + ".msg", OlSaveAsType['olMSG'])
    id = int(id)
    id += 1
    message.Move(Sent)
    if id == 600:
        break
    message = messages.GetNext()

1 个答案:

答案 0 :(得分:0)

一种容易通过的方法是捕获错误,但有特殊之处。我看到有人明确地使用e.excepinfo [错误值的索引]明确捕获了哪个错误代码,但我无法使它正常工作,但这会更好,但可以捕获所有com_errors。

from pywintypes import com_error
try:
    for item in inboxMsgs:
        print(item)
except com_error:
    print('Bad Email Skipped . . .')
    input('press enter to continue. . . ')

我遇到了同样的问题,只是忽略了收件箱中的不良消息就可以了。