python获取outlook邮件内容_Python 调用 Outlook 发送邮件过程解析

本文介绍了如何使用Python的pywin32库与Outlook交互,发送邮件。通过创建Outlook Application对象并指定账号,实现邮件发送。在多账号场景下,通过遍历Accounts并设置_SendUsingAccount_属性来选择特定账号发送邮件。当_SendUsingAccount_不起作用时,采用_OleObj_.Invoke方法完成任务。调试过程中,可以借助VBA或C#获取COM对象详细信息。
摘要由CSDN通过智能技术生成

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

Hello, This is a test mail.

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 = '''

Hello, This is a test mail.

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?

python win32com outlook 2013 SendUsingAccount return exception

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

本文标题: Python 调用 Outlook 发送邮件过程解析

本文地址: http://www.cppcns.com/jiaoben/python/267752.html

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值