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

时间:2014-06-12 19:17:04

标签: python email outlook-2010 pywin32 account

我有一个可以通过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 个答案:

答案 0 :(得分:1)

您可以使用扩展的mapi通过交换发送邮件。它比你到目前为止所做的努力需要更多的努力,但它非常强大,例如它允许选择要使用的外观配置文件。 看看你的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)

答案 1 :(得分:1)

我知道来晚了,但这是我设法完成这项工作的另一种方式。这样,我就可以使用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()