微软 Office 提供基于 COM 接口的编程。Python 通过 pywin32 可以方便地调用各组件。如果下载和安装 pywin32 有困难,可以到 Sourceforge 的镜像网摘查找合适的版本。
单一账号
import win32com.client as win32 def send_mail(): outlook = win32.Dispatch('Outlook.Application') mail_item = outlook.CreateItem(0) # 0: olMailItem mail_item.Recipients.Add('someone@qq.com') mail_item.Subject = 'Mail Test' mail_item.BodyFormat = 2 # 2: Html format mail_item.HTMLBody = ''' <H2>Hello, This is a test mail.</H2> Hello Guys. ''' mail_item.Send() if __name__ == '__main__': send_mail()
多账号发送邮件
如果 Outlook 有多个账号,需要选择账号发送邮件,需要在代码中对账号进行判断,代码如下:
def send_mail(): outlook_app = win32.Dispatch('Outlook.Application') # choose sender account send_account = None for account in outlook_app.Session.Accounts: if account.DisplayName == 'sender@hotmail.com': send_account = account break mail_item = outlook_app.CreateItem(0) # 0: olMailItem # mail_item.SendUsingAccount = send_account not working # the following statement performs the function instead mail_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 format mail_item.HTMLBody = ''' <H2>Hello, This is a test mail.</H2> Hello Guys. ''' mail_item.Send() if __name__ == '__main__': send_mail()
这里有点黑魔法,直接设置 mail_item.SendUsingAccount 不会起作用,返回值是 None, 永远从第一个邮箱账号发送邮件,我使用的是 Office 365 版。需要调用 _oleobj_.Invoke() 方法。后面列出了参考链接。
本质上,这种方法是调用 COM 组件,可以查询微软的开发帮助了解相关对象的属性和方法,比如我想知道 Account 的细节,就特意参考了下面这篇帮助:https://docs.microsoft.com/zh-cn/office/vba/api/outlook.account 。COM 编程与语言无关。另外可以在 Outlook 中 ALT + F11,进入 VBE 环境,然后 F2 进入对象浏览器界面查看比如下面的界面显示了 Account 的属性和方法:
关于调试
python 作为动态语言,通过 Debug 获取 COM 对象信息并不是很方便,比如下面代码:
import win32com.client as win32 def 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()
设置断点的调试界面:
我们只知道 account 是一个 COM Object,account 包含的信息很多都是 unknown 的。碰到这种情况,我一般用 C# 或者 VBA 编写代码进行调试。如果我需要详细了解 account 的属性和方法,在 Office 的任何组件中,比如 Excel,写一段下面的代码:
Public Sub Print_Outlook_Accounts() ' 工具 -> 引用:添加 Microsoft Outook Object Library 引用 Dim outlookApp As New Outlook.Application Dim accounts As Outlook.accounts Set accounts = outlookApp.Session.accounts Dim account As Outlook.account For Each account In accounts Debug.Print account.DisplayName Next End Sub
显示出监视窗口,设置断点,获取 accounts 信息:
在监视窗口添加变量 accounts:
展开:
Item 1 和 Item 2 表示有两个账号,现在我们想看到 Item 2 的账号信息,将 Item 2 展开:
DeliveryStore 属性也包含 account 的信息,可以展开查看。
参考
SendUsingAccount Does Not Work in Outlook 2010, possible bug"_blank" href="https://stackoverflow.com/questions/35908212/python-win32com-outlook-2013-sendusingaccount-return-exception" rel="external nofollow" >python win32com outlook 2013 SendUsingAccount return exception
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。