Windows Server 2008 R2 配置Exchange 2010邮件服务器并使用EWS发送邮件

配置环境 配置环境完全在此前一篇文章搭建好的环境下进行配置: http://www.cnblogs.com/zhongweiv/archive/2013/01/04/win2008_addomain_configuration.html Windows版本:Windows Server 2008 R2 Enterprise                      Service Pack 1 系统类型:       64 位操作系统 所在域:          adserv.com Exchange版本:Exchange Server 2010 (x64) - DVD (Chinese-Simplified, Chinese-Traditional, English, French, German, Italian, Japanese, Korean, Portuguese-Brazil, Russian, and Spanish) 安装准备

  1. 安装DNS服务器
  2. 安装AD域服务
  3. 安装IIS
  4. 安装.NetFramework 3.5 SP1

     安装准备第1、2、3步都在此前的文章中有详细的安装步骤和配置方法: http://www.cnblogs.com/zhongweiv/archive/2013/01/04/win2008_addomain_configuration.html http://www.cnblogs.com/zhongweiv/archive/2013/01/07/https.html 安装准备第4步 .NetFramework 3.5 SP1 不是必须的,Exchange Server 2010安装时会做检查,可以在安装Exchange Server 2010时同步安装. 安装Exchange Server 2010 我这里是ISO文件,我在直用虚机中的光驱加载,并点击运行 Setup.EXE 步骤 1、2都是灰色的,我提前安装了.Net Framework 3.5 SP1,Windows Server 2008 R2自带安装了Windows PowerShell V2 单独下载地址: http://www.microsoft.com/zh-cn/download/details.aspx?id=25150 http://support.microsoft.com/kb/968929/zh-cn 步骤 3: 选择 Exchange 语言选项           点击“仅从 DVD 安装语言” 步骤 4: 安装 Microsoft Exchange           点击后出现复制窗口 复制完成,初始化好安装程序,会出现Exhcange Server 2010安装界面 点击“下一步”按钮 选择"我接受许可协议中的条款",点击“下一步”按钮 点击“下一步”按钮 点击“下一步按钮” 输入Exchange 组织名称,点击“下一步”按钮 勾选上"客户端访问角色将面向 Internet"  (如果只供内网访问,可以不勾选) 输入域名,点击“下一步”按钮 这一步随自已选择,然后点击“下一步”按钮,进入“准备情况检查” 出现3个警告和1个错误  ①警告:组织先决条件   解法方法:忽略  ②警告:集线器传输角色 先决条件   解决方法:按照提示去 http://go.microsoft.com/fwlink/?LinkID=123380 下载 FilterPackx64.exe ,并安装它.  ③警告:邮箱角色 先决条件  ④错误:客户端访问 先决条件   解决方法:开始菜单--->管理工具--->服务--->找到“Net.Tcp Port Sharing Service”--->启动类型设为“自动”,并且启用此服务 进行上面这些操作之后,重启服务器,再运行Exchange Server 2010安装程序! 点击“安装”按钮, 安装时间可能比较长. 点击完成. 配置连接器  当Exchange Server 2010安装完成后,会自动弹出 Exchange 管理控制台 新建"发送连接器" 在左侧控制台树,中选择Microsoft Exchange--->Microsoft Exchange的内部部署--->组织配置--->集线器传输--->右键“新建发送连接器” 输入连接器名称,点击“下一步”按钮  选择“添加”菜单,点击“SMTP 地址空间” 在弹出框中输入如图,点击“下一步”按钮 刚添加的“SMTP 地址空间”就会出现在列表中,直接“下一步” 选择如图,点击“下一步”按钮 直接“下一步” 确认配置信息,点击“新建” 查看新建状态,点击“完成” 配置"接收连接器" 在左侧控制台树,中选择Microsoft Exchange--->Microsoft Exchange的内部部署--->服务器配置--->集线器传输--->接收连接器 --->双击Client Porschev--->配置如下图 在左侧控制台树,中选择Microsoft Exchange--->Microsoft Exchange的内部部署--->服务器配置--->集线器传输--->接收连接器 --->双击Default Porschev--->配置如下图 配置远程域属性 http://technet.microsoft.com/zh-CN/library/bb124931(v=exchg.141).aspx  在左侧控制台树,中选择Microsoft Exchange--->Microsoft Exchange的内部部署--->组织配置--->集线器传输--->选择“远程域”--->双击列表中的“Default”--->进行如下图配置 设置DNS 控制面板--->网络和 Internet--->网络和共享中心--->本地连接--->属性--->Internet 协议版本 4(TCP/IPv4属性)--->属性 --->高级--->DNS选择卡--->添加本地IP 新建邮箱,测试收发 在左侧控制台树,中选择Microsoft Exchange--->Microsoft Exchange的内部部署--->收件人配置--->邮箱--->右键“新建邮箱” 选择“用户邮箱”,点击“下一步”按钮 选择“新建用户”,点击“下一步”按钮 输入必要信息,点击“下一步”按钮 输入别名,指定数据库 点击“下一步”按钮 点击“新建”按钮 “邮箱-整个林”中就可以看见新建的邮箱,为了测试,我建了两个邮箱 在AD域中查看,这两个用户也同样创建了域用户 测试收发 在局域网中的另外一台机器上访问Exchange Web版:https://192.168.206.103/owa/                       或者 https://mail.adserv.com/owa/   (在DNS管理中手动添加mail.adserv.com的解析) 测试发送邮件 用创建的zw帐号登录,登录成功,表示Exchange安装配置没有什么问题 发送一封邮件给另一个测试帐号,发送成功! 用测试收邮件帐号登录,收件箱中有刚发的测试邮件! 至此,Exchange Server 2010环境搭建和收发邮件的配置就已完成! 参考资料: http://technet.microsoft.com/zh-cn/library/bb124558(v=exchg.141).aspx http://wenku.baidu.com/view/720dc0114431b90d6c85c71d.html 编写C#程序用EWS(Exchange WebService)发送邮件  EWS的地址:https://mail.adserv.com/ews/Services.asmx         或者:https://mail.adserv.com/ews/exchange.asmx  通过浏览器访问: 输入用户名,密码登录  新建一个Web Application项目,添加Web引用:https://192.168.206.103/ews/Services.asmx 发送邮件代码:

using System;
using System.Net;
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;
using ExchangeEWS.com.adserv.mail;

namespace ExchangeEWS
{
    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {                
        }

        protected void btnSend_Click(object sender, EventArgs e)
        {
            bool resultVal = SendMailExchange(txtSendAccount.Text.Trim(),
                                  txtSendPwd.Text.Trim(),
                                      txtSendEmail.Text.Trim(),
                                          txtRecEmail.Text.Trim(),
                                              txtDomain.Text.Trim(),
                                                  txtEws.Text.Trim(),
                                                      "测试邮件主题",
                                                          "测试EWS发送邮件正文");

            if (resultVal)
            {
                Page.ClientScript.RegisterStartupScript(this.GetType(), "", "<script>alert('发送成功')</script>");
            }
            else
            {
                Page.ClientScript.RegisterStartupScript(this.GetType(), "", "<script>alert('发送失败')</script>");
            }                
        }

        #region## Send mail (Exchange)
        /// <summary>
        /// Function:   Send mail (Exchange)
        /// Created by: Wilson Zhong
        /// Data:       2012-12-11 
        /// </summary>
        /// <param name="credentialUserName">Credential user name   [example: user1]</param>
        /// <param name="credentialUserPwd">Credential user password     [example: abcd]</param>
        /// <param name="senderEmail">Sender email [example: user1@adserv.com]</param>
        /// <param name="recipientEmail">Recipient email  [example: user2@adserv.com]</param>
        /// <param name="domainName">Domain name   [example: adserv.com]</param>
        /// <param name="ewsUrl">EWS URL [example: https://mail.adserv.com/ews/exchange.asmx]</param>
        /// <param name="subjectName">Email subject</param>
        /// <param name="bodyVal">Email body</param>
        /// <returns></returns>
        public static bool SendMailExchange(string credentialUserName, string credentialUserPwd, string senderEmail, string recipientEmail, string domainName, string ewsUrl, string subjectName, string bodyVal)
        {
            SetCertificatePolicy();

            ExchangeServiceBinding esb = new ExchangeServiceBinding();
            esb.Credentials = new NetworkCredential(credentialUserName, credentialUserPwd, domainName);
            esb.Url = ewsUrl;

            CreateItemType createItemRequest = new CreateItemType();

            // Specifiy how the created items are handled
            createItemRequest.MessageDisposition = MessageDispositionType.SendAndSaveCopy;
            createItemRequest.MessageDispositionSpecified = true;

            // Specify the location of sent items. 
            createItemRequest.SavedItemFolderId = new TargetFolderIdType();
            DistinguishedFolderIdType sentitems = new DistinguishedFolderIdType();
            sentitems.Id = DistinguishedFolderIdNameType.sentitems;
            createItemRequest.SavedItemFolderId.Item = sentitems;

            // Create the array of items.
            createItemRequest.Items = new NonEmptyArrayOfAllItemsType();

            // Create a single e-mail message.
            MessageType message = new MessageType();
            message.Subject = subjectName;
            message.Body = new BodyType();
            message.Body.BodyType1 = BodyTypeType.HTML;
            message.Body.Value = bodyVal;
            message.ItemClass = "IPM.Note";
            message.Sender = new SingleRecipientType();
            message.Sender.Item = new EmailAddressType();
            message.Sender.Item.EmailAddress = senderEmail;
            message.ToRecipients = new EmailAddressType[1];
            message.ToRecipients[0] = new EmailAddressType();
            message.ToRecipients[0].EmailAddress = recipientEmail;
            message.Sensitivity = SensitivityChoicesType.Normal;

            // Add the message to the array of items to be created.
            createItemRequest.Items.Items = new ItemType[1];
            createItemRequest.Items.Items[0] = message;

            try
            {
                // Send the request to create and send the e-mail item, and get the response.
                CreateItemResponseType createItemResponse = esb.CreateItem(createItemRequest);

                // Determine whether the request was a success.
                if (createItemResponse.ResponseMessages.Items[0].ResponseClass == ResponseClassType.Error)
                {
                    //throw new Exception(createItemResponse.ResponseMessages.Items[0].MessageText);
                    return false;
                }
                else
                {
                    return true;
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                return false;
            }
        }
        #endregion

        #region## Certificate
        /// <summary>  
        /// Function:   Set the certificate policy
        /// Create by:  Wilson Zhong
        /// Data:       2012-12-11
        /// </summary>  
        private static void SetCertificatePolicy()
        {
            ServicePointManager.ServerCertificateValidationCallback
                       += RemoteCertificateValidate;
        }

        /// <summary>  
        /// Function:    Remote certificate validation
        /// Created by:  Wilson Zhong
        /// Data:        2012-12-11    
        /// </summary>  
        private static bool RemoteCertificateValidate(object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors error)
        {
            return true;
        }
        #endregion
    }
}

测试程序发送邮件  运行程序,输入必要项,测试发送. 登录Web版Exchange,查看是否收到邮件 至此,用EWS发送邮件也成功! Demo下载:http://files.cnblogs.com/zhongweiv/ExchangeEWS.zip EWS的功能很明显不会只有发邮件,更多EWS相关资料: http://msdn.microsoft.com/en-us/library/exchangewebservices(v=exchg.140).aspx http://msdn.microsoft.com/zh-cn/library/exchange/dd877030(v=exchg.140).aspx 故障排除 问题描述:在最初安装配置完成后,能正常访问Exchange的Web页面,但是输入用户名和密码怎么也登录不成功,一直提示用户名密码不正确 问题解决:反复确认用户名和密码确实没有输入错误后,发现IIS中“安全性”下都没有安装,装上“基本身份验证”和“Windows 身份验证”后,上述问题不会再出现!

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏张善友的专栏

在 Windows 上安装Rabbit MQ 指南

rabbitMQ是一个在AMQP协议标准基础上完整的,可服用的企业消息系统。他遵循Mozilla Public License开源协议。采用 Erlang 实现...

22990
来自专栏Seebug漏洞平台

使用 XML 内部实体绕过 Chrome 和 IE 的 XSS 过滤器

来源:BypassingXSSFiltersusingXMLInternalEntities 原作者:DavidLitchfield (david@davidl...

422100
来自专栏智能大石头

NewLife.Net——开始网络编程

网络编程的重要性就不说了,先上源码:https://github.com/nnhy/NewLife.Net.Tests

10500
来自专栏糊一笑

react脚手架改造(react/react-router/redux/eslint/karam/immutable/es6/webpack/Redux DevTools)

公司突然组织需要重新搭建一个基于node的论坛系统,前端采用react,上网找了一些脚手架,或多或少不能满足自己的需求,最终在基于YeoMan的react脚手架...

40450
来自专栏云计算教程系列

如何在Ubuntu 18.04上将Apache Web Root移动到新位置

在Ubuntu上,Apache Web服务器将其文档存储在/var/www/html中,该文档通常位于具有其余操作系统的根文件系统上。但有时,将文档根移动到另一...

6400
来自专栏草根专栏

使用Identity Server 4建立Authorization Server (1)

本文内容基本完全来自于Identity Server 4官方文档: https://identityserver4.readthedocs.io/ 官方文档很详...

541100
来自专栏菩提树下的杨过

ActiveMQ笔记(6):消息延时投递

在开发业务系统时,某些业务场景需要消息定时发送或延时发送(类似:飞信的短信定时发送需求),这时候就需要用到activemq的消息延时投递,详细的文档可参考官网说...

47550
来自专栏大魏分享(微信公众号:david-share)

用Ansible自动供应vmware虚拟机--构建数据中心一体化运维平台第二篇

1.1 简述 一直以来,打开邮箱被ticket糊一脸的事情时有发生。我一直在想,能不能以一种简单的方案(不花老板的钱)来供应(provisioning)虚拟机呢...

74620
来自专栏向治洪

React Native移植原生Android

(一)前言 之前已经写过了有关React Native移植原生Android项目的文章,不过因为RN版本更新的原因吧,跟着以前的文章可能会出现一些问题,对于初学...

20770
来自专栏草根专栏

使用Identity Server 4建立Authorization Server (6) - js(angular5) 客户端

由于手头目前用项目, 所以与前几篇文章不同, 这次要讲的js客户端这部分是通过我刚刚开发的真是项目的代码来讲解的. 这是后端的代码: https://githu...

63150

扫码关注云+社区

领取腾讯云代金券