【问题标题】:How to send and read mails from outlook through python via threads?如何通过线程通过python从outlook发送和读取邮件?
【发布时间】:2023-02-24 17:36:05
【问题描述】:

我正在尝试通过线程使用 python 通过 outlook 阅读和发送邮件。我正在尝试使用win32com.client随着pythoncom.

outlook         = win32.Dispatch("Outlook.Application")
mapi            = outlook.GetNamespace("MAPI")
inbox           = mapi.GetDefaultFolder(6)
messages        = inbox.Items
messages        = messages.Restrict("[ReceivedTime] >= '"+maintenance_date+"'")
.....
.....
.....
for message in messages:
    mail = message.ReplyAll()
    mail.To = mail.To
    mail.CC = mail.CC
    mail.Body = f"This is a reply!\nRegards\n{mail.Body}"
    mail.Save()
    mail.Send()

我似乎不明白如何在线程环境中执行此操作,因为有很多这样的回复。

我期望在线程环境中执行此操作,以便我可以更有效地使用资源。

【问题讨论】:

    标签: python-3.x outlook python-multithreading win32com office-automation


    【解决方案1】:

    Outlook 使用单线程单元模型,不支持从多线程调用属性和方法。当检测到此类情况时,最新的 Outlook 版本会引发异常。

    如果您需要使用多线程,您的选择是 Outlook 基于的低级 API - 允许运行多线程的扩展 MAPI。或者只考虑使用围绕该 API 的任何第三方包装器,例如可以处理多线程的 Redemption。

    我还注意到以下代码段,其中在回复中设置了 To、Cc 属性:

    for message in messages:
        mail = message.ReplyAll()
        mail.To = mail.To
        mail.CC = mail.CC
        mail.Body = f"This is a reply!
    Regards
    {mail.Body}"
        mail.Save()
        mail.Send()
    

    以下代码行没有任何意义:

    mail.To = mail.To
    mail.CC = mail.CC
    

    当您调用 ReplyAll 方法时,收件人会自动设置。只需尝试单击 Outlook 功能区上的相应按钮,您将立即获得包含所有收件人相关属性的回复集。

    【讨论】:

      最近更新 更多