【问题标题】:Send email through Python using Outlook 2016 without opening it使用 Outlook 2016 通过 Python 发送电子邮件而不打开它
【发布时间】:2018-11-28 07:20:29
【问题描述】:
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 应用程序?

【问题讨论】:

  • 这很好用。此外,如果您对允许脚本在没有提示的情况下发送大量电子邮件有点谨慎,您可以将mail.Send() 替换为mail.Display()。这将创建电子邮件,您可以手动查看并单击发送。

标签: python email outlook pywin32


【解决方案1】:

您需要使用 Outlook REST API 而不自动化 Outlook。请看以下示例:

请注意,Microsoft 目前不推荐也不支持任何无人值守、非交互式客户端应用程序或组件(包括 ASP、ASP.NET、DCOM 和 NT 服务)的 Microsoft Office 应用程序自动化,因为 Office在此环境中运行 Office 时可能会出现不稳定的行为和/或死锁。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2011-09-14
      • 2016-12-01
      • 1970-01-01
      • 2012-07-05
      • 1970-01-01
      • 1970-01-01
      • 2015-11-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多