使用如下:
用户可以输入一个日期,该代码会自动搜索该日期一周以后(包括这一天)的邮件,我在里面加了可以查询包含“TEST FLOOR”标题的邮件,所以其实是两层的搜搜限制,可以按需改动。
# -*- coding: utf-8 -*-
import re
from win32com.client.gencache import EnsureDispatch as Dispatch # 读取邮件模块
from datetime import datetime, timedelta
def read_outlook_mailbox(specific_time):
"""连接Outlook邮箱读取收件箱内的邮件内容"""
# 使用MAPI协议连接Outlook
account = Dispatch('Outlook.Application').GetNamespace('MAPI')
# 获取收件箱所在位置
inbox = account.GetDefaultFolder(6) # 数字6代表收件箱
# 获取收件箱下的所有邮件
mails = inbox.Items
start_time = specific_time
#读取范围为指定日期之后一周内的邮件
end_time = start_time + timedelta(days=7)
filtered_mails = inbox.Items
filtered_mails.Sort('[ReceivedTime]', True)
pattern = re.compile(r'TEST FLOOR', re.IGNORECASE)
number=0
with open("search_test_floor.txt", "w+", encoding="utf-8") as f:
# 读取收件箱内邮件的所有信息(下标从1开始)
for mail in filtered_mails :
#找到所有范围内的邮箱中,标题带有"TEST FLOOR"的邮件
if pattern.search(mail.Subject):
number+=1
mail_time = str(mail.ReceivedTime)[:19]
mail_true_time = datetime.strptime(mail_time, '%Y-%m-%d %H:%M:%S')
if(mail_true_time>=start_time)and(mail_true_time<=end_time):
# 将邮件信息写入到文件中
f.write('正在读取第[{}]封邮件...'.format(number))
f.write("\n")
f.write('接收时间:{}'.format(str(mail.ReceivedTime)[:-6]))
f.write('\n')
f.write('发件人:{}'.format(mail.SenderName))
f.write('\n')
# f.write('收件人:{}'.format(mail.To))
# f.write('\n')
# f.write('抄送人:{}'.format(mail.CC))
f.write('\n')
f.write('主题:{}'.format(mail.Subject))
f.write('\n')
f.write('邮件正文内容:{}'.format(mail.Body))
f.write('邮件附件数量:{}'.format(mail.Attachments.Count))
f.write('\n')
f.write('会话主题:{}'.format(mail.ConversationTopic))
f.write('\n')
f.write('会话ID:{}'.format(mail.ConversationID))
f.write('\n')
user_input_time=input("请输入日期(格式:DD/MM/YYYY):")
start_date = datetime.strptime(user_input_time, '%d/%m/%Y')
specific_time = datetime(start_date.year,start_date.month,start_date.day,18,30,0)
read_outlook_mailbox(specific_time)