采用模拟账号读取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 ...
随机推荐
- USB的挂起和唤醒(Suspend and Resume)【转】
转自:http://m.blog.csdn.net/blog/luckywang1103/25244091 USB协议的第9章讲到USB可见设备状态[Universal Serial Bus Spec ...
- linux sftp安装【转】
工具:虚拟机:VMware Workstation Pro.操作系统:CentOS-6.4-x86_64-minimal.终端模拟器:Xshell 5 .ftp:filezilla 一.让虚拟机联网 ...
- Nginx报错:upstream timed out (110: Connection timed out)和client intended to send too large body【转】
nginx日志报错 2018/01/26 16:36:49 [error] 23327#0: *54953 upstream timed out (110: Connection timed out) ...
- Android Studio之代码提示快捷键冲突设置
1.原代码提示快捷键为:Ctrl+空格,与Windows输入法冲突,所以将代码提示快捷键设置为:Ctrl+反斜杠.
- springcloud搭建服务注册中心与服务发现
1.创建服务注册中心 创建一个普通的Spring Boot工程 首先我们需要创建一个普通的Spring Boot工程,命名为eureka-server,普通到什么程度呢?就是一个starter都不需要 ...
- JMeter出现“the target server failed to respond“的解决办法
今天用jmeter压测执行过程中遇到一个报错如下: 解决方案如下: 1. 修改执行计划中,HTTP请求的Implementation为HttpClient4. 2. 保存执行计划 3. 修改JMete ...
- laravel中短信发送验证码的实现方法
在阿里云上开通短信服务后需要做的: 1,申请签名 2,申请模板 3,创建Accesskey ,值得说的是,可以通过阿里云提供的子用户进行Accesskey的创建,这样可以更安全 4,充值 larave ...
- docker 的简单操作
一直说更博,但是一直在delay.... 最近一直用到docker,所以就总结一下吧! docker的介绍 Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源. ...
- 【pytorch】pytorch学习笔记(一)
原文地址:https://pytorch.org/tutorials/beginner/deep_learning_60min_blitz.html 什么是pytorch? pytorch是一个基于p ...
- 【LOJ】#2548. 「JSOI2018」绝地反击
题解 卡常卡不动,我自闭了,特判交上去过了 事实上90pts= = 我们考虑二分长度,每个点能覆盖圆的是一段圆弧 然后问能不能匹配出一个正多边形来 考虑抖动多边形,多边形的一个端点一定和圆弧重合 如果 ...