采用模拟账号读取Exchange server未读邮件的注意事项(链接邮箱问题)【转】
最近做项目碰到Exchange中,用EWS API方法读取的未读邮箱(ConnectingIdType.PrincipalName设置该属性的方法)附带代码部分:
核心代码
using Microsoft.Exchange.WebServices.Data;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace TCL.EWS
{
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
EwsConfig config = new EwsConfig();
config.ExchangeVersion = ExchangeVersion.Exchange2010_SP2;
config.EWSServiceUrl = "https://XXX/EWS/exchange.asmx";
config.ExchangeAdministrator = "XXX";
config.ExchangeAdministratorPassword = "XXX";
config.DomainName = "XXX";
config.OtherUserName = "test003"; //下面这句屏蔽服务器证书验证,防止页面报“根据验证过程,远程证书无效”的错误
ServicePointManager.ServerCertificateValidationCallback =
delegate(Object obj, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors) { return true; };
ExchangeService service = new ExchangeService(config.ExchangeVersion);
//service.AutodiscoverUrl("test002@tcl.local");
service.Credentials = new NetworkCredential(config.ExchangeAdministrator, config.ExchangeAdministratorPassword, config.DomainName);
service.Url = new Uri(config.EWSServiceUrl);
//前提打开Exchange 2010服务器在命令行中输入:
//New-ManagementRoleAssignment -Name:impersonationAssignmentName -Role:ApplicationImpersonation -User:<UserName>
service.ImpersonatedUserId = new ImpersonatedUserId(ConnectingIdType.PrincipalName, config.OtherUserName);
int unRead = Folder.Bind(service, WellKnownFolderName.Inbox).UnreadCount;
//
HttpContext.Current.Response.Write(config.OtherUserName + "未读邮件数:" + unRead);
}
}
public struct EwsConfig
{
public ExchangeVersion ExchangeVersion;
public string EWSServiceUrl;
public string ExchangeAdministrator;
public string ExchangeAdministratorPassword;
public string DomainName;
public string OtherUserName;
}
}
一直提示:The impersonation principal name is invalid。

但是有的邮箱却可以用进行访问。百思不得其解,后来发现原来:test003@xxx.com是链接邮箱,用service.ImpersonatedUserId = new ImpersonatedUserId(ConnectingIdType.PrincipalName, config.OtherUserName);是无法访问到的。
什么是链接邮箱?
答:链接邮箱是与外部帐户关联的邮箱。要将邮箱与外部帐户关联,可以资源林方案为例。在资源林方案中,Exchange 林中的用户对象具有邮箱,但这些用户对象无法登录。必须将 Exchange 林中那些禁用用户帐户与外部帐户林中的启用用户帐户相关联。
后来查询了MSDN,改用service.ImpersonatedUserId = new ImpersonatedUserId(ConnectingIdType.SmtpAddress, config.OtherUserName);可以进行访问,这样就解决了链接邮箱和用户邮箱的问题,可以正常读取未读邮件。代码部分如下:
using Microsoft.Exchange.WebServices.Data;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace TCL.EWS
{
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
EwsConfig config = new EwsConfig();
config.ExchangeVersion = ExchangeVersion.Exchange2010_SP2;
config.EWSServiceUrl = "https://XXX/EWS/exchange.asmx";
config.ExchangeAdministrator = "XXX";
config.ExchangeAdministratorPassword = "XXX";
config.DomainName = "XXXX";
//必须设置成邮箱,不用是用户
config.OtherUserName = "test003@XXX.XXX"; //下面这句屏蔽服务器证书验证,防止页面报“根据验证过程,远程证书无效”的错误
ServicePointManager.ServerCertificateValidationCallback =
delegate(Object obj, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors) { return true; };
ExchangeService service = new ExchangeService(config.ExchangeVersion);
//service.AutodiscoverUrl("test002@tcl.local");
service.Credentials = new NetworkCredential(config.ExchangeAdministrator, config.ExchangeAdministratorPassword, config.DomainName);
service.Url = new Uri(config.EWSServiceUrl);
//前提打开Exchange 2010服务器在命令行中输入:
//New-ManagementRoleAssignment -Name:impersonationAssignmentName -Role:ApplicationImpersonation -User:<UserName>
//必须设置ConnectingIdType.SmtpAddress
service.ImpersonatedUserId = new ImpersonatedUserId(ConnectingIdType.SmtpAddress, config.OtherUserName);
int unRead = Folder.Bind(service, WellKnownFolderName.Inbox).UnreadCount;
//
HttpContext.Current.Response.Write(config.OtherUserName + "未读邮件数:" + unRead);
}
}
public struct EwsConfig
{
public ExchangeVersion ExchangeVersion;
public string EWSServiceUrl;
public string ExchangeAdministrator;
public string ExchangeAdministratorPassword;
public string DomainName;
public string OtherUserName;
}
}
采用模拟账号读取Exchange server未读邮件的注意事项(链接邮箱问题)【转】的更多相关文章
- 一种读取Exchange的用户未读邮件数方法!
已好几个月没写博客了,由于之前忙于开发基于Sharepoint上的移动OA(AgilePoint)和采用混合移动开发技术开发一个安卓版的企业通讯录APP(数据与lync一致),并于1月初正式上线.马年 ...
- outlook——还原“未读邮件”文件夹
参考链接:http://office.microsoft.com/zh-cn/outlook-help/HA010283248.aspx 摘抄: 还原“未读邮件”文件夹 全部显示 全部隐藏 “未读邮件 ...
- 利用腾讯企业邮箱开放API获取账户未读邮件数初探
公司一直使用腾讯提供的免费企业邮箱服务,今天用管理员帐户登录后发现,原来现在腾讯的企业邮箱也开放了部分API 你可以通过开放接口实现以下功能: 数据同步 数据同步可以帮助你同步部门成员信息,你还可以创 ...
- dovecot--查询未读邮件个数
最近负责的邮箱系统项目中有一个这样的需求:提供一个接口给业务层,可以通过邮箱查询到该用户的未读邮件个数. 之前的方案是通过查看用户目录下.INBOX/new目录中的文件个数,但是这个方法不准确,当有用 ...
- Outlook查找未读邮件
1.查找新邮件的未读邮件,可以在下图中查找 2.恢复已删除邮件,如果邮件是未读邮件,在上图中是查找不到,只能通过视图去查找 步骤2内容摘自百度
- MailKit---如何知道文件夹下有多少封未读邮件
如果在mailkit中,文件夹已经选中并打开了的话,那直接使用ImapFolder.Unread属性就可以获取到有多少封未读邮件了. 如果文件夹没有打开,那么你还可以使用查询状态的方法来获取未读状态的 ...
- ExchangeServeice获取在线outlook邮箱中的未读邮件
using Microsoft.Exchange.WebServices.Data; using System; using System.Collections.Generic; using Sys ...
- 读取Exchange的用户未读邮件数的几种方法
[http://www.cnblogs.com/nbpowerboy/p/3539422.html] 可以使用ExchangeServiceBinding获取邮件,他相当于outlook, 来获取服务 ...
- .NET C# 使用S22.Imap.dll接收邮件 并且指定收取的文件夹的未读邮件,并且更改未读准态
string host = Conf.ConfigInfo.POP_Host; int port = Conf.ConfigInfo.POP_Port; string username =Conf.C ...
随机推荐
- Struts2不扫描jar包中的action
今天在做一个二开的项目,将struts打成jar包放在WEB-INF的目录下却扫描不到指定的路径,也就是http访问访问不到我们指定的action,其他代码可以正常使用,就是访问不到action.st ...
- mysql percona安装
注:此方式目前安装存在问题(弃用此方式) 1.在官方网站下载percona XtraBackup https://www.percona.com/downloads/XtraBackup/LATES ...
- 内核早期内存分配器:memblock
内核早期内存分配器:memblockLinux内核使用伙伴系统管理内存,那么在伙伴系统工作前,如何管理内存?答案是memblock.memblock在系统启动阶段进行简单的内存管理,记录物理内存的使用 ...
- python3 str.format()的使用
基本格式 {字段名!转换字段:格式说明符} 字段名:省略:数字:变量名 'name is {}, age is {}'.format('peter',25) 'name is {1}, age is ...
- 解决华为手机无法输出Debug级别log的问题
近期购入了新款的华为手机荣耀8,手感.性能.颜值都非常好.作为android开发工程师,自然会用到真机进行日常的调试.然而,这部手机并没有这么“听话“!反复尝试开启开发者选项中的设置项,依旧无法输出L ...
- JavaEE-案例1-网站信息展示
案例1-网站信息展示 需求: 在页面上展示一些文字信息,需要排版. 技术分析: html:超文本 标签 语言 作用:展示 超文本:超越了一般文本,描述文本的字体.颜色.图片 标签:标记 html书写规 ...
- shell加密
如何保护自己编写的shell程序要保护自己编写的shell脚本程序,方法有很多,最简单的方法有两种:1.加密 2.设定过期时间,下面以shc工具为例说明: 一.下载安装shc工具shc是一个加密she ...
- ***文件上传控件bootstrap-fileinput的使用和参数配置说明
特别注意: 引入所需文件后页面刷新查看样式奇怪,浏览器提示错误等,可能是因为js.css文件的引用顺序问题,zh.js需要在fileinput.js后面引入.bootstrap最好在filein ...
- js文件的版本控制
使用grunt完成requirejs的合并压缩和js文件的版本控制 最近有一个项目使用了 requirejs 来解决前端的模块化,但是随着页面和模块的越来越多,我发现我快要hold不住这些可爱的j ...
- angular和vue双向数据绑定
angular和vue双向数据绑定的原理(重点是vue的双向绑定) 我在整理javascript高级程序设计的笔记的时候看到面向对象设计那章,讲到对象属性分为数据属性和访问器属性,我们平时用的js对象 ...