Python - 使用pywin32从不同地址发送Outlook邮件

6 投票
2 回答
13847 浏览
提问于 2025-04-18 09:36

我有一个可以正常工作的脚本,它通过pywin32成功创建并发送Outlook邮件。不过,我想从一个不同的、通用的账户发送邮件。我有这个通用账户的访问权限(还有密码),而且在Outlook中也同时打开了这个邮箱,如果这有帮助的话。

我尝试像这样设置 msg.From = "generic@email.com",结果出现了 AttributeError: Property 'CreateItem.From' can not be set. 的错误。

有没有办法在不使用SMTP的情况下实现这个功能?即使只是更改邮件头,让它显示通用账户作为发件人和回复地址也可以。

补充说明:我使用的是Win7 32位,Outlook 2010,python 2.7,以及pywin32模块来创建以下代码:

from win32com.client import Dispatch
mailer = Dispatch("Outlook.Application")
msg = mailer.CreateItem(0)
msg.To = emailTo
msg.CC = emailCC
msg.Subject = emailSubject
msg.Body = emailBody
msg.Send()

这部分代码运行得很好,但它是通过当前登录的用户(也就是我)发送邮件的。我更希望从一个通用账户发送,这样看起来更正式,而且回复也能直接收到在那个邮箱里,而不是我的邮箱。

2 个回答

4

我知道这个回答来得有点晚,但这是我找到的另一种方法,可以让这个功能正常工作。通过这个方法,我能够用我在Outlook中非默认的邮箱地址发送邮件:

import win32com.client as win32

outlook = win32.Dispatch('outlook.application') 

mail = outlook.CreateItem(0)
mail.Subject = "Test subject"
mail.To = "yourrecipient@gmail.com"

# If you want to set which address the e-mail is sent from. 
# The e-mail needs to be part of your outlook account.
From = None
for myEmailAddress in outlook.Session.Accounts:
    if "@gmail.com" in str(myEmailAddress):
        From = myEmailAddress
        break

if From != None:
    # This line basically calls the "mail.SendUsingAccount = xyz@email.com" outlook VBA command
    mail._oleobj_.Invoke(*(64209, 0, 8, 0, From))

    mail.Send()
3

你可以通过扩展的MAPI来发送邮件,这比你之前尝试的方法稍微复杂一些,但功能非常强大,比如它可以让你选择要使用的Outlook配置文件。你可以查看你安装的pywin32中的site-packages\win32comext\mapi\demos\mapisend.py文件。

编辑:

正如评论中提到的,试试下面的方法,确保Outlook使用的是你想要的配置文件。找到这一行:

session = mapi.MAPILogonEx(0, MAPIProfile, None, mapi.MAPI_EXTENDED |
                           mapi.MAPI_USE_DEFAULT)

然后把它改成

session = mapi.MAPILogonEx(0, MAPIProfile, None, mapi.MAPI_EXTENDED |
                           mapi.MAPI_LOGON_UI)

像这样调用SendEMAPIMail:

SendEMAPIMail(SendSubject, SendMessage, SendTo, MAPIProfile=None)

会弹出一个对话框,让你选择Outlook配置文件。

编辑:

正如@caseodilla发现的,如果Outlook正在使用另一个配置文件,MAPILogonEx似乎会重用正在运行的会话和它的配置文件。为了强制MAPI使用另一个配置文件,可以添加MAPI_NEW_SESSION标志:

session = mapi.MAPILogonEx(0, MAPIProfile, None, mapi.MAPI_EXTENDED |
                           mapi.MAPI_LOGON_UI | mapi.MAPI_NEW_SESSION)

撰写回答