监控通过 Python win32.Dispatch('Outlook.Application') 发送的电子邮件?

Monitor E-mail sent via Python win32.Dispatch('Outlook.Application')?

我在解决以下问题时遇到了一些麻烦,我创建了一个通过 Outlook 发送电子邮件的函数,使用 win32 包,导致 smtblib 在我工作的地方被阻止。该函数本身就像一个魅力:

def sendEmail(emailTo, emailCC, emailSubject, emailAttach, emailBody):
    for item in psutil.pids():
        if psutil.pid_exists(item):
            p = psutil.Process(item)
            if p.name() == 'OUTLOOK.EXE':
                os.system('taskkill /f /im OUTLOOK.EXE')
                break
            
    outlook = win32.Dispatch('outlook.application')
    mail = outlook.CreateItem(0)
    mail.Subject = emailSubject
    mail.To = emailTo
    mail.CC = emailCC
    #mail.Body = emailBody
    mail.HTMLBody = emailBody
    if not emailAttach:
        print('No Attachements...\n')
    else:
        print('Attaching files...\n')
        for i in range(0, len(emailAttach)):
            mail.Attachments.Add(emailAttach[i])
    mail.Send()
    time.sleep(30)

这里的问题是,有时我们需要在一个 for 循环中向不同的人发送多封不同的电子邮件,但是由于代码比创建电子邮件更快,有时它会失败,我想知道是否有这是我监控电子邮件是否完成的一种方式,据我所知,在创建和发送电子邮件时,它会在任务栏上打开带有齿轮的 outlook。这里的要点是我是否有办法监控电子邮件何时创建并确实发送给我以继续下一个项目。

我强迫等待 30 秒睡眠,但我确信有更好、更 pythonic 的方法来做到这一点。

电子邮件提交本质上是异步的。即使邮件已通过 Outlook 成功发送,目标邮箱也可能不再存在并且您会收到 NDR,有时会在数小时后收到。

如果 MailItem.Send 没有出错,这是你能做的最好的。

为确保电子邮件已处理并发送出去,您可以处理 Items class 的 ItemAdd 事件,当一个或多个项目添加到指定集合。默认情况下,Outlook 将已发送项目的副本放入 Sent Items 文件夹。 MailItem.SaveSentMessageFolder 属性 指定一个 Folder 对象,该对象表示发送后将保存电子邮件副本的文件夹。所以,你可以看看消息是什么时候发出的。

从外部应用程序使用发送方法的另一个方面是安全性。如果 Outlook 对象模型引发安全问题,您可能会在 Send 行中收到错误。例如,在 Microsoft Outlook 2019、Outlook for Office 365、Outlook 2016 和 Outlook 2013 中,当您从 Microsoft Excel 等其他程序发送电子邮件时,您会收到以下警告消息:

A program is trying to send an e-mail message on your behalf. If this is unexpected, click Deny and verify your antivirus software is up-to-date.

但也有机会在运行时在 Send 行上获得异常。很可能是这样!

A program is trying to send an e-mail message on your behalf warning in Outlook 文章中阅读更多相关信息。