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

作者:Stone0823 时间:2023-11-17 19:34:57 

微软 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

来源:https://www.jianshu.com/p/4f0ed762f521

标签:python,调用,outlook,发送,邮件
0
投稿

猜你喜欢

  • mysql插入前判断数据是否存在的操作

    2024-01-19 20:45:24
  • VSCode 配置uni-app的方法

    2024-04-29 13:18:00
  • 我的javascript小扎

    2008-08-12 13:04:00
  • python如何通过psutil获取服务器cpu、内存、磁盘使用率

    2022-11-07 01:01:29
  • Zend Framework教程之Zend_Config_Ini用法分析

    2024-05-13 09:23:47
  • python动态加载变量示例分享

    2022-10-23 18:57:50
  • python图像常规操作

    2022-12-28 18:21:52
  • python循环输出三角形图案的例子

    2022-05-16 08:38:37
  • python3 requests中文乱码之压缩格式问题解析

    2021-12-13 17:03:28
  • Python实现RSA加密解密

    2022-04-22 19:07:41
  • python3结合openpyxl库实现excel操作的实例代码

    2021-02-24 05:06:59
  • Python读取文件内容的三种常用方式及效率比较

    2023-08-29 23:46:00
  • Python 序列化 pickle/cPickle模块使用介绍

    2021-04-28 17:23:21
  • 利用ajax制作在线翻译聊天室

    2007-12-28 21:44:00
  • jdbc连接sqlserver数据库示例

    2024-01-17 12:56:16
  • 聊聊golang的defer的使用

    2023-07-21 13:15:02
  • Python实现删除重复视频文件的方法详解

    2022-06-16 03:24:29
  • 在SQL Server数据库中为标识(IDENTITY)列插入显式值

    2024-01-18 04:03:40
  • Python绘制3D立体花朵示例详解

    2021-06-26 02:59:54
  • 归纳万恶IE6的HACK方法

    2010-02-04 17:17:00
  • asp之家 网络编程 m.aspxhome.com