通过Interop for Outlook从无法传送的电子邮件中读取预期的收件人

时间:2010-12-08 16:44:49

标签: interop outlook

我创建了一个应用程序,用于循环收件箱中的电子邮件,查找所有无法投递的邮箱已满或延迟的电子邮件并生成报告。

通常的例程是遍历收件箱中的所有电子邮件(直到指定日期)。

如果电子邮件无法投放,请使用正则表达式查找电子邮件。由于此信息包含在Undelivered消息(ReportItem)的正文中,因此95%的时间可以正常工作。

所以,我的问题是我收到了一些电子邮件,这些电子邮件会向报告返回空白的电子邮件,因此几乎无法清除它们,或者很容易报告我们的某个人的电子邮件有问题。

我发现Internet Headers中的信息包含邮件的目的,但是如果可以使用互操作或其他对象来获取此信息,则无法找到任何信息。

如果有其他人遇到过这个问题而且知道一项工作,我将非常感激。

干杯

2 个答案:

答案 0 :(得分:1)

看起来像我想要的不是ReportItem属性的一部分。

可能的选项是扩展IMAPI,CDO或Redemption

http://www.tech-archive.net/Archive/Outlook/microsoft.public.outlook.program_vba/2004-11/0084.html

答案 1 :(得分:1)

我正在寻找一个Outlook邮箱自动化,以移动所有未送达的电子邮件并将未送达邮件的收件人的电子邮件地址存储在列表中,以便以后可以检查Excel中是否存在该列表的条目列,然后将其从Excel中删除。我希望这有帮助 ! 我已经找到了解决此问题的Python解决方案。用于连接到Outlook的python库是win32com,因此首先我们导入所需的所有库:

import win32com.client
import re
import datetime as dt
from tqdm import tqdm
import time
import extract_msg

如果您有以下方法,这是连接到特定Outlook帐户的好方法:

outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")
accounts= win32com.client.Dispatch("Outlook.Application").Session.Accounts

然后创建一个循环访问整个Outlook并到达指定邮件帐户的循环:

for account in accounts:
    inbox = outlook.Folders(account.DeliveryStore.DisplayName)
    if account.DeliveryStore.DisplayName == 'place_your_account_name_here':
            for folder in inbox.Folders:

在Outlook中按文件夹名称查找要检查的文件夹, 因此,如果您要遍历Inbox,请输入“ Inbox”而不是“ Folder_name”

if folder.__str__() == "Folder_name":
    messages = folder.Items                                
    messages.Sort('[ReceivedTime]', True)
    if folder.Folders.Item('Undeliverable'):
        undeliverable = folder.Folders.Item('Undeliverable')

    list_of_undelivered_email_addresses = my_super_function(messages,undeliverable)

到达邮件项目并将不可交付的子文件夹声明为“不可交付”后,我们指定要执行以下功能的时间段:

def my_super_function(messages,undeliverable):

    list_of_undelivered_email_addresses = []

    last_n_days = dt.datetime.now() - dt.timedelta(days = 25)

    messages = messages.Restrict("[ReceivedTime] >= '" +last_n_days.strftime('%m/%d/%Y %H:%M %p')+"'")

    rl= list()

我发现无法交付的电子邮件地址在MSOT流行时间出现某种错误,并且在该错误下方是我发送的电子邮件的原始版本。他们中的大多数人(除了极少数例外,都有一行写着: 收件人:“ Some_email_address”...。 这就是为什么我使用此正则表达式在模式(“ To:”)后读取整行的原因

    pattern = re.compile('To: ".*\n?',re.MULTILINE)

    for counter, message in enumerate(messages):

将电子邮件保存在PC上非常重要,因为否则,一旦您阅读了邮件的正文,电子邮件就会被加密。

 message.SaveAs("undeliverable_emails.msg")
            f = r'specify_the_absolute_path_where_you_want_it_saved'  
            try:
                    msg = extract_msg.Message(f)
                    print(counter)

在已保存的味精正文中搜索关键字“ Undeliverable”:

                    if msg.body.find("undeliverable")!= -1 or msg.body.find("Undeliverable")!= -1 or msg.subject.find("Undeliverable")!= -1 or msg.subject.find("undeliverable")!= -1 or msg.body.find("wasn't found at")!= -1:

将实际的电子邮件保存到列表中,以便稍后将其移至不可交付的子文件夹中

rl.append(message)


                            m = re.search(pattern, msg.body)
                            m = m[0]

                            mail_final = m.split('"')[1]   

                            list_of_undelivered_email_addresses.append(mail_final)
                            list_of_undelivered_email_addresses=list(filter(None, list_of_undelivered_email_addresses))


                    else:
                            print('this email is not an undeliverable one')
            except:
                    pass

将列表中的所有邮件移至undeliverables文件夹:

if len(rl) ==0:
            pass
    else:
            for m in tqdm(rl):
                    m.Move(undeliverable)

    return list_of_undelivered_email_addresses

这是完整的代码:

import win32com.client
import re
import datetime as dt
from tqdm import tqdm #tqdm gives you the progress bar
import time
import extract_msg

outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")
accounts= win32com.client.Dispatch("Outlook.Application").Session.Accounts

def my_super_function(messages,undeliverable):    
        list_of_undelivered_email_addresses = []
        last_n_days = dt.datetime.now() - dt.timedelta(days = 25)
        messages = messages.Restrict("[ReceivedTime] >= '" +last_n_days.strftime('%m/%d/%Y %H:%M %p')+"'")
        rl= list()
        pattern = re.compile('To: ".*\n?',re.MULTILINE)       
        for counter, message in enumerate(messages):
                message.SaveAs("undeliverable_emails.msg")
                f = r'some_absolute_path'  
                try:
                        msg = extract_msg.Message(f)
                        print(counter)
                        if msg.body.find("undeliverable")!= -1 or msg.body.find("Undeliverable")!= -1 or msg.subject.find("Undeliverable")!= -1 or msg.subject.find("undeliverable")!= -1 or msg.body.find("wasn't found at")!= -1:
                                rl.append(message)
                                m = re.search(pattern, msg.body)
                                m = m[0]
                                mail_final = m.split('"')[1]   
                                list_of_undelivered_email_addresses.append(mail_final)
                                list_of_undelivered_email_addresses=list(filter(None, list_of_undelivered_email_addresses))
                        else:
                                print('else')
                except:
                        pass
        if len(rl) ==0:
                pass
        else:
                for m in tqdm(rl):
                        m.Move(undeliverable)
        return list_of_undelivered_email_addresses

for account in accounts:
        inbox = outlook.Folders(account.DeliveryStore.DisplayName)
        if account.DeliveryStore.DisplayName == 'desired_email_address':
                for folder in inbox.Folders:
                        if folder.__str__() == "Inbox":
                                messages = folder.Items                               
                                messages.Sort('[ReceivedTime]', True)
                                if folder.Folders.Item('Undeliverable'):
                                        undeliverable = folder.Folders.Item('Undeliverable')                                      
                                list_of_undelivered_email_addresses = my_super_function(messages,undeliverable)