用Python中Pywin32 win32com操作outlook总结 | 读-查-发-存邮件

目录

1. 简介

2. 用win32com操作outlook

1.读邮件

2. 根据条件查邮件

3. 保存邮件附件或邮件

4. 发邮件

5. 获取邮件的发件人,收件人和copy人的邮件地址

3. 问题总结

1.发件人邮件地址取不到

4. 其它


1. 简介

Pywin32是最受欢迎的软件包之一,可以自动化Microsoft Outlook/Excel等的日常工作。 本文主要通过Python Pywin32软件包从Outlook中读邮件,查邮件,发邮件和保存邮件。

2. 用win32com操作outlook

1.读邮件

安装pywin32包

python -m pip install pypiwin32

就像与其他系统或应用程序通信一样,您需要首先启动会话。 通过调用getNamespace函数,您可以获取后续操作的Outlook会话。

import win32com.client as win32
outlook = win32.Dispatch('outlook.application')
mapi = outlook.GetNamespace('MAPI')

当使用以下代码迭代帐户属性时,您将看到您在Outlook中配置的任何帐户:

for account in mapi.Accounts:
    print(account.DeliveryStore.DisplayName)

执行结果如下:

abc@company.com
xxx@gmail.com

为了访问特定电子邮件帐户下的子文件夹,您可以继续使用文件夹方法来指定文件夹的子文件夹名称或索引。 在此之前,您可能需要检查什么是可用的子文件夹,并且根据以下内容的索引值:

for idx, folder in enumerate(mapi.Folders("abc@company.com").Folders):
    print(idx+1, folder)
# or using index to access the folder
for idx, folder in enumerate(mapi.Folders(1).Folders): 
    print(idx+1, folder)

执行结果如下:

1 Deleted Items
2 Inbox
3 Outbox
4 Sent Items
5 Tasks
6 RSS Subscriptions
7 Contacts
8 Calendar
9 Yammer Root
10 Sync Issues
11 Quick Step Settings
12 Suggested Contacts
13 News Feed
14 Junk Email
15 Drafts
16 Conversation Action Settings
17 Conversation History
18 Notes
19 ExternalContacts
20 Journal
21 Files

访问inbox文件夹

# access inbox folder with GetDefaultFolder(6) method
for idx, folder in enumerate(mapi.GetDefaultFolder(6).Folders):
    print(idx + 1, folder)

读Inbox文件夹下的邮件,

messages = mapi.Folders("abc@company.com").Folders("Inbox").Items
# or
messages = mapi.Folders("abc@company.com").GetDefaultFolder(6).Items
# or
messages = mapi.Folders(1).Folders(2).Items
for msg in list(messages):
    print(msg.Subject)

读inbox文件夹下的最后一份邮件或第一份邮件, 并且打印邮件的标题,发件人邮箱地址和邮件内容

message = messages.GetLast()
#message = messages.GetFirst()

print(message.Subject)
print(message.SenderEmailAddress)
print(message.Body)

读前5份邮件

len_items = len(messages)
last5Messages = []
for i in range(5):
    # print(i)
    last5Messages.append(messages[len_items - i - 1])

for message in last5Messages:
    print(message)

或者

messages.Sort("[ReceivedTime]", Descending=True)

#read only the first 5 messages
for message in list(messages)[:5]:
    print(message.Subject, message.ReceivedTime, message.SenderEmailAddress)

2. 根据条件查邮件

使用限制功能来过滤您的电子邮件。 例如,我们可以在过去24小时内接收时间来过滤。

from datetime import datetime, timedelta

received_dt = datetime.now() - timedelta(days=1)
received_dt = received_dt.strftime('%m/%d/%Y %H:%M %p')
messages = messages.Restrict("[ReceivedTime] >= '" + received_dt + "'")
messages = messages.Restrict("[SenderEmailAddress] = 'contact@codeforests.com'")
messages = messages.Restrict("[Subject] = 'Sample Report'")

过滤的通配符匹配

使用限制方法,您无法进行通配符匹配,例如搜索电子邮件主体或身体是否包含某些关键字。 为了实现这一目标,您需要使用ADSL查询。

例如,使用以下DASL查询语法,您可以过滤包含“Sample Report”关键字的电子邮件主题:

messages = messages.Restrict("@SQL=(urn:schemas:httpmail:subject LIKE '%Sample Report%')")

要仅从特定域过滤电子邮件,您可以使用类似于上一个示例的ADSL查询:

messages = messages.Restrict("@SQL=(urn:schemas:httpmail:SenderEmailAddress LIKE '%company.com')")

为了将电子邮件从几个域中排除,您可以使用多个条件与逻辑运营商:

messages = messages.Restrict("@SQL=(Not(urn:schemas:httpmail:senderemail LIKE '%@abc%') \
And Not(urn:schemas:httpmail:senderemail LIKE '%@123%') \
And Not(urn:schemas:httpmail:senderemail LIKE '%@xyz%'))")

3. 保存邮件附件或邮件

保存邮件的附件

#Let's assume we want to save the email attachment to the below directory
outputDir = r"C:\attachment"
try:
    for message in list(messages):
	try:
	    s = message.sender
	    for attachment in message.Attachments:
	        attachment.SaveASFile(os.path.join(outputDir, attachment.FileName))
	        print(f"attachment {attachment.FileName} from {s} saved")
	except Exception as e:
		print("error when saving the attachment:" + str(e))
except Exception as e:
		print("error when processing emails messages:" + str(e))

保存整个邮件

base_dir = 'C:\email'
import os
import uuid
for message in last5Messages:
    mail_name = str(uuid.uuid4()) + '.msg'
    temp_file_path = os.path.join(base_dir, mail_name)
    message.SaveAs(temp_file_path)

如果要保存邮件到数据库

# convert email to binary file
def convert_file_to_binary( file_path):
    with open(file_path, 'rb') as file:
        binary_file=file.read()
        return binary_file

base_dir = 'C:\email'
import os
import uuid
for message in last5Messages:
    mail_name = str(uuid.uuid4()) + '.msg'
    temp_file_path = os.path.join(base_dir, mail_name)
    binary_file = convert_file_to_binary(temp_file_path)
    # save binary file of email to DB directly
    

4. 发邮件

回复邮件

def reply_mail(mail,  content , to_address='abc@company.com'):
    signature = "<br> thanks <br> yourname"
    reply = mail.Reply()

    reply_message = """
     <html>
       <head></head>
       <body>
           <font color="black" size=3 face="Calibri">
            """ + content + """<br>
            """ + signature + """
         </font>
       </body>
     </html>
     """
    reply.HTMLBody = reply_message + reply.HTMLBody
    reply.To = to_address
    reply.CC = 'abc@company.com'

    reply.Send()

发邮件

mail = outlook.CreateItem(0)
replymail(mail , "myfirstEmail")

5. 获取邮件的发件人,收件人和copy人的邮件地址

def get_cc_to_email_address(message):
    CC_list = []
    TO_list = []
    recipients = message.Recipients
    for recipient in recipients:
        addressEntry = recipient.AddressEntry
        if (addressEntry.Type == "EX"):
            if addressEntry.GetExchangeUser() is None:
                email_address = addressEntry.GetExchangeDistributionList().PrimarySmtpAddress
            else:
                email_address = addressEntry.GetExchangeUser().PrimarySmtpAddress
        else:
            email_address = addressEntry.Address
    # 1: TO , 2 : CC
        if recipient.Type == 1:
            TO_list.append(email_address)
        elif recipient.Type == 2:
            CC_list.append(email_address)
        else:
            print('recipient.Type is not in (1, 2)', recipient.Type)
    recipients_dict = {'TO': TO_list, 'CC': CC_list}
    return recipients_dict

def get_sender_email_address(email_object):
    if email_object.SenderEmailType == "EX":
        try:
            email_sender =  email_object.Sender
            print(email_sender)
        except AttributeError:
            print('no sender attribute,')
            sender_email_address = email_object.SenderEmailAddress
        else:
            if email_object.Sender.GetExchangeUser() is None:
                sender_email_address = email_object.Sender.GetExchangeDistributionList().PrimarySmtpAddress
            else:
                sender_email_address = email_object.Sender.GetExchangeUser().PrimarySmtpAddress
    else:
        sender_email_address = email_object.SenderEmailAddress
    return sender_email_address

3. 问题总结

1.发件人邮件地址取不到

发件人邮件地址用SenderEmailAddress来取的话取出的不对,因为发件人的邮件地址类型是EX, 用下面的方法来取。

def get_sender_email_address(email_object):
    if email_object.SenderEmailType == "EX":
        try:
            email_sender =  email_object.Sender
            print(email_sender)
        except AttributeError:
            print('no sender attribute,')
            sender_email_address = email_object.SenderEmailAddress
        else:
            if email_object.Sender.GetExchangeUser() is None:
                sender_email_address = email_object.Sender.GetExchangeDistributionList().PrimarySmtpAddress
            else:
                sender_email_address = email_object.Sender.GetExchangeUser().PrimarySmtpAddress

    else:
        sender_email_address = email_object.SenderEmailAddress
    return sender_email_address

4. 其它

关于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/outloo

https://docs.microsoft.com/en-us/previous-versions/office/developer/exchange-server-2007/aa581347(v=exchg.80)

  • 22
    点赞
  • 80
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: Python win32com可以用来操作Outlook,实现自动化邮件送、接收、删除等功能。具体操作步骤如下: 1. 安装pywin32模块,可以使用pip install pywin32命令进行安装。 2. 导入win32com.client模块,创建Outlook应用程序对象。 3. 使用应用程序对象的属性和方法,可以实现邮件的创建、送、接收、删除等操作。 例如,可以使用以下代码创建一个Outlook邮件送: ```python import win32com.client as win32 # 创建Outlook应用程序对象 outlook = win32.Dispatch('Outlook.Application') # 创建邮件对象 mail = outlook.CreateItem(0) # 设置邮件属性 mail.To = '收件人邮箱' mail.Subject = '邮件主题' mail.Body = '邮件正文' # 添加附件 attachment = "附件路径" mail.Attachments.Add(attachment) # 邮件 mail.Send() ``` 除了邮件,还可以使用Outlook应用程序对象的其他方法和属性,实现邮件的接收、删除等操作。 ### 回答2: Python是一种强大的编程语言,而win32com可以用来与Windows的COM组件进行交互。Outlook是一款强大的邮件和日历管理工具,面对繁琐的邮件操作,我们可以使用PythonOutlook进行交互从而自动执行某些操作,提高效率。 由于Outlook是COM对象,我们可以使用Pythonwin32com.client库来实现PythonOutlook的交互。在使用这个库之前,需要确保安装了Microsoft Office套件(包括Outlook应用程序),才能使用。 下面是一些操作Outlook的示例代码: 1.邮件操作 可以使用python win32com来创建、送和保outlook邮件。例如: ``` import win32com.client as win32 outlook = win32.Dispatch('outlook.application') mail = outlook.CreateItem(0) mail.To = 'receiver@example.com' mail.Subject = 'Python win32com test' mail.Body = 'This is a test email sent using Python win32com and Outlook' mail.Attachments.Add('D:\\test.docx') mail.Send() ``` 这个程序会创建一封新的邮件,将邮件送给特定收件人,并将一个附件添加到邮件。 2.日历操作 我们可以使用Python win32comOutlook操作日历。例如: ``` import win32com.client as win32 import datetime outlook = win32.Dispatch('outlook.application') calender = outlook.CreateItem(1) calender.Subject = 'Python win32com test' calender.Start = datetime.datetime(2022, 9, 1, 9, 0, 0) calender.Duration = 120 calender.ReminderMinutesBeforeStart = 15 calender.Location = 'Example Location' calender.Body = 'This is a test meeting created with Python win32com and Outlook' calender.Save() ``` 这个程序会创建一个日历条目,设置起始时间、持续时间、提醒时间、地点、主题和正文。 3.联系人操作 我们可以使用Python win32comOutlook操作联系人。例如: ``` import win32com.client as win32 outlook = win32.Dispatch('outlook.application') contacts = outlook.CreateItem(2) contacts.FirstName = 'Tom' contacts.LastName = 'Jerry' contacts.Email1Address = 'tomjerry@example.com' contacts.CompanyName = 'Example Company' contacts.JobTitle = 'Example Job Title' contacts.MobileTelephoneNumber = '123456789' contacts.Save() ``` 这个程序会创建一个联系人,设置姓名、邮箱地址、公司、职位和电话号码。 总的来说,Python win32comOutlook操作可以帮助我们完成许多日常任务,从而提高工作效率。 ### 回答3: Python Win32comPython的一个扩展库,它提供了访问本地系统的COM和OLE功能。Outlook是一款流行的邮件客户端,使用Python Win32com可以实现对Outlook的自动化操作。下面我就从使用Python Win32com操作Outlook的几个点进行详细介绍。 1.安装Python Win32com库 在使用Python Win32com库之前,需要首先安装此库。安装方法可以通过pip install pywin32指令进行安装。 2.创建Outlook客户端实例 创建Outlook客户端实例可以使用win32com.client.Dispatch()函数实现。这个函数接受一个字符串参数,代表了需要操作的COM对象的名称,Outlook的名称为“Outlook.Application”。 3.自动写邮件 使用Python Win32com可以实现Outlook的自动化邮件功能。具体步骤如下: (1)创建一个Outlook邮件对象。可以使用win32com.client.Dispatch()函数来创建一个Outlook邮件对象,名称为“Outlook.MailItem”; (2)为邮件对象设置属性,包括收件人、主题、内容等信息,这些信息可以通过设置邮件对象的属性来实现; (3)邮件。设置好邮件信息后,可以使用邮件对象的Send()方法来邮件。 4.自动收邮件 使用Python Win32com可以实现Outlook自动收邮件功能。具体步骤如下: (1)获取Inbox文件夹对象。使用Outlook对象的get_default_folder()方法可以获取默认文件夹对象,其“6”代表邮件文件夹类型为收件箱; (2)获取邮件对象列表。使用文件夹对象的Items属性可以获取该文件夹下的所有邮件对象,使用Count属性可以获取邮件数量,使用Item(index)方法可以获取指定邮件对象; (3)邮件对象信息。使用邮件对象的属性可以邮件信息,例如邮件主题、送者、收件人、内容等信息。 5.总结 Python Win32com是一款强大的工具,可以帮助我们实现对Outlook客户端的自动化操作和大规模邮件送等功能。我们可以通过学习和掌握Python Win32com的使用方法,更好地利用Outlook带来的便利。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

茫茫人海一粒沙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值