如何用python读取outlook收件箱中未读邮件,如何用python自动答复outlook邮件? 您所在的位置:网站首页 olfolderinbox 如何用python读取outlook收件箱中未读邮件,如何用python自动答复outlook邮件?

如何用python读取outlook收件箱中未读邮件,如何用python自动答复outlook邮件?

#如何用python读取outlook收件箱中未读邮件,如何用python自动答复outlook邮件?| 来源: 网络整理| 查看: 265

很多公司使用的都是Outlook邮箱(客户端),因此在编写相关自动化程序时需要用到和163、qq等网页版邮箱不一样的方法。除了需要借助Python中的win32com库对Office系列中的Outlook进行操作外,还需要熟悉微软Outlook官方文档。本文整理了实现Outlook自动化项目的一些要点并提供相关代码

已实现功能:

1、判断指定邮件是否被回复。如果被回复,继续检索其回复时间及回复人员【0908:已完成】① 查询条件:发件人邮箱后缀、发件人、邮件标题关键字、邮件正文关键字等② 回复标准:邮件主题包含收到邮件的主题且发件人后缀是xxx2、根据查询条件可能有多个匹配结果,需要对匹配到的邮件逐一判断【0919:已完成】3、将检查结果编写成html邮件自动发送【0908:已完成】① 没有回复的放在最前面且标红② 没有查到相关结果的标黄4、进行关键词的匹配(IN)而不是限制(Restrict OR)。DASL语法中没有SQL里的IN,但可以将筛选条件用变量sfilter表示(各条件用OR连接)【0913:已完成】5、判空(发件人、邮箱标题关键字,正文关键字)及处理【0919:已完成】6、收件箱的子文件夹也一并搜索,且筛选含某字段(例如“监测”)的子文件夹/子子文件夹(文件夹的匹配)【0924:已完成】7、接收的时间大于收到的时间。Outlook中对接收时间的判断只能精确到日期,无法精确到小时、分钟【0927:已完成】8、发件人邮件后缀不为xxx【0928:已完成】9、增加对话ID属性,当有几封符合条件的回复邮件时,确保其实来自于一个对话【0928:已完成】10、当对话ID一样,增加了回复邮件正文包含原邮件发送时间的判断【0929:已完成】11、增加交互界面,通过提示框输入查询时间段【0929:已完成】12、在结果中连接其他表进行更丰富的展示【0929:已完成】终于~长叹一口气1 在Python中登录邮箱并读取邮件

【温馨提醒】在Python中连接Outlook时需要打开Outlook客户端,否则要报错哦~

#%% 连接outlook # 打开outlook outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI") # 接收邮件 outlook.SendAndReceive(False) # 参数False代表不把收取进度显示出来,若要显示改为True即可 # 查看Outlook中配置的任何账户 for account in outlook.Accounts: print(account.DeliveryStore.DisplayName)

使用Folder.Items属性可获取表示文件夹的邮件项目Items集合,使用Items.Item(index)方法(其中index是邮件的索引号或用于匹配邮件的默认属性的值)从指定文件夹中返回单个MailItem对象。使用CreateItem方法可创建一个代表新邮件的MailItem对象。

使用Items属性可返回Folder对象的Items对象。Items 集合的索引从1开始,Items集合对象中的项目不能保证在任何特定的顺序。

# 返回”收件箱“中主题为“Need your advice”的第一个项目 myItem = myFolder.Items("Need your advice") # 返回“收件箱”中的第一个项目 myItem = myFolder.Items(1) 1.1 Folders对象

一、对象

文件夹属性可用于从一个命名空间的对象或另一个文件夹对象中返回该文件夹对象。使用Folders(index)(其中index是名称或索引号)可返回单个Folder对象。 文件夹名称区分大小写。

名称值说明olFolderInbox6"收件箱"文件夹(不包含子文件夹邮件)olFolderOutbox4"发件箱"文件夹olFolderSentMail5"已发送邮件"文件夹olFolderDeletedItems3"已删除邮件"文件夹

二、方法

名称作用说明GetFirst返回Folders集合中的第一个对象如果不存在第一个对象,则返回 NothingGetLast返回Folders集合中的最后一个对象如果不存在 最后 一个对象(例如,如果集合为空,则返回 Nothing)GetNext返回Folders集合中的下一个对象如果不存在下一个对象,则返回 Nothing,例如,如果已位于集合的末尾GetPrevious返回Folders集合中的上一个对象如果前一个对象不存在,则返回 Nothing,例如,如果已位于集合的开头

注意,在Python中调用上述方法时,需要在每个方法后加上括号(),否则会被Python识别为函数而报错。

若要确保GetFirstGetLastGetNextGetPrevious方法在大型集合中正确操作,请先调用GetFirst,然后再调用该集合上的GetNext,在调用GetPrevious之前调用GetLast

三、属性

Folders.Count :表示指定文件夹中的下级文件夹数(只含其子文件夹,不含子-子文件夹哦)Folders.Parent:返回指定对象的对象的父级,此为只读属性。

注意,直接搜某个子文件夹会报错,必须指明其上一级直至“收件箱”(需要完整路径)。

1.3 MailItem 对象

一、方法

【官方文档】MailItem 对象 (Outlook)的事件、方法和属性

创建默认Outlook项目时会用到CreateItem(OlItemType)方法。其他的项目类型如下:

名称值说明olAppointmentItem1代表“日历”文件夹中的会议、一次性约会、定期约会或会议olContactItem2代表“联系人”文件夹中的联系人olDistributionListItem7代表“联系人”文件夹中的通讯组列表olJournalItem4代表“日记”文件夹中的日记条目olMailItem0代表一封邮件olNoteItem5代表“便笺”文件夹中的便笺olPostItem6代表在公用文件夹中其他人可以浏览的公告olTaskItem3代表“任务”文件夹中的任务(要在指定时间帧内执行的分配的、代理的或自愿接受的任务)

如mail = outlook.CreateItem(0) ,该方法创建了代表新邮件的MailItem对象。使用Item[Object](index),其中index是邮件或用于匹配一条消息,可从指定的文件夹中返回单个MailItem对象的默认属性值的索引号。

二、属性

名称作用说明对应MAPI属性ConversationID返回一个唯一标识MailItem对象属于对话对象的字符串 。 此为只读属性此属性将项目与对话相关联。 这些项目和对话其 转换 Id 属性中具有相同的值PidTagConversationIdConversationTopic返回一个字符串 ,表示的 Outlook项目的会话线索的主题。 此为只读属性————CreationTime返回日期的Outlook项目的创建时间。 此为只读属性——PidTagCreationTimeEntryID返回一个表示对象的唯一条目ID的字符串 。 此为只读属性MAPI 存储提供程序将在存储中创建项时分配的唯一 ID 字符串,移动文件夹时ID会变PidTagEntryId

测试中,发现了很多意想不到的错误(灬ꈍ ꈍ灬)。比如,一些发件人偷懒,发第二封邮件的时候直接在上一封的基础上点击回复全部修改内容,这样就会出现其实不是来自同一对话的邮件但有相同ConversationID的问题。

三、筛选器

reply = replys.Restrict("@SQL=(urn:schemas:httpmail:subject LIKE '%"+message.Subject+"%')") # 匹配邮件主题关键字

Items.Restrict 方法:将筛选器应用于Items集合,返回一个新集合,其中包含原始集合中与筛选器匹配的所有项目。Restrict(_Filter_)返回一个 Items集合,代表原始Items集合中与筛选器匹配的项,其中

名称必需/可选数据类型说明Filter必需String要应用的筛选器字符串表达式。有关详细信息,请参阅 Find 方法。

此方法是使用 Find方法或 FindNext 方法对集合中的特定项进行访问的替代方法。 如果集合中只有较少数量的项目,FindFindNext 方法要比筛选更快。 如果集合中项目较多,尤其是预计在大型集合中仅可查找到少量几个项目时,Restrict 方法的速度会明显更快。

如果试图通过用户定义的字段使用FindRestrict 方法,这些字段必须在文件夹中已定义,否则将发生错误,无法执行“包含”操作。 例如,不能使用FindRestrict 搜索“主题”字段中包含特定字词的项目。 而应使用 AdvancedSearch 方法,或循环遍历文件夹中的所有项目并使用 InStr 函数在字段内执行搜索操作。 使用 Restrict 方法可搜索在特定字符范围内开始的项目。

2 Outlook查询语言——DASL

Outlook支持三种不同的查询语言——AQS,DASL和Jet,每一种都有适用的情景。这里主要介绍DASL。DASL擅长为文件夹中的项目检索基于属性的结果。虽然编写起来很麻烦,但DASL是最通用的查询语言,因此值得深入研究。

2.1 属性说明符

DASL使用名称空间模式名称来表示其查询语法中的属性,所有属性都必须用双引号引起来。命名空间属性说明符始终区分大小写。例如,urn:schemas:contacts:givenName是一个有效的说明符,但urn:schemas:contacts:givenname是无效的。

【官方文档】命名空间的属性查询

2.2 字符串比较

【官方文档】用于查询的关键字

DASL过滤器支持的字符串比较包括等价、前缀、短语和子字符串匹配。请注意,当对主题属性进行过滤时,会忽略诸如RE:和FW:之类的前缀。

一、 等价匹配

DASL过滤器通过使用等号 (=) 运算符执行字符串等价比较。除了前面提到的前缀RE:和FW:之外,字符串属性的值必须与比较字符串等价,相当于完全匹配。

例如,假设正在搜索的文件夹包含以下主题的项目:

QuestionQuestionableUnquestionableRE: QuestionThe big question# 筛选主题为“question”的邮件 string filter = "@SQL=" + "\"" + "urn:schemas:httpmail:subject" + "\"" + " = 'question'";

以上代码返回的结果为:

QuestionRE: Question

二、前缀、短语和子字符串匹配

DASL 支持使用内容索引器关键字 ci_startswith 和 ci_phrasematch 以及关键字 like 匹配字符串属性中的前缀、短语和子字符串。如果对商店进行了索引,则使用内容索引器关键字进行搜索比使用 like 更高效。如果您的搜索方案包括子字符串匹配(内容索引器关键字不支持),请在DASL查询中使用like关键字。DASL查询可以包含 ci_startswith或ci_phrasematch等,但所有字符串比较都将作为子字符串匹配进行。

ci_startswith语法如下:

ci_startswith

其中,PropertySchemaName是命名空间引用的属性的有效名称,ComparisonString是用于比较的字符串。关键字ci_startswith执行搜索以匹配前缀。它使用比较字符串中的标记(字符、单词或单词)来匹配索引属性的字符串值中任何单词的前几个字符。如果比较字符串包含多个标记,则比较字符串中的每个标记都必须在索引属性中具有前缀匹配。

例如,假设正在搜索的文件夹包含以下主题的项目:

QuestionQuestionableUnquestionableRE: QuestionThe big question# 筛选主题为“question”的邮件 string filter = "@SQL=" + "\"" + "urn:schemas:httpmail:subject" + "\"" + " ci_startswith 'question'";

以上代码返回的结果为:

QuestionQuestionableRE: QuestionThe big question

ci_phrasematch语法如下:

ci_phrasematch

其中 PropertySchemaName 是命名空间引用的属性的有效名称,ComparisonString是用于比较的字符串。关键字 ci_phrasematch 执行搜索以匹配短语。它使用比较字符串中的标记(字符、单词或单词)来匹配索引属性的字符串值中的整个单词。标记用双引号或括号括起来。比较字符串中的每个标记都必须具有等价匹配,而不是子字符串或前缀匹配。如果比较字符串包含多个标记,则比较字符串中的每个标记都必须具有等价匹配。多词属性(如主题或正文)中的任何词都可以匹配;它不一定是第一个词。

例如,假设正在搜索的文件夹包含以下主题的项目:

QuestionQuestionableUnquestionableRE: QuestionThe big question# 筛选主题为“question”的邮件 string filter = "@SQL=" + "\"" + "urn:schemas:httpmail:subject" + "\"" + " ci_phrasematch 'question'";

以上代码返回的结果为:

QuestionRE: QuestionThe big question

三、Like

关键字 like执行前缀、子字符串或等价匹配。标记(字符、单词或单词)以特定方式用%字符括起来,具体取决于匹配类型:例如,'%'提供前缀匹配。例如,限制like'cat%'将匹配“cat”和“catalog”。 like'%%' 提供子字符串匹配。例如,限制like '%cat%'将匹配“cat”、“catalog”、“kittycat”和“decathlon”。like ''提供等价匹配。例如,限制 like 'cat' 将匹配“cat”和“RE: Cat”。

每个标记都可以匹配字符串属性中单词的任何部分。如果比较字符串包含多个标记,则比较字符串中的每个标记都必须有一个子字符串匹配。多词属性(如主题或正文)中的任何词都可以匹配;它不必是第一个词。

例如,假设正在搜索的文件夹包含以下主题的项目:

QuestionQuestionableUnquestionableRE: QuestionThe big question# 筛选主题为“question”的邮件 string filter = "@SQL=" + "\"" + "urn:schemas:httpmail:subject" + "\"" + " like '%question%'";

以上代码返回的结果为:

QuestionQuestionableUnquestionableRE: QuestionThe big question2.3 搜索项目的正文

要搜索正文中包含特定单词的项目,请使ci_startswith、ci_phrasematch 或类似运算符以及正文属性的命名空间表示urn:schemas:httpmail:textdescription。当使用DASL 查询搜索项目正文时,无法确定在正文中的哪个位置找到了匹配项。如果需要确定单词在正文中的位置,请检查已找到项目的Body属性。以下代码示例使用 ci_phrasematch 关键字为项目创建过滤器,使用 Table 对象的过滤器,并将Subject属性写入Listeners 集合中的跟踪侦听器。

【锦囊妙计】在Outlook中,可以查看筛选项的SQL语句(“视图-当前视图-试图设置-筛选”)。可以先在筛选中的邮件/其他选择/高级板块进行筛选,再进入SQL查看对应语句。

3 制作html发送邮件#%% 整理结果 # 根据是否回复进行排序 result.sort_values(by=['是否回复'],inplace=True,ignore_index=True) # 对没有回复的数据标红 def color_format(x,color): return "{:}".format(color,x) def parse_class(reply): return reply.apply(lambda x:color_format(x,'red') if x == "否" else x) result['是否回复'] = parse_class(result['是否回复']) #%% 发送邮件 # 按照格式发送邮件(使用默认邮箱账户,即在Outlook中设置的第一个邮箱账户) # 创建一个邮件对象 outlook = win32com.client.Dispatch("Outlook.Application") mail = outlook.CreateItem(0) # 设置发送选项 mail.To = "xxx.com" # 收件人邮箱 mail.CC = "xxx.com" # 抄送人邮箱 mail.Subject = "【日报】邮件回复情况" # 邮件主题 # 设置正文内容 body_html = "" body_html = body_html + '各位老师好:以下是今天托管行邮件回复情况:' body_html = body_html + result.to_html() body_html = body_html.replace(';','') # 替换gt body_html = body_html + 'Hi,本邮件由系统自动发出(每天触发),无需回复!' mail.HTMLBody = body_html mail.Display(True) # 发送邮件 if __name__ =='__main__': mail.Send()

PS:如有意获取完整代码及交流解决方案,欢迎进入下方的付费咨询!

4 参考资料

4.1 邮件查询

查看“发件箱”里是否有给某特定对象发的邮件Restrict中多条件拼接子文件夹的查询

4.2 回复判断

请问VB或VBA怎么判断一个邮件是否已回复?VBA Outlook从电子邮件中获取“回复”电子邮件地址关于excel:在Outlook VBA中检索电子邮件的回复者名称检查收件箱中的每封电子邮件是否已回复(对话、项目周期)VBA Outlook从电子邮件中获取“回复”电子邮件地址

4.3 编程技巧

python的try和except用法_try except(多个except)多异常处理Python判断DataFrame中某一项的值是否为空

4.4 整理数据

将筛选的结果放进DataFrame中

4.5 生成html

python读取excel内容再转变成html添加到outlook中-阿里云开发者社区 (aliyun.com)

4.6 发送邮件

Python 调用 Outlook 发送邮件python 发邮件 抄送,Python调用outlook发送邮件,发送给多人、抄送给多人并带上附件...


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有