使用Outlook 2016通过Python发送电子邮件而不打开它

时间:2018-06-19 10:46:03

标签: python email outlook pywin32

import win32com.client as win32
outlook = win32.Dispatch('outlook.application')
mail = outlook.CreateItem(0)
mail.To = 'To address'
mail.Subject = 'Message subject'
mail.Body = 'Message body'
mail.HTMLBody = '<h2>HTML Message body</h2>' #this field is optional

# To attach a file to the email (optional):
attachment  = "Path to the attachment"
mail.Attachments.Add(attachment)

mail.Send()

以上代码完全正常。但问题是Outlook需要在系统上打开并登录,然后只发送邮件。

有没有办法使用outlook发送邮件而不在系统上实际运行Outlook应用程序?

2 个答案:

答案 0 :(得分:2)

您需要使用Outlook REST API而不自动执行Outlook。看一下以下示例:

请注意,Microsoft当前不建议也不支持任何无人参与的非交互式客户端应用程序或组件(包括ASP,ASP.NET,DCOM和NT Services)中的Microsoft Office应用程序自动化。在这种环境下运行Office时,可能表现出不稳定的行为和/或死锁。

如果要构建在服务器端上下文中运行的解决方案,则应尝试使用对无人值守执行安全的组件。或者,您应该尝试找到允许至少部分代码在客户端运行的替代方法。如果您从服务器端解决方案中使用Office应用程序,则该应用程序将缺少许多成功运行所需的功能。此外,您将承担整体解决方案稳定性的风险。在Considerations for server-side Automation of Office文章中了解有关此内容的更多信息。

答案 1 :(得分:0)

问题在于消息提交是异步的,并且在发送消息之前退出代码。如果是Exchange,请尝试关闭缓存模式-在线商店将立即发送邮件。否则(缓存的Exchange或PST存储),您需要保留Outlook对象,直到实际提交邮件为止。您需要等待SyncObject.SyncEnd事件触发。可以从SyncObject集合中检索Namespace.SyncObjects(“所有帐户”是该集合中的第一项)。