最近做项目碰到Exchange中,用EWS API方法读取的未读邮箱(ConnectingIdType.PrincipalName设置该属性的方法)附带代码部分:

核心代码

  1. using Microsoft.Exchange.WebServices.Data;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Net;
  6. using System.Net.Security;
  7. using System.Security.Cryptography.X509Certificates;
  8. using System.Web;
  9. using System.Web.UI;
  10. using System.Web.UI.WebControls;
  11. namespace TCL.EWS
  12. {
  13. public partial class _Default : System.Web.UI.Page
  14. {
  15. protected void Page_Load(object sender, EventArgs e)
  16. {
  17. EwsConfig config = new EwsConfig();
  18. config.ExchangeVersion = ExchangeVersion.Exchange2010_SP2;
  19. config.EWSServiceUrl = "https://XXX/EWS/exchange.asmx";
  20. config.ExchangeAdministrator = "XXX";
  21. config.ExchangeAdministratorPassword = "XXX";
  22. config.DomainName = "XXX";
  23. config.OtherUserName = "test003";
  24.  
  25. //下面这句屏蔽服务器证书验证,防止页面报“根据验证过程,远程证书无效”的错误
  26. ServicePointManager.ServerCertificateValidationCallback =
  27. delegate(Object obj, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors) { return true; };
  28. ExchangeService service = new ExchangeService(config.ExchangeVersion);
  29. //service.AutodiscoverUrl("test002@tcl.local");
  30. service.Credentials = new NetworkCredential(config.ExchangeAdministrator, config.ExchangeAdministratorPassword, config.DomainName);
  31. service.Url = new Uri(config.EWSServiceUrl);
  32. //前提打开Exchange 2010服务器在命令行中输入:
  33. //New-ManagementRoleAssignment -Name:impersonationAssignmentName -Role:ApplicationImpersonation -User:<UserName>
  34. service.ImpersonatedUserId = new ImpersonatedUserId(ConnectingIdType.PrincipalName, config.OtherUserName);
  35. int unRead = Folder.Bind(service, WellKnownFolderName.Inbox).UnreadCount;
  36. //
  37. HttpContext.Current.Response.Write(config.OtherUserName + "未读邮件数:" + unRead);
  38. }
  39. }
  40. public struct EwsConfig
  41. {
  42. public ExchangeVersion ExchangeVersion;
  43. public string EWSServiceUrl;
  44. public string ExchangeAdministrator;
  45. public string ExchangeAdministratorPassword;
  46. public string DomainName;
  47. public string OtherUserName;
  48. }
  49. }

一直提示: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);可以进行访问,这样就解决了链接邮箱和用户邮箱的问题,可以正常读取未读邮件。代码部分如下:

  1. using Microsoft.Exchange.WebServices.Data;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Net;
  6. using System.Net.Security;
  7. using System.Security.Cryptography.X509Certificates;
  8. using System.Web;
  9. using System.Web.UI;
  10. using System.Web.UI.WebControls;
  11. namespace TCL.EWS
  12. {
  13. public partial class _Default : System.Web.UI.Page
  14. {
  15. protected void Page_Load(object sender, EventArgs e)
  16. {
  17. EwsConfig config = new EwsConfig();
  18. config.ExchangeVersion = ExchangeVersion.Exchange2010_SP2;
  19. config.EWSServiceUrl = "https://XXX/EWS/exchange.asmx";
  20. config.ExchangeAdministrator = "XXX";
  21. config.ExchangeAdministratorPassword = "XXX";
  22. config.DomainName = "XXXX";
  23. //必须设置成邮箱,不用是用户
  24. config.OtherUserName = "test003@XXX.XXX";
  25.  
  26. //下面这句屏蔽服务器证书验证,防止页面报“根据验证过程,远程证书无效”的错误
  27. ServicePointManager.ServerCertificateValidationCallback =
  28. delegate(Object obj, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors) { return true; };
  29. ExchangeService service = new ExchangeService(config.ExchangeVersion);
  30. //service.AutodiscoverUrl("test002@tcl.local");
  31. service.Credentials = new NetworkCredential(config.ExchangeAdministrator, config.ExchangeAdministratorPassword, config.DomainName);
  32. service.Url = new Uri(config.EWSServiceUrl);
  33. //前提打开Exchange 2010服务器在命令行中输入:
  34. //New-ManagementRoleAssignment -Name:impersonationAssignmentName -Role:ApplicationImpersonation -User:<UserName>
  35. //必须设置ConnectingIdType.SmtpAddress
  36. service.ImpersonatedUserId = new ImpersonatedUserId(ConnectingIdType.SmtpAddress, config.OtherUserName);
  37. int unRead = Folder.Bind(service, WellKnownFolderName.Inbox).UnreadCount;
  38. //
  39. HttpContext.Current.Response.Write(config.OtherUserName + "未读邮件数:" + unRead);
  40. }
  41. }
  42. public struct EwsConfig
  43. {
  44. public ExchangeVersion ExchangeVersion;
  45. public string EWSServiceUrl;
  46. public string ExchangeAdministrator;
  47. public string ExchangeAdministratorPassword;
  48. public string DomainName;
  49. public string OtherUserName;
  50. }
  51. }

采用模拟账号读取Exchange server未读邮件的注意事项(链接邮箱问题)【转】的更多相关文章

  1. 一种读取Exchange的用户未读邮件数方法!

    已好几个月没写博客了,由于之前忙于开发基于Sharepoint上的移动OA(AgilePoint)和采用混合移动开发技术开发一个安卓版的企业通讯录APP(数据与lync一致),并于1月初正式上线.马年 ...

  2. outlook——还原“未读邮件”文件夹

    参考链接:http://office.microsoft.com/zh-cn/outlook-help/HA010283248.aspx 摘抄: 还原“未读邮件”文件夹 全部显示 全部隐藏 “未读邮件 ...

  3. 利用腾讯企业邮箱开放API获取账户未读邮件数初探

    公司一直使用腾讯提供的免费企业邮箱服务,今天用管理员帐户登录后发现,原来现在腾讯的企业邮箱也开放了部分API 你可以通过开放接口实现以下功能: 数据同步 数据同步可以帮助你同步部门成员信息,你还可以创 ...

  4. dovecot--查询未读邮件个数

    最近负责的邮箱系统项目中有一个这样的需求:提供一个接口给业务层,可以通过邮箱查询到该用户的未读邮件个数. 之前的方案是通过查看用户目录下.INBOX/new目录中的文件个数,但是这个方法不准确,当有用 ...

  5. Outlook查找未读邮件

    1.查找新邮件的未读邮件,可以在下图中查找 2.恢复已删除邮件,如果邮件是未读邮件,在上图中是查找不到,只能通过视图去查找 步骤2内容摘自百度

  6. MailKit---如何知道文件夹下有多少封未读邮件

    如果在mailkit中,文件夹已经选中并打开了的话,那直接使用ImapFolder.Unread属性就可以获取到有多少封未读邮件了. 如果文件夹没有打开,那么你还可以使用查询状态的方法来获取未读状态的 ...

  7. ExchangeServeice获取在线outlook邮箱中的未读邮件

    using Microsoft.Exchange.WebServices.Data; using System; using System.Collections.Generic; using Sys ...

  8. 读取Exchange的用户未读邮件数的几种方法

    [http://www.cnblogs.com/nbpowerboy/p/3539422.html] 可以使用ExchangeServiceBinding获取邮件,他相当于outlook, 来获取服务 ...

  9. .NET C# 使用S22.Imap.dll接收邮件 并且指定收取的文件夹的未读邮件,并且更改未读准态

    string host = Conf.ConfigInfo.POP_Host; int port = Conf.ConfigInfo.POP_Port; string username =Conf.C ...

随机推荐

  1. USB的挂起和唤醒(Suspend and Resume)【转】

    转自:http://m.blog.csdn.net/blog/luckywang1103/25244091 USB协议的第9章讲到USB可见设备状态[Universal Serial Bus Spec ...

  2. linux sftp安装【转】

    工具:虚拟机:VMware Workstation Pro.操作系统:CentOS-6.4-x86_64-minimal.终端模拟器:Xshell 5 .ftp:filezilla 一.让虚拟机联网 ...

  3. 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) ...

  4. Android Studio之代码提示快捷键冲突设置

    1.原代码提示快捷键为:Ctrl+空格,与Windows输入法冲突,所以将代码提示快捷键设置为:Ctrl+反斜杠.

  5. springcloud搭建服务注册中心与服务发现

    1.创建服务注册中心 创建一个普通的Spring Boot工程 首先我们需要创建一个普通的Spring Boot工程,命名为eureka-server,普通到什么程度呢?就是一个starter都不需要 ...

  6. JMeter出现“the target server failed to respond“的解决办法

    今天用jmeter压测执行过程中遇到一个报错如下: 解决方案如下: 1. 修改执行计划中,HTTP请求的Implementation为HttpClient4. 2. 保存执行计划 3. 修改JMete ...

  7. laravel中短信发送验证码的实现方法

    在阿里云上开通短信服务后需要做的: 1,申请签名 2,申请模板 3,创建Accesskey ,值得说的是,可以通过阿里云提供的子用户进行Accesskey的创建,这样可以更安全 4,充值 larave ...

  8. docker 的简单操作

    一直说更博,但是一直在delay.... 最近一直用到docker,所以就总结一下吧! docker的介绍 Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源. ...

  9. 【pytorch】pytorch学习笔记(一)

    原文地址:https://pytorch.org/tutorials/beginner/deep_learning_60min_blitz.html 什么是pytorch? pytorch是一个基于p ...

  10. 【LOJ】#2548. 「JSOI2018」绝地反击

    题解 卡常卡不动,我自闭了,特判交上去过了 事实上90pts= = 我们考虑二分长度,每个点能覆盖圆的是一段圆弧 然后问能不能匹配出一个正多边形来 考虑抖动多边形,多边形的一个端点一定和圆弧重合 如果 ...