使用 Python 从 Outlook 发送电子邮件不起作用

Posted

技术标签:

【中文标题】使用 Python 从 Outlook 发送电子邮件不起作用【英文标题】:Sending emails from outlook with Python not working 【发布时间】:2019-10-07 10:17:25 【问题描述】:

我一直在运行一些代码,它使用 win32com.client 自动处理一些电子邮件。一切都已经工作了几个月,但今天我遇到了一个错误。

import win32com.client

olMailItem = 0
obj = win32com.client.Dispatch("Outlook.Application")
newMail = obj.CreateItem(olMailItem)

今天我收到错误AttributeError: module 'win32com.gen_py.00062FFF-0000-0000-C000-000000000046x0x9x6' has no attribute 'CLSIDToPackageMap'

如果我尝试“Excel.Application”或“Word.Application”,则不会出现错误,并且 Outlook 已安装并在我的系统上运行。上周我遇到了 mail.Bcc 和 mail.htmlbody 分别更改为 mail.BCC 和 mail.HTMLBody 的问题,但我没有发现更改字符串有帮助。

任何人都可以阐明可能发生的事情吗?

提前致谢。

【问题讨论】:

【参考方案1】:

您可能需要删除一些旧文件:

# If errors are found, do this
# clear contents of C:\Users\<username>\AppData\Local\Temp\gen_py
# that should fix it, to test it type
import win32com.client
app = win32com.client.gencache.EnsureDispatch("Outlook.Application")
app.Visible = True

This gist 也有其他自动删除文件的解决方案。应用需要调整。

1.)

from pathlib import Path
 try:
        xl = win32.gencache.EnsureDispatch('Excel.Application')
    except AttributeError:
        f_loc = r'C:\Users\<username>\AppData\Local\Temp\gen_py'
        for f in Path(f_loc):
            Path.unlink(f)
        Path.rmdir(f_loc)
        xl = win32.gencache.EnsureDispatch('Excel.Application')

2.)

try:
    xl = client.gencache.EnsureDispatch('Excel.Application')
except AttributeError:
    # Corner case dependencies.
    import os
    import re
    import sys
    import shutil
    # Remove cache and try again.
    MODULE_LIST = [m.__name__ for m in sys.modules.values()]
    for module in MODULE_LIST:
        if re.match(r'win32com\.gen_py\..+', module):
            del sys.modules[module]
    shutil.rmtree(os.path.join(os.environ.get('LOCALAPPDATA'), 'Temp', 'gen_py'))
    from win32com import client
    xl = client.gencache.EnsureDispatch('Excel.Application')

【讨论】:

感谢您的回复。不幸的是,这给了我同样的错误。进一步研究它似乎与 win32com 库中的函数有关:GetGeneratedFileName。它将 Outlook.Application 转换为另一个用于标识该程序的字符串。如果我将此代码更改为返回“Outlook.Application”而不是“00062FFF-0000-0000-C000-000000000046x0x9x6”,它似乎可以工作,但我不知道这可能会产生什么影响。

以上是关于使用 Python 从 Outlook 发送电子邮件不起作用的主要内容,如果未能解决你的问题,请参考以下文章

对于从 java 程序发送的电子邮件,html 内容中的 png 图像未显示在 gmail 客户端上

从 python 脚本发送时,Outlook 中的电子邮件附件名称始终为“AT00001.xlsx”而不是实际名称

通过 Python 发送 Outlook 电子邮件?

使用 Python 发送 Outlook 电子邮件的方法的差异

使用不同的 Outlook 电子邮件地址从 Access 发送电子邮件

在 html 中嵌入图像以自动发送 Outlook365 电子邮件