ews

发布时间:2022-07-02 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了ews脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

规则表设计 对应了easy-rule (下表不再使用) rule_id rule_name (规则名) rule_desc (规则简介) rule_condITions (规则条件,送入引擎fire用的fact的key) rule_filters PRiority (优先级) action_tyPE (动作类型) actions (动作集合) delete_flag (删除键) rule_type (规则判定的类型,如email,text,等枚举值) 1 邮件分拣1 规则介绍1 {"subject":"系统访问操作信息","senderAddress":"htffund.COM"} 'ha','ia','huac' 1 D 下载链接 0 email 2 邮件分拣2 规则介绍2 {"subject":"社保909","senderAddress":"htffund.com"} 'in' 2 C 下载链接,拷贝链接 1 other rule_filters: (规则过滤,对应microsoft中该email有无附件,是否设定了时间,等等进行邮件本体的过滤,这里也可以对应其它枚举,来送入filterHandler等进行boolean的返回)

注:所有的表中需要再设定create_time,update_time,create_by,update_by

规则表设计 对应了ews_rule rule_id display_name (展示名称) rule_desc (规则介绍) rule_level (规则等级) priority (优先级) 在topic_rule关联表时设定 rule_type(对应的是ews的规则类型) is_enabled (是否启用) is_not_supported (是否远方邮箱不支持) is_in_error (是否处于异常) conditions (条件,包含各种key,value) actions (动作,包含各种key,value) exceptions (类似conditions,暂不使用) item_action_type (动作类型) item_actions (邮件实体的操作,下载到内存中后) delete_flag (删除标识) {'containsSubjectStrings':['带附件','htf']} {'moveToFolder':'attach-un-download'} D(下载) {'downloadPath':'/home/email/attach'}

											DC(下载并拷贝)	{'downloadPath':'/home/email/attach','copyPath':'/home/email/backup'}		

一个规则引擎 1.easy-rule,用于将邮件拿到后,做为获取下载附件路径,但整体也可以通过多建立邮箱内不同文件夹来区分,使用度较低 2.ews-rule,用于将邮件首先在邮箱端根据规则区分,并移动到指定目录(结合了easy-rule的相关字段) item_action_type: 动作类型, 如D download, DC download and copy

rule_type: 指的是ews_rule的规则类型:

rule_topic : 规则主题,一个邮箱可对应多个,但不应冲突,如下载和下载并拷贝就互为冲突,而 下载主题和删除某些邮件主题则不冲突 规则主题一般会对不同的收件箱子目录进行处理,互不交集 rule_level: 每条规则含规则等级,在收件主题中关联到的多个规则,其中规则等级不能重复 priority与rule_level类似,权重在rule表中是一整个规则的权重设置,比较难判定这个规则的先后执行顺序,而参照ews_topic_rule_relation 的更改,其实也应该在设定邮件topic时,实时去指定选中规则的执行先后顺序,而先后,必然根据priority,但是否是可以放到一起做为同一主题的规则们,则需要根据rule_level(或rule_type)进行区分,即是说,priority是指定的,而顺序的操作也要参照可行性,而rule_level(或rule_type)是预设置的.

单个主题, (单个邮件,多个邮件), 多个邮箱

一个邮箱对应一条收件主题,而一条收件主题中包含多个不重复业务的规则(其中不冲突创建文件夹,不冲突判定conditions和actions等)

通过配置多个邮件,设定到如EmailconfigEntity,对多个邮件配置进行管理. 多个收件主题,其中主题范围大,内可包含该收件对邮件的哪些过滤条件,以及多个满足什么规则条件.

原easy-rule使用的有如when.then方式,当怎么怎么样,则执行什么什么

接收邮件时如果先进行邮件筛选?

ExchangeService 交换service,通过设定email配置信息获取email相关数据

EmailMessage 邮件主体信息,包含邮件附件

WellKnownFolderName 邮件系统中众所周知的文件夹名称

Folder 代表一个通用文件夹

java读取exchange服务器,以及遇到的坑 https://blog.csdn.net/QQ_37497275/article/details/102606183

使用 EWS(Exchange Web Service)协议读取邮件、发送邮件 https://www.BBSmax.com/A/VGzll8Wwzb/

通知类型: https://docs.microsoft.com/zh-cn/exchange/client-developer/exchange-web-services/notification-subscriptions-mailbox-events-and-ews-in-exchange

通知类型: https://docs.microsoft.com/zh-cn/exchange/client-developer/exchange-web-services/notification-subscriptions-mailbox-events-and-ews-in-exchange#how-do-ews-notifications-work 流式订阅 https://docs.microsoft.com/zh-cn/exchange/client-developer/exchange-web-services/how-to-stream-notifications-about-mailbox-events-by-using-ews-in-exchange

EWS API:

具体解析notifications

Creating a Folder Folder folder = new Folder(service); folder.setDisplayName("some-attachment-fixed-630"); //creates the folder as a child of the Inbox folder. folder.save(WellKnownFolderName.Inbox);

ews-java-api doc: https://github.com/OfficeDev/ews-java-api/wiki/Getting-Started-Guide

过滤根据subject: https://github.com/OfficeDev/ews-java-api/wiki/Getting-Started-Guide#find-the-First-10-messages-in-the-inbox-that-have-a-subject-that-contains-the-words-ews-or-api-order-by-date-received-and-only-return-the-subject-and-datetimereceived-properties

event notifications: EWS allows client applications to subscribe to event notifications. This makes it possible to determine what events occurred on a specific folder since a specific point in time (for example, what items were created, modified, moved, or deleted). https://github.com/OfficeDev/ews-java-api/wiki/Getting-Started-Guide#notifications

BeginSubscribeToStreamingNotifications stream方式订阅 https://github.com/OfficeDev/ews-java-api/wiki/Getting-Started-Guide#beginsubscribetostreamingnotifications

CreateInboxRules 根据rule移动item https://github.com/OfficeDev/ews-java-api/wiki/Getting-Started-Guide#createinboxrules

每50个item递增获取 https://github.com/OfficeDev/ews-java-api/wiki/Getting-Started-Guide#retrieve-all-the-items-in-the-inbox-by-groups-of-50-items

创建文件夹 https://github.com/OfficeDev/ews-java-api/wiki/Getting-Started-Guide#creating-a-folder

内容扩展 (好像可打tag) https://github.com/OfficeDev/ews-java-api/wiki/Getting-Started-Guide#extended-properties

通过itemId获取EmailMessage实例 https://github.com/OfficeDev/ews-java-api/wiki/Getting-Started-Guide#binding-to-an-existing-item

watermark https://docs.microsoft.com/zh-cn/Archive/bLOGs/exchangedev/transitioning-to-exchange-web-services-notifications process1:

依赖包中的Rule拆解:

  1. rule改为 依赖包中的rule rule.getConditions()获取匹配用到的字符串
  2. RuleActions中包含设定邮件已读,copy文件到邮箱其它目录,停止其它rule判定等

WellKnownFolderName.MsgFolderRoot 邮箱根目录

Rule包含RuleId,RuleId

事件提示: 多种的notifications 这里使用时,通过开启与关闭间加入Thread.sleep(10000),并测试发送新邮件, 其中通过stream的 PUSH的订阅模式暂时无法获取收到邮件信息

通过StreamConnection相关可以获取,开启后30分钟内有效. subscribeToPullNotifications 1-1440 24小时

通过两种方式监听最新邮件 1.长时间,间隔长,不频繁 PullSubcription 适用 2.短时间,间隔短,开关流 StreamSubcription

邮件文件夹: 文件夹创建后返回的id字符串需要保存,最长的如下: AQMkADAwATM0MDAAMS0zNjFkLTY1MWEtMDACLTAwCgAuAAADgRcCAFohSUCq+fGuJ055HwEAmSTpLTML3E+ND/s/c1xWVQAAAWrq6wAAAA== AQMkADAwATM0MDAAMS0zNjFkLTY1MWEtMDACLTAwCgAuAAADgRcCAFohSUCq+fGuJ055HwEAmSTpLTMl3E+ND/s/c1xWVQAAAWrq7QAAAA== 每次创建即使中文名称一样,id也会不同. mail_folders folder_id belong_email_id (关联email表) folder_name_code delete_flag {'folderIds':['AQMkADAwATM0MDAAMS0zNjFkLTY1MWEtMDACLTAwCgAuAAADgRcCAFohSUCq+fGuJ055HwEAmSTpLTMl3E+ND/s/c1xWVQAAAWrq6wAAAA==']} 1 {'foldernames':['attach-un-download']} 0

当邮件Rule判定邮件后,将文件分发到规定的Folder,即使用以上id ews_mail_folders 该表应该进行folder_code与folder_name的唯一约束,不过在现在创建时还没有更改到与ews_rule_folder_relation的关联 同一个rule只能对应一个folderName ews_folder_id (主键) folder_id folder_code folder_name belong_rule_id delete_flag 1 332a un-download 未下载 11 0 2 344b al-download 已下载 11 0 3 mm0 delete-junk 删除垃圾 22 0 4 mm2 move-content 观览邮件 22 0 5 332a un-download 未下载 33 (有的规则可能也会对应同样的之前的文件夹,但肯定不属于同一个主题中) 0 规则和文件夹的对应 ews_rule_folder_relation relation_id rule_id ews_folder_id delete_flag mail_id 1 11 1 2 11 2 3 22 3 4 22 4 5 33 1 6 这里33id的rule会对应再次的ews_folder_id 1, 可能两个rule_level都为1 , 而不属于同一主题 mail_id 区别是哪个邮件的, 如果两个邮件同时使用规则1以及文件夹1 则无法区分

topic_config: 1.根据给定的topic下的子规则主键来组合为一种topic_config串 (ruleId为key,ruleType为value) {'xxxkkkkkjdjj'😂','kkkjjjddd':'DC'} 以type为key,转换为map {'D':'xxxkkkkkjdjj','DC':'kkkjjjddd'} topicConfig [{'itemActionType'😂','ewsRuleId':1,'priority':1,'ruleLevel':3},{'itemActionType'😂','ewsRuleId':2,'priority':1,'ruleLevel':3}]

在topic_config中相同的rule_type只能存在一个 process2:

多邮件设定不同config初始化 ews_mail_config表 mail_id email password mail_topic_id (邮箱收件主题) delete_flag

即对应mailConfig实体类 多个mailConfig标识多个收件邮箱,每个邮箱对应不同的收件主题 不同的主题中,不为冲突

mail_config 中的其中一个邮箱对应它的一个folders,初始创建文件夹, mail_config 中的其中一个邮箱对应它的多个folders,初始创建文件夹,因为folderId占用的长度,这里考虑每个文件夹为一个单独的数据元组 如图,mail_config中一条邮箱数据对应多个规则主题,一条规则主题对应多个可创建文件夹 如图,通过mail_config拿到单条一对一的mail_topic_id,

moveToFolder: attach-un-download (folder_table)

ews_rule : folder (ews_mail_folders -> ews_folder_id)

moveToFolder 指定类型 , 每个邮箱生成的同样的类型的不同的folderId的存在rule_folder_relation

ews_mail_topic (邮箱主题) topic_id topic_name topic_desc topic_config delete_flag t1 下载附件 下载附件 {:} 0 t2 清除垃圾邮件 清除垃圾邮件 0 t3 主动发送邮件 主动发送邮件 0 如上表,不同邮箱可以对应一条相同的主题,但不能一条邮箱对应多个主题 也即是说,这个mail_topic_id加入mail_config表中存储即可. topic_config中应该进行配置,标识出这条主题中会出现的规则等级配置关联信息,来表明这条主题是不同于其它主题的主题 假设rule_level最大到3级 如topic_config根据在设定主题时选择的rule中

下表为mail_topic与rule_id的关联表 ews_topic_rule_relation relation_id topic_id rule_id rule_level priority delete_flag 1 t1 11 (筛选) 1 1 0 2 t1 22 (删除) 2 2 0 3 t2 11 (筛选) 1 1 0 其中topic对应的多个规则中,不能产生冲突,包括预设的rule_level,这个在设定rule时就进行预设, priority在进行收件主题配置时才进行设定,并且要合乎逻辑,也就是说,rule_level指定组合,priority指定顺序

README: 人总要为自己加油喝彩

1.基础表设计: SQL/schema.sql为基础数据库表设计, 其中包含4个主体:分别为 ews_mail_config>即为邮箱配置主体 ews_mail_topic>即为邮箱规则主题主体,其中一个配置主题可包含一或多条规则 ews_rule>即为邮件配置规则主表,其中根据level来断定这个rule会不会和其它的有冲突 ews_mail_folder>即为邮箱配置主题(规则)后,规则所需要用到的建立的文件夹 ews_subscription>监听表,用于存储监听时长,监听开始时间,监听主键,id等,用于取消(不过好像不太好用) 两个关联表: ews_topic_rule_relation>邮件配置主题与规则关联表,其中关联关系为,每个主题下配置的规则即使多条也不能重复rule_level ews_rule_folder_relation>规则与所需创建文件夹的关联表,其中一条规则关联到的folder不能重复

2.执行流程: (1) 通过配置好相关参数后, 如单独页面配置邮箱,为邮箱指定收件主题(下拉选择) 而收件主题需要先进行预设, 预设时是先填入收件主题相关参数,如收件主题名称,介绍,再选定相应的不同level的规则1,2,3 不同level的规则1,2,3会将对应的ruleId记录到主题config做为这条主题唯一unique的配置串(用以标识这是已经存在的主题) 而收件规则是需要先进行预设, 预设规则时填入规则名,规则对应相关conditions,actions,item_action_type,item_actions,rule_level等主要字段, 并配置关联好相应该规则对应用到的ews_mail_folder, 而ews_mail_folder需要配置好对应的相关参数,并在邮箱配置了主题后,根据主题内的一条或多条规则并规则对应到的 一个或多个文件夹folder,将其中的folder_name生成到ews远端邮箱生成该文件夹.将生成的文件夹的返回的folderId(unionId), 将其重新赋值写入数据库ews_mail_folder的folder_id字段进行存储, (2) 整体正常设定预设值之后,通过配置邮箱的规则主题topic,保存topic后根据rule对应到的要生成的文件夹生成新的文件夹到指定邮箱, 会根据该主题的topic来执行不同的ruleJob(task),比如邮件筛选标题含***字眼以及带有附件,那么移入生成后的文件夹内, 再之后每日的task(定时每日一次的)初始化邮箱的新邮件订阅(可针对多个收件邮箱生成多个,有效期最长24小时,即可每日定时执行一次), 执行完成每日的订阅后,需要等待一段时间(大概几分钟,代码里可以先不进行处理),定时从订阅中获取新邮件事件,此时已经通过订阅邮件的 指定文件夹进行了相关订阅,如"待下载附件邮件"文件夹 (3) 事件处理之后,将邮件中附件进行下载并根据ews_rule表中的item_action_type以及item_actions判定将附件下载到指定目录. 附件下载成功后,将此邮件移入"已下载附件邮件"文件夹中,流程结束

3.相关进度: (1) 前期主要完成整体根据containsSubjectString(标题包含什么字眼),以及是否包含附件(getHasAttachments())来判定了这封邮件 应该移入指定的邮件文件夹, (2) 对该文件夹进行新邮件监听,有新邮件到了,则说明是满足条件的邮件,则进行task轮询获取其中的邮件实体,附件,进行下载,再将邮件移入 已下载附件文件夹. (3) 单元测试中,对ews的Rule以及对数据库返回的Rule相关字段conditions,actions进行了转换,而再将规则设置到邮箱内时,应该再根据 priority权重来设定被设定的多条规则的优先级,这里其实priority与rule_level是类似的,priority与rule_level类似,权重在rule表中是一整个规则的权重设置, 比较难判定这个规则的先后执行顺序,而参照ews_topic_rule_relation的更改,其实也应该在设定邮件topic时,实时去指定选中规则的执行先后顺序,而先后, 必然根据priority,但是否是可以放到一起做为同一主题的规则们,则需要根据rule_level(或rule_type)进行区分,即是说,priority是指定的, 而顺序的操作也要参照可行性,而rule_level(或rule_type)是预设置的.rule_level指定组合,priority指定顺序 (4) 需要对相关数据库连接以及增删改查,联查,如获取该规则的权重priority,就从ews_topic_rule_relation进行联查priority字段后映射回rule实体类中

主体关联及流程

订阅subscription还需要进行订阅id的管理,通过对应的service进行取消订阅

文件夹/规则/订阅触发机制更改

附件下载流程 需要在TASK开始后查看该邮件对应主题中的规则的类型是否有D类型或DC类型, 如果有则进行监听UN类文件夹,UN类文件夹中包含的新邮件监听. 监听基础版:

监听高级版:

文件的收取: 所有文件会先放入整体一个临时文件夹,再将文件进行对比hash,将不重复的放入唯一一个文件夹 (implementsteam@outlook.com) AQMkADAwATM0MDAAMS0zNjFkLTY1MWEtMDACLTAwCgAuAAADgRcCAFohSUCq+fGuJ055HwEAmSTpLTMl3E+ND/s/c1xWVQAAAWrq7QAAAA== (frankimplements@outlook.com) AQMkADAwATM0MDAAMS0zNjVjLTZmODctMDACLTAwCgAuAAADRJzEnDGzDkiFHa7PpA6vRgEAL3jSJ1Y43EaEjeMalrFpowAAAiQTAAAA 简化版 简化版中不使用rule_level(rule表),topic_config(mail_topic),只先在topic中对应一条收件箱筛选含标题含附件的rule

初始化 初始化1 初始化文件夹,根据emails主题中的对应的rule中对应的folders

initFolders()

初始化2

接口:

D: /home/data/download DC: /home/data/download,/home/data/backup

1:开启 0:关闭

定时获取邮件附件并提醒通知

  1. 定时监听,只能是监听订阅开始后,才可以监听得到,所以可能需要更改原来的监听变为->监听新邮件,完成action,邮件打标记,并不移动文件夹
  2. 同时为放置监听不奏效或者程序关闭后,有累计的新邮件,还是需要在某个时间段获取新的邮件list并设置标记

UI

现在rule表中的 item_action_type 是要执行的动作规则, 而rule_type则说明规则类型 如是判定邮件情况移入指定文件夹

当选择规则的对应文件时,需要选择规则后,根据规则type或itemActionType展示folder列表

绑定关系: 选择邮箱后,绑定主题才可保存 选择主题后,选择子规则后才可保存 选择规则后,设定初始化文件夹才可保存 (需要folderId unionId的规则) (需要将folderId unionId放入rule_folder关联表做为管控)

各类数据修改时,影响的其它数据的变动:

初始化文件夹,只根据code为attach的唯一确定使用

ews报错:

Access is denied. Only the subscription owner may access the subscription. You have exceeded the available subscriptions for your account. Remove unnecessary subscriptions and try your request again. https://stackoverflow.com/questions/49309043/ews-max-subscription-limit-reached You can't enumerate active Subscriptions this has always been a pain point IMO if you have the subscriptionId's you can test if they are still valid so its generally important to Store these Id's.

solution https://docs.microsoft.com/en-us/exchange/client-developer/exchange-server-development graph https://docs.microsoft.com/zh-cn/graph/query-parameters#code-try-3 graph search 正文标题 是否包含附件 https://docs.microsoft.com/zh-cn/graph/search-query-parameter?view=graph-rest-1.0

graph maven https://docs.microsoft.com/zh-cn/graph/sdks/sdk-installation?view=graph-rest-1.0#install-the-microsoft-graph-java-sdk

com.microsoft.graph microsoft-graph 4.0.0 event https://docs.microsoft.com/zh-cn/exchange/client-developer/exchange-web-services/notification-subscriptions-mailbox-events-and-ews-in-exchange

多收件主题订阅设计

注意点:

  1. 不同规则指定的目录文件夹必须不同
  2. 不同规则可以先指定到了同一个收件文件夹
  3. 一个topic下的rule不能重复,ruleId不能重复,对应folder_code不重复(根据rule_level添加时)
  4. 根据数据库ews_exchange选择内网外网类型
  5. 30秒的每天会即时开启订阅,这里先进行了关闭,通过pullSubscription中表有今天的key才进行getSubscription
  6. 注意发件人如果是qq邮箱,要把数字和自定义更改的邮箱名都写到规则中
  7. 调整规则时,如果没有页面,需要手动更改rule,如果牵扯到更改itemActionType,则需要也将ews_mail_topic中的topicConfig进行更改
  8. 调整规则,调整邮箱,调整主题是都进行了规则/主题/订阅的更新

2处如果进行了初始化,则不需要进行再次初始化,除非规则进行了修改需要重新刷入规则 一般在执行2时,可以先不初始化订阅,但妨碍不是太大 理论上是先初始化文件夹和规则,继而订阅

发件人exception list https://docs.microsoft.com/zh-cn/exchange/client-developer/exchange-web-services/how-to-manage-inbox-rules-by-using-ews-in-exchange

多邮箱多订阅及pull改为stream订阅方式改良 https://docs.microsoft.com/zh-cn/exchange/client-developer/exchange-web-services/notification-subscriptions-mailbox-events-and-ews-in-exchange

如何关闭邮箱的特定stream订阅 https://stackoverflow.com/questions/52178314/how-to-close-a-streaming-subscription-for-a-particular-mailbox-in-ews-api

多邮箱监听的更改 多邮箱监听更改需要将对应的关联进行更改

  1. ews_mail_folder_relation 需要 再改回 ews_rule_folder_relation
  2. ews_topic_rule_relation 中topic_id和priority设为联合索引unique,即每个主题下对应的priority都是唯一的

relation_id topic_id rule_id rule_level priority delete_flag 1 t1 11 (筛选) 1 1 0 2 t1 22 (删除) 2 2 0 3 t2 11 (筛选) 1 1 0

  1. 获取emailList再开放根据类型获取如根据itemActionType来获取只是D下载的邮箱列表执行指定的下载的task

规则添加

文件夹配置

主题配置

邮箱配置

全局配置

初始化配置

[X] 1.check检查邮件与未读 itemId一致 [X] 2.相同时间有不同邮件,属于同一时间到达几率很大 [X] 3.手动拉取时,应该根据最大时间-去几分钟的时间开始拉取比较准确 [X] 4.也可以设定config中设定手动拉取时间范围,如今天

[X] 在刷入规则的同时,将刷入规则的当前规则id(unionId)和当前被刷规则的邮箱id,对应的规则,记录到关联表内 [X] 当重新刷入时,如果mail_rule_relation中没有数据,则不进行原有规则的删除,只进行新增规则刷入 [X] 如果原有mail_rule_relation中含有数据,则在取消掉原有规则时,进行ruleId(unionId)的对比, 之后进行原有规则的删除,新规则的刷入,以及新规则刷入后ruleId的写入

用户无感知版本 基于ews SearchFilterCollections

路径固定 路径固定在yml中,如果规则为旧的规则,则无法获取路径,需要在规则新增时才可配置更改

脚本宝典总结

以上是脚本宝典为你收集整理的ews全部内容,希望文章能够帮你解决ews所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。