【问题标题】:Python - Sending Outlook email from different address using pywin32Python - 使用 pywin32 从不同地址发送 Outlook 电子邮件
【发布时间】:2014-08-03 05:48:13
【问题描述】:

我有一个工作脚本,可以通过 pywin32 成功创建和发送 Outlook 电子邮件,但我想从不同的通用帐户发送电子邮件。我可以访问这个通用帐户(和密码),甚至可以在 Outlook 中同时打开邮箱,如果有帮助的话。

尝试类似msg.From = "generic@email.com" 的方法会返回AttributeError: Property 'CreateItem.From' can not be set.

有什么方法可以在不使用 SMTP 的情况下完成此任务?即使只是更改标题以反映通用帐户作为 From 和 Reply-To 地址也可以。

编辑:使用 Win7 32bit、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()

这部分工作得很好,但它通过我自己登录的用户发送电子邮件。我宁愿从一个通用帐户发送它,这样它看起来更正式,并且在那里而不是在我的邮箱中收到回复。

【问题讨论】:

  • 嗨@Yann,我编辑了我的原始评论以包含更多信息和我使用的代码示例。我不确定您在循环中使用字符串变量的建议是什么;我的问题是我似乎根本无法更改发件人地址。
  • 我会改用内部 python 电子邮件库。如果您想发送电子邮件,这非常有效。
  • @Jonathan 你能扩展你的建议吗?
  • @Jonathan 啊,我不能使用 SMTP。

标签: python email outlook-2010 pywin32 account


【解决方案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()

【讨论】:

  • 迟到总比不到好!你能详细说明这段代码在做什么吗? for 循环是必要的,还是我可以设置我想要的 From 地址?魔法真的只是发生在mail._oleobj_.Invoke吗?
  • outlook.Session.Accounts 基本上会创建一个您在 Outlook 中拥有的每个电子邮件地址的列表。然后我使用 for 循环一一浏览它们以选择我需要的一个。 for 循环不是必需的。因此,例如,如果您知道要使用的电子邮件始终是第一个您可以使用 Outlook.Session.Accounts[0] 的电子邮件(因为它是一个列表)。 mail._oleobj_.Invoke 是发件人实际被添加到电子邮件中的时间。不幸的是,您不能将自己的地址写为字符串而不是 From 变量,您需要从 outlook.Session.Accounts 中选择它。
  • 简而言之,我的 Outlook 中只有一个 gmail 地址。我在forloop中检查了他们的每一个,并选择了唯一一个gmail帐户。您可以继续将“@gmail.com”部分更改为您的任何电子邮件以将其应用为发件人。
【解决方案2】:

您可以使用扩展的 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)

【讨论】:

  • 感谢您的反馈,@Christian K。
  • 我对扩展的 MAPI 有点搞砸了。我什至可以选择发送邮件的配置文件,但它仍然最终从我的用户配置文件地址发送。我会进一步阅读您链接的信息,看看我缺少什么。
  • 我还强制将最后一个 CDO 安装到我的 Outlook 2010 环境中。
  • 为 MAPILogonEx 调用尝试这些标志:mapi.MAPI_EXTENDED | mapi.MAPI_LOGON_UI 并使用 MAPIProfile=None 调用 SendEMAPIMail
  • 感谢您的澄清。但是,一旦我实施了您建议的更改,它就会继续从我的个人资料中发送。稍微折腾了一下之后,我想出了一些东西。如果 Outlook 已在运行,它总是从该活动配置文件发送,无论我编写了哪个配置文件。这是个好消息,因为在新配置文件下重新启动 Outlook 并不是一个巨大的障碍并且仍然可行,但如果有办法保持 my 配置文件处于打开状态并从不同的地址。您的意见非常有帮助!
猜你喜欢
  • 2016-05-22
  • 2018-07-10
  • 2014-10-16
  • 2014-02-14
  • 2012-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多