Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python-使用pywin32从不同地址发送Outlook电子邮件_Python_Email_Outlook 2010_Pywin32_Account - Fatal编程技术网

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

Python-使用pywin32从不同地址发送Outlook电子邮件,python,email,outlook-2010,pywin32,account,Python,Email,Outlook 2010,Pywin32,Account,我有一个工作脚本,可以通过pywin32成功创建和发送Outlook电子邮件,但我想从另一个通用帐户发送电子邮件。如果有帮助,我可以访问此通用帐户(和密码),甚至可以在Outlook中同时打开邮箱 尝试类似于msg.From=”的内容generic@email.com“返回属性错误:无法设置属性“CreateItem.From”。 有没有办法不用SMTP就可以实现这一点?即使只是更改标题以反映作为发件人和回复地址的通用帐户也可以 编辑:使用Win32 32位、Outlook 2010、pytho

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

尝试类似于
msg.From=”的内容generic@email.com“
返回
属性错误:无法设置属性“CreateItem.From”。

有没有办法不用SMTP就可以实现这一点?即使只是更改标题以反映作为发件人和回复地址的通用帐户也可以

编辑:使用Win32 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()

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

您可以使用扩展mapi通过exchange发送邮件。它比您目前尝试的要花费更多的精力,但它非常强大,例如,它允许选择要使用的outlook配置文件。 请查看pywin32安装的站点包\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 = mapi.MAPILogonEx(0, MAPIProfile, None, mapi.MAPI_EXTENDED |
                           mapi.MAPI_LOGON_UI | mapi.MAPI_NEW_SESSION)

我知道这来得很晚,但这是我另一种成功的方法。有了它,我可以用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()

你好@Yann,我编辑了我的原始评论,以包含更多信息和我使用的代码示例。我不确定在循环中使用字符串变量是什么意思;我的问题是,我似乎根本无法更改发件人地址。我将使用内部python电子邮件库。如果你想发送电子邮件,这种方法非常有效。@Jonathan你能详细介绍一下你的建议吗?这篇文章几乎涵盖了这一点:@Jonathan啊,我不能使用SMTP。谢谢你的反馈,@Christian K。我把扩展MAPI弄得有点乱。我甚至可以选择从中发送邮件的配置文件,但最终还是从我的用户配置文件地址发送。我将进一步阅读您链接的信息,以了解我缺少的内容。我还强制在Outlook 2010环境中安装了最后一个CDO。请尝试使用以下标记进行MAPILogonEx调用:mapi.mapi_EXTENDED | mapi.mapi_LOGON_UI,并使用MAPIProfile=none调用SendEMAPIMail谢谢您的说明。然而,一旦我实施了您建议的更改,它将继续从我的个人资料中发送。在做了更多的修改后,我发现了一些问题。如果Outlook已经在运行,它总是从该活动配置文件发送,而不管我编写了哪个配置文件。这是一个好消息,因为在新的配置文件下重新启动Outlook并不是一个巨大的障碍,仍然是可行的,但如果有办法保持我的配置文件打开并从其他地址发送代码,我仍然会感兴趣。你的意见很有帮助!迟到总比不做好你能详细说明一下这段代码在做什么吗?是否需要
for
循环,或者我可以只设置
From
地址的内容吗?这种神奇的事情真的发生在
邮件中吗?\u oleobj\uu.Invoke
?outlook.Session.Accounts基本上会创建一个您在outlook中拥有的每个电子邮件地址的列表。然后,我使用for循环逐个检查它们,以选择我需要的一个。for循环不是必需的。因此,例如,如果您知道要使用的电子邮件始终是第一封电子邮件,则可以直接使用outlook.Session.Accounts[0](因为它是一个列表)。mail._oleobj_uj.Invoke是指发件人实际添加到电子邮件中的时间。您不能只将自己的地址写为字符串而不是From变量。不幸的是,您需要从outlook.Session.Accounts中选择它。因此,简而言之,我的outlook中只有一个gmail地址。我在forloop中逐一检查了它们,并选择了唯一一个是gmail帐户。您只需将“@gmail.com”部分更改为您的任何电子邮件,即可将其作为发件人应用。