我遇到了一个类似的问题
outlook = win32com.client.Dispatch('outlook.application')
accounts = win32com.client.Dispatch("outlook.Application").Session.Accounts
print(accounts[1])
mail = outlook.CreateItem(0)
mail.SentOnBehalfOfName = accounts[1]
mail.SendUsingAccount = accounts[1]
mail.To = to
mail.Subject = 'Subject TEST'
mail.HTMLBody = emailBody
mail.display()
mail.Send()
如果我评论mail.Send()
,显示的窗口将正确显示所有内容,但如果我发送它,我会得到回复This message could not be sent. You do not have the permission to send the message on behalf of the specified user.
,这显然不是真的,因为如果不是直接发送,而是从"发件人"的下拉菜单中选择完全相同的电子邮件,然后单击"发送",它将毫无问题地发送电子邮件。
所以在@Eugene Astafiev和这篇文章的帮助下,我修复了这个问题:
outlook = win32com.client.Dispatch('outlook.application')
for account in outlook.Session.Accounts:
if account.DisplayName == "marhaba@vodafone.om":
print(account)
mail = outlook.CreateItem(0)
mail._oleobj_.Invoke(*(64209, 0, 8, 0, account))
mail.To = to
mail.Subject = 'Vodafone Support'
mail.HTMLBody = emailBody
#mail.display()
mail.Send()
在Outlook:中不需要同时使用这两个属性
mail.SentOnBehalfOfName = accounts[1]
mail.SendUsingAccount = accounts[1]
Outlook UI中可用的"发件人"字段对应于MailItem.SendUsingAccount属性,该属性返回或设置一个Account
对象,该对象表示要发送MailItem
的帐户。当您在Outlook中配置了多个帐户时,此选项可用。
MailItem.SentOnBehalfOfName属性返回一个字符串,而不是Account
实例,其中一个字符串指示邮件的预期发件人的显示名称。请注意,应该允许代表Exchange中的另一个人进行发送。
因此,如果你在Outlook中配置了多个帐户,你可以使用以下代码行:
mail.SendUsingAccount = accounts[1]