python 通过 win32 模块操作 outlook

关于 outlook 文档的一些链接
(1)非官方,接口不全,可速查
http://www.snb-vba.eu/VBA_Outlook_external_en.html#L_2.0
(2)微软官方.NET 接口文档 (英文)
https://docs.microsoft.com/en-us/dotnet/api/microsoft.office.interop.outlook?view=outlook-pia
(3)微软官方.NET 接口文档 (中文)
https://docs.microsoft.com/zh-cn/dotnet/api/microsoft.office.interop.outlook?view=outlook-pia
(4)微软官方 VBA 文档
https://docs.microsoft.com/zh-cn/office/vba/api/overview/outlook

outlook 相关操作
1. 发邮件(使用默认邮箱账户,即在 outlook 设置的第一个邮箱账户)

outlook = win32com.client.Dispatch("Outlook.Application")
# 创建一个邮件对象
mail = outlook.CreateItem(0)
# 对邮件的各个属性进行赋值
mail.To = "收件人邮箱"
mail.Subject = "邮件主题"
mail.Body = "邮件正文"
mail.Attachments.Add("附件绝对路径")
# 添加多个附件
# mail.Attachments.Add("附件1绝对路径")
# mail.Attachments.Add("附件2绝对路径")...
# 邮件发送
mail.Send()

2. 发邮件的时候选择使用哪个邮箱账户 (outlook 已设置多个账户时)

outlook = win32com.client.Dispatch("Outlook.Application")
send_account = None
# 选择要使用的邮箱账户
for account in outlook.Session.Accounts:
    if account.DisplayName == "想使用的邮箱账户":
       send_account = account
       break
mail = outlook.CreateItem(0)        
mail._oleobj_.Invoke(*(64209, 0, 8, 0, send_account))

mail.To = "xxx@163.com"
mail.Subject = "testing"
mail.Send()

3. 获取“收件箱”文件夹里的邮件信息,并将邮件另存为到指定路径,以及“全部回复”功能

outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")
# 收件箱文件夹
inbox = outlook.Folders("想使用的邮箱账户").Folders("收件箱")  
# 比如:sendbox = outlook.Folders("test@163.com").Folders("已发送邮件")  
# 接收邮件,参数False代表不把收取进度显示出来,若要显示改为True即可
outlook.SendAndReceive(False)
# 获取收件箱文件夹里面的邮件对象(所有)
messages = inbox.Items
# 收件箱邮件总数
count = len(messages)
# 获取第一封邮件    message = inbox.Items.GetFirst() 
# 获取最后一封邮件  message = inbox.Items.GetLast()  
# 遍历收件箱每封邮件并获取相应信息
for message in messages:
    # 获取回复状态码,已回复是103,未回复是0
    reply_status = message.PropertyAccessor.GetProperty("http://schemas.microsoft.com/mapi/proptag/0x10810003")
    # 如果要判断是否已读,使用UnRead属性 message.UnRead   返回的是布尔值
    # 发件人
    sender = message.Sender
    # 发件人邮箱
    sendemail = message.SenderEmailAddress
    # 标题
    subject = message.Subject
    # 正文
    body = message.Body
    # 收件时间
    receive_time = message.ReceivedTime
    # 将邮件另存到指定路径
    message.SaveAs("文件绝对路径(注意文件名是.msg后缀)")
    # 全部回复功能(对单封邮件的“全部回复”),而类似的“回复”功能调用的是Reply()方法
    replyall_email = message.ReplyAll()
    replyall_email.Body = "回复的正文内容"
    replyall_email.Send()

4. 获取”已发送邮件“中的邮件信息

outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")
# 获取已发送文件夹对象
sendbox = outlook.Folders("想使用的邮箱账户").Folders("已发送邮件")
# 获取已发送文件夹里面的邮件对象(所有已发送邮件)
messages = sendbox.Items
# 遍历获取每封邮件的信息
for message in messages:
    # 收件人邮箱
    print(message.To)
    # 邮件主题
    print(message.Subject)
    # 邮件正文
    print(message.Body)
    # 发件人名字
    print(message.SenderName)
    # 发件人邮箱
    print(message.SenderEmailAddress)

5. 在”已发送邮件“中查找是否给某个邮箱发送过邮件

outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")
# 获取已发送文件夹对象
sendbox = outlook.Folders("想使用的邮箱账户").Folders("已发送邮件")
# 要查找的邮箱
email = "test@163.com"
condition = "\'{}\'".format(email)
# 按条件进行筛选  [To]里面的参数也可以改为按别的属性进行查询
send_messages = sendbox.Items.Restrict('[To]="{}"'.format(condition))
# 符合条件的邮件数
count = len(send_messages)
# 若需要对筛选的邮件做进一步处理,用for遍历send_messages然后操作即可