zoukankan      html  css  js  c++  java
  • 使用EWS访问Exchange邮件

         今天实验了一下使用EWS访问exchange邮件,网上说的都很简单,可我却是碰到了N多问题啊,不过最终还是成功了,也不枉我加班了。把一些方法及遇到的问题记录下来,希望对有类似exchange功能开发需求的人有所帮助。

         第一步是下载Exchange Web Services Managed API,这个DLL封装了很多对EWS的访问,比起直接使用EWS生成的代理类,那是方便多了,下载地址:

              http://www.microsoft.com/downloads/en/details.aspx?FamilyID=c3342fb3-fbcc-4127-becf-872c746840e1

         使用EWS的代码示例网上有不少,微软站点上也有,博客园里有两篇关于这个的介绍(下篇未给出链接):

              http://www.cnblogs.com/diaojia/archive/2010/10/19/1855839.html

        代码还是比较简单的,在此我贴上我的测试代码:

        public class AccessInfo
        {
            public string UserName;
            public string Password;
            public string Domain;
            public string ServerUrl;
            public string Email;
        }
    
        class Program
        {
            static void Main(string[] args)
            {
                AccessInfo info = new AccessInfo()
                {
                    UserName = "administrator",
                    Password = "p@ssw0rd",
                    Domain = "contoso.com",
                    ServerUrl = "https://contoso-exchange.contoso.com/ews/Exchange.asmx                Email = "administrator@contoso.com"
                };
    
                ReadMail(info);
                Console.Read();
            }
    
            static void ReadMail(AccessInfo Info)
            {
                //ExchangeService版本为2010 
                ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2010);
    
                //参数是用户名,密码,域 
                service.Credentials = new WebCredentials(Info.UserName, Info.Password, Info.Domain);
    
                //给出Exchange Server的URL http://xxxxxxx
                service.Url = new Uri(Info.ServerUrl);
    
                //你自己的邮件地址 xxx@xxx.xxx 
                //service.AutodiscoverUrl(Info.Email);
    
                //创建过滤器, 条件为邮件未读. 
                SearchFilter sf = new SearchFilter.IsEqualTo(EmailMessageSchema.IsRead, false);
    
                //查找Inbox,加入过滤器条件,结果10条 
                FindItemsResults<Item> findResults = null;
                try
                {
                    findResults = service.FindItems(WellKnownFolderName.Inbox, sf, new ItemView(10));
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
    
                foreach (Item item in findResults.Items)
                {
    
                    EmailMessage email = EmailMessage.Bind(service, item.Id);
                    Console.WriteLine(email.Subject);
                }
            }
        }",
    
     
        这段代码是最终测试成功的代码,下面列一下碰到过的问题。
        1、在service.AutodiscoverUrl(Info.Email)处出现异常:AutodiscoverUrl could not be located
        这个问题最终没有得到根本解决,我只是简单的把这一行注释了,因为我想既然显示的指定了service.Url,那也就没必要autodiscover了;
       
        2、在service.FindItems(WellKnownFolderName.Inbox, sf, new ItemView(10))处出现异常,提示Http404错误
        这个问题郁闷了很久,因为写的URL明明是没有错的,在浏览器中都可以访问,也可以使用它来生成代理类,后面将要放弃的时候,找到了跟我有同样遭遇的人写
    的帖子:http://www.cnblogs.com/Bear-Study-Hard/archive/2010/10/11/1847824.html。(又是博客园),里头说到是因为EWS站点禁用了SSL的缘故。的确
    我的EWS站点也是禁用了SSL的,我比较不喜欢在浏览器里访问时老提示证书无效的警告。于是乎把SSL加上了,同时把http改为https(一开始测试是写的http)。
     
        3、启用了SSL,在FindItems的时候提示“未能为SSL/TLS安全通道建立信任关系”。
        完了,证书的问题来了,我一直都不明白的东西,始终不清楚怎样为IIS站点设置证书,以及客户端安装证书。google到了两篇文章,一篇是win2003 IIS6的,
    一篇是win2008 IIS7的:
            win2003 IIS6:http://www.cnblogs.com/kimzeng/archive/2009/12/17/1626171.html
            win2008 IIS7:http://blog.csdn.net/steel_ligang/archive/2009/09/25/4593102.aspx
        在此我要鄙视一下MS,两代产品之间老是搞颠覆性的操作方式。两篇文章里介绍了很多,但都同时缺少了关于怎样提交所申请的证书,以及如何获取到颁发的证书的
    操作。下面简单介绍一下:
     
        提交申请的证书
        在浏览器中打开:http://contoso.com/certsrv/,其中contoso.com是CA服务器机器名,也就是域控机器名,界面类似如下图所示:
     

    image

          点击“申请一个证书”,然后选择“高级证书申请”,然后再选择“使用 base64 编码的 CMC 或 PKCS #10 文件提交 一个证书申请,或使用 base64 编码的 PKCS #7 文件续订证书申请。”,最中打开的页面如下图所示:

    image

         在上面的文本框里贴上生成的HASH码文本文件里的所有内容,然后点击提交,证书申请动作才算完成。

         之后打开证书颁发机构,找到“挂起的申请”,然后在右边的列表里找到申请的证书,右击——所有任务——颁发,就完成了。

         新申请的证书可到证书管理首页(http://contoso.com/certsrv/)里选择“查看挂起的证书申请的状态”,在接下来的页面里有下载链接提供。

         在此我要提醒一下,必须在安装证书服务之前安装IIS,否则就没有WEB上的证书服务页面。

         回到第3点提到的问题,在折腾了很长时间之后,在我的IIS里依然没有成功的加上证书。后面找到了微软的一篇文章:

             http://support.microsoft.com/kb/981954/zh-cn

         里面提到了关键的一点:过程中创建一个自签名或 $ self-issued 的根证书。尽管这一句并不是出现在这篇文章里所描述的解决办法里,然而却提醒了我,可以为IIS

    创建一个自签名的证书,或许有用。IIS7中服务器证书管理界面中就有创建自签名证书的功能,过程就不细说了。创建完成之后,记得更改EWS站点所绑定的证书为刚才所创建的证书。更改之后,请确保程序中指定的服务URL域名与证书中的“颁发给”属性一致。

         最后一点要提醒的,不要随便为EWS站点添加主机头,那将可能会导致EWS无法启动,除非你对WCF的配置文件很熟悉。

  • 相关阅读:
    【leetcode】1020. Partition Array Into Three Parts With Equal Sum
    【leetcode】572. Subtree of Another Tree
    【leetcode】123. Best Time to Buy and Sell Stock III
    【leetcode】309. Best Time to Buy and Sell Stock with Cooldown
    【leetcode】714. Best Time to Buy and Sell Stock with Transaction Fee
    【leetcode】467. Unique Substrings in Wraparound String
    【leetcode】823. Binary Trees With Factors
    【leetcode】143. Reorder List
    【leetcode】1014. Capacity To Ship Packages Within D Days
    【leetcode】1013. Pairs of Songs With Total Durations Divisible by 60
  • 原文地址:https://www.cnblogs.com/sdlfx/p/1987464.html
Copyright © 2011-2022 走看看