摘要

之前做的邮件提醒的项目,最近需要优化,由于使用了队列,但即时性不是特别好,有队列,就会出现先后的问题,最近调研了exchange 流通知的模式,所以想使用流通知模式和原先的拉取邮件的方法结合,在收到新邮件的时候,通过SyncFolderItems方法拉取当前状态下的所有邮件。

遇到的问题

在使用流通知模式的时候,发现经常会出现下面的错误:

Microsoft.Exchange.WebServices You must add at least one subscription to this connection before it can be opened.

经常会出现丢订阅对象的问题,虽然可以通过重新初始化订阅对象,解决该问题,但在初始化过程中,如果有新邮件,那么就会出现丢邮件现象。那么就想到了将流式通知和SyncFolderItems方法结合的方式,SyncFolderItems放需要传递邮件同步的状态(即邮件读取到具体位置的一个指针),那么每次有新邮件的时候,触发NewMail事件,可以在这时通过SyncFolderItems拉取上次保存的state之后的所有邮件。核心代码块如下:

 private void OnNotificationEvent(object sender, NotificationEventArgs args)
{
if (args != null)
{
foreach (NotificationEvent notificationEvent in args.Events)
{
if (notificationEvent is ItemEvent)
{
try
{
ItemEvent itemEvent = (ItemEvent)notificationEvent;
Console.WriteLine(notificationEvent.EventType.ToString());
Item item = Item.Bind(this._service, itemEvent.ItemId);
switch (notificationEvent.EventType)
{
case EventType.Moved:
Console.WriteLine(item.Subject);
string emialId = MD5Helper.GetMD5FromString(item.Id.UniqueId);
TriggerLogHandler(new LogModel { Op = "delete_email",
Content = JsonConvert.SerializeObject(new { id = emialId, subject = item.Subject }) }, LogType.Info);
_exchangeMailBusiness.UpdateIsDeletedAsync(emialId, true);
break;
case EventType.NewMail:
//如果有新邮件,触发同步,拉取该状态下所有邮件
ChangeCollection<ItemChange> iccEmail =
this._service.SyncFolderItems(new FolderId(WellKnownFolderName.Inbox), PropertySet.FirstClassProperties, null,
, SyncFolderItemsScope.NormalItems, mailSyncState.SyncState);
....
.....这里处理该状态下所有的邮件
...
break;
default:
break;
}
}
catch (Exception ex)
{
TriggerErrorAndUnautorizedHandler(ex, "load_email_field");
}
} }
}
}

这样可以解决丢邮件的问题,比通过SyncFolderItems方法不停轮询exchange服务器,性能上应该好很多。

总结

有关其它详情,可以查看我写的几篇关于EWS的相关文章。

EWS 邮件提醒的更多相关文章

  1. c#之Redis队列在邮件提醒中的应用

    场景 有这样一个场景,一个邮件提醒的windows服务,获取所有开启邮件提醒的用户,循环获取这些用户的邮件,发送一条服务号消息.但问题来了,用户比较少的情况下,轮询一遍时间还能忍受,如果用户多了,那用 ...

  2. 2.jenkins配置邮件提醒

    1.前言 在Jenkins的使用中邮件提醒是一个常用功能,Jenkins默认安装了Mailer Plugin插件用于实现此功能. 2.邮件服务器配置 首先在Jenkins的"系统管理&quo ...

  3. WordPress设置固定链接和邮件提醒遇到的问题

    固定链接1.WordPress根目录下有一个.h...文件,记录文章链接类型对应的配置,要保证该文件的可写全权限:2.设置Apache2的rewrite模块启动,/etc/apache2/modle- ...

  4. Python 实现接口类的两种方式+邮件提醒+动态导入模块+反射(参考Django中间件源码)

    实现接口类的两种方式 方式一 from abc import ABCMeta from abc import abstractmethod class BaseMessage(metaclass=AB ...

  5. Python-定时爬取指定城市天气(二)-邮件提醒

    目录 一.概述 二.模块重新划分 三.优化定时任务 四.发送邮件 五.源代码 一.概述 上一篇文章python-定时爬取指定城市天气(一)-发送给关心的微信好友中我们讲述了怎么定时爬取城市天气,并发送 ...

  6. Jenkins使用QQ邮箱构建邮件提醒服务

    前置条件: 已安装好Jenkins服务端 步骤: 访问Jenkins服务端(ip+端口),登录Jenkins 点击系统管理 选择管理插件 选择可选插件 搜索Mailer Plugin 点击直接安装 点 ...

  7. gitlab11.5.4 配置邮件提醒

    gitlab 配置邮件提醒 gitlab_rails['smtp_enable'] = true gitlab_rails['smtp_address'] = "smtp.qiye.163. ...

  8. Azure虚机磁盘容量警报(邮件提醒)

    上周有个客户提出这样的需求:根据虚拟机磁盘的实际使用量,当达到某一阈值时设置邮件提醒. 在这个需求中我们只需要解决两点问题: 计算虚拟机磁盘实际使用量 发送邮件 使用VS新建一个名为Calculate ...

  9. shell脚本-监控及邮件提醒

    首先写一个邮件提醒python文件 #!/usr/bin/python # -*- coding: UTF-8 -*- import sys import smtplib import email.m ...

随机推荐

  1. 从NetCore报错到MySql安全

    之前项目在测试服务器上的一些接口时不时会报出下面的错误:(采用Abp框架) "SocketException: 你的主机中的软件中止了一个已建立的连接. STACK TRACE: at My ...

  2. mysql存储过程双重循环示例

    BEGIN ); DECLARE done INT DEFAULT FALSE; DECLARE cursor_rule CURSOR FOR SELECT s.id FROM d_menu_type ...

  3. Windows Phone开发手记-WinRT下分组拼音的实现

    Windows Phone版本号自升入8.1以来,开发者就多了一个选项,开发基于WinRT架构的WP或者Universal Windows App.然而开发框架转为WinRT后,很多原有的WP8基于S ...

  4. Apache JMeter的基本使用

    安装 安装地址:http://jmeter.apache.org/download_jmeter.cgi 解压后运行jmeter.bat的批处理文件就可以了 JMeter测试脚本编写: 1,创建线程组 ...

  5. POJ 2562

    #include<iostream> #include<algorithm> #define MAXN 15 using namespace std; //int rec[MA ...

  6. Flask-socketio聊天室 (附源码)

    `* A Chat Room Completed with Flask-socketio 功能: 实时消息更新,实时用户上线显示 快捷注册 快捷登陆 表情支持 截图: 使用方法: 安装依赖:pip i ...

  7. vue教程2-07 自定义指令

    vue教程2-07 自定义指令 自定义指令: 一.属性: Vue.directive(指令名称,function(参数){ this.el -> 原生DOM元素 }); <div v-re ...

  8. android自定义控件 几种方式总结

    方式1:不继承任何组件 , 直接在代码里面调用实例化.public class ProgressDialog { private Dialog dialog; public ProgressDialo ...

  9. 【原创】SQL Server 性能调优读书笔记

    CPU 100%: 有时可能是硬盘性能不足,或者内存容量不够,让CPU一直忙于I/O. 导致性能问题的一些因素: 用户习惯:在运行尖峰时刻做一些不必做但消耗资源的事情,如之行数据库完整备份,如在服务器 ...

  10. Xamarin中 ios 修改Assets.xcassets 文件后 无法调试和编译

    根本问题是因为 vs项目里面 没有包含 如果提示找不到对应png 请检查 iOS 项目卸载后 编辑 并找到对应文件检查 <ImageAsset Include="Assets.xcas ...