Python 调用 Outlook 发送邮件

微软提供基于 COM 接口的编程 。通过可以方便地调用各组件 。如果下载和安装有困难,可以到的镜像网摘查找合适的版本 。
单一账号
import win32com.client as win32def send_mail():outlook = win32.Dispatch('Outlook.Application')mail_item = outlook.CreateItem(0) # 0: olMailItemmail_item.Recipients.Add('someone@qq.com')mail_item.Subject = 'Mail Test'mail_item.BodyFormat = 2# 2: Html formatmail_item.HTMLBody= '''Hello, This is a test mail.Hello Guys. '''mail_item.Send()if __name__ == '__main__':send_mail()
多账号发送邮件
如果有多个账号,需要选择账号发送邮件,需要在代码中对账号进行判断,代码如下:
【Python 调用 Outlook 发送邮件】def send_mail():outlook_app = win32.Dispatch('Outlook.Application')# choose sender accountsend_account = Nonefor account in outlook_app.Session.Accounts:if account.DisplayName == 'sender@hotmail.com':send_account = accountbreakmail_item = outlook_app.CreateItem(0)# 0: olMailItem# mail_item.SendUsingAccount = send_account not working# the following statement performs the function insteadmail_item._oleobj_.Invoke(*(64209, 0, 8, 0, send_account))mail_item.Recipients.Add('receipient@qq.com')mail_item.Subject = 'Test sending using particular account'mail_item.BodyFormat = 2# 2: Html formatmail_item.HTMLBody = '''Hello, This is a test mail.Hello Guys. '''mail_item.Send()if __name__ == '__main__':send_mail()
这里有点黑魔法,直接设置 . 不会起作用,返回值是 None, 永远从第一个邮箱账号发送邮件,我使用的是365 版 。需要调用 .() 方法 。后面列出了参考链接 。
本质上,这种方法是调用 COM 组件,可以查询微软的开发帮助了解相关对象的属性和方法,比如我想知道的细节,就特意参考了下面这篇帮助:。COM 编程与语言无关 。另外可以在中 ALT + F11,进入 VBE 环境,然后 F2 进入对象浏览器界面查看比如下面的界面显示了的属性和方法:
关于调试
作为动态语言,通过 Debug 获取 COM 对象信息并不是很方便,比如下面代码:
import win32com.client as win32def print_outlook_accounts():outlook_app = win32.Dispatch('Outlook.Application')for account in outlook_app.Session.Accounts:print (account.DeliveryStore.DisplayName)if __name__ == '__main__':send_mail()
设置断点的调试界面:
我们只知道是一个 COM , 包含的信息很多都是的 。碰到这种情况,我一般用 C# 或者 VBA 编写代码进行调试 。如果我需要详细了解的属性和方法,在的任何组件中,比如 Excel,写一段下面的代码:
Public Sub Print_Outlook_Accounts()' 工具 -> 引用:添加 Microsoft Outook Object Library 引用Dim outlookApp As New Outlook.ApplicationDim accounts As Outlook.accountsSet accounts = outlookApp.Session.accountsDim account As Outlook.accountFor Each account In accountsDebug.Print account.DisplayNameNextEnd Sub
显示出监视窗口,设置断点,获取信息:

Python 调用 Outlook 发送邮件

文章插图
在监视窗口添加变量 :
展开:
Item 1 和 Item 2 表示有两个账号,现在我们想看到 Item 2 的账号信息,将 Item 2 展开:
属性也包含的信息,可以展开查看 。
参考