Python 调用 Outlook 发送邮件过程解析


Posted in Python onAugust 08, 2019

微软 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 调用 Outlook 发送邮件过程解析

关于调试

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()

设置断点的调试界面:

Python 调用 Outlook 发送邮件过程解析

我们只知道 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 信息:

Python 调用 Outlook 发送邮件过程解析

在监视窗口添加变量 accounts:

Python 调用 Outlook 发送邮件过程解析

展开:

Python 调用 Outlook 发送邮件过程解析

Item 1 和 Item 2 表示有两个账号,现在我们想看到 Item 2 的账号信息,将 Item 2 展开:

Python 调用 Outlook 发送邮件过程解析

DeliveryStore 属性也包含 account 的信息,可以展开查看。

参考

SendUsingAccount Does Not Work in Outlook 2010, possible bug?

python win32com outlook 2013 SendUsingAccount return exception

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python实现马耳可夫链算法实例分析
May 20 Python
Python中文竖排显示的方法
Jul 28 Python
Flask框架的学习指南之用户登录管理
Nov 20 Python
Python subprocess模块详细解读
Jan 29 Python
Python 函数基础知识汇总
Mar 09 Python
TensorFlow saver指定变量的存取
Mar 10 Python
python模块导入的细节详解
Dec 10 Python
Python中整数的缓存机制讲解
Feb 16 Python
Python匿名函数及应用示例
Apr 09 Python
python3 线性回归验证方法
Jul 09 Python
了解一下python内建模块collections
Sep 07 Python
教你如何使用Python开发一个钉钉群应答机器人
Jun 21 Python
python判断自身是否正在运行的方法
Aug 08 #Python
Python 日期区间处理 (本周本月上周上月...)
Aug 08 #Python
python各类经纬度转换的实例代码
Aug 08 #Python
Python3.0 实现决策树算法的流程
Aug 08 #Python
Python使用ffmpy将amr格式的音频转化为mp3格式的例子
Aug 08 #Python
Django rest framework jwt的使用方法详解
Aug 08 #Python
使用Python实现文字转语音并生成wav文件的例子
Aug 08 #Python
You might like
php Imagick获取图片RGB颜色值
2014/07/28 PHP
PHP实现的数据对象映射模式详解
2019/03/20 PHP
JS date对象的减法处理实现代码
2010/12/28 Javascript
网页打开自动最大化的js代码
2012/08/22 Javascript
js实现省市联动效果的简单实例
2014/02/10 Javascript
jquery学习总结(超级详细)
2014/09/04 Javascript
JavaScript6 let 新语法优势介绍
2016/07/15 Javascript
jQuery UI仿淘宝搜索下拉列表功能
2017/01/10 Javascript
微信小程序图片选择、上传到服务器、预览(PHP)实现实例
2017/05/11 Javascript
jQuery Dom元素操作技巧
2018/02/04 jQuery
Webpack 4.x搭建react开发环境的方法步骤
2018/08/15 Javascript
JS div匀速移动动画与变速移动动画代码实例
2019/03/26 Javascript
小程序getLocation需要在app.json中声明permission字段
2019/04/04 Javascript
Angular实现svg和png图片下载实现
2019/05/05 Javascript
Electron实现应用打包、自动升级过程解析
2020/07/07 Javascript
JS前后端实现身份证号验证代码解析
2020/07/23 Javascript
[46:55]LGD vs Liquid 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/19 DOTA
在windows系统中实现python3安装lxml
2016/03/23 Python
Python快速从注释生成文档的方法
2016/12/26 Python
Python中的Numpy矩阵操作
2018/08/12 Python
使用Tkinter制作信息提示框
2020/02/18 Python
python实现猜数游戏(保存游戏记录)
2020/06/22 Python
python 5个顶级异步框架推荐
2020/09/09 Python
python 用Matplotlib作图中有多个Y轴
2020/11/28 Python
Python Socket多线程并发原理及实现
2020/12/11 Python
使用Python webdriver图书馆抢座自动预约的正确方法
2021/03/04 Python
英国汽车零件购物网站:GSF Car Parts
2019/05/23 全球购物
娱乐节目策划方案
2014/06/10 职场文书
火锅店的活动方案
2014/08/15 职场文书
社区党员志愿服务活动方案
2014/08/18 职场文书
党员干部对十八届四中全会的期盼
2014/10/17 职场文书
音乐教师个人工作总结
2015/02/06 职场文书
保险公司2016开门红口号集锦
2015/12/24 职场文书
志愿者服务宣传标语口号
2015/12/26 职场文书
CSS完成视差滚动效果
2021/04/27 HTML / CSS
教你用python控制安卓手机
2021/05/13 Python