Exchange2013下Telnet发送测试邮件失败及解决方案

近期部署开发程序使用Exchange服务发送系统邮件的时候一直无法发送成功的问题做了一些排查,我们都知道程序使用邮件服务发送系统邮件用到的协议是SMTP服务(Port 25),当然发送服务有两种方式,一种是匿名的,一种是身份验证的,但是前者相对比较少,如果使用匿名验证SMTP发送邮件的话这样容易受到***,所以一般都会使用后者,通过有效的用户信息验证发送。之前公司环境内一直都是使用的是Domino服务的SMTP服务进行发送邮件的,但是近期突然用到了Exchange服务,所以将程序配置到Exchange的时候一直无法正常发送邮件(Unable to realy),在网上找了很多问题,经过一系列的排查总结了一下,分享给给遇到同样问题的童鞋,具体见下:

当我们部署了Exchange服务的话,我们首先需要对Exchange相关的服务进行测试,当然测试的方法有很多,就拿我们当下的环境来说,我们环境可以使用owaoutlookanywhere正常的发送邮件的,但是我们使用了telnet的方式测试发送一直都是无法发送邮件提示,Unable to realy.对此问题我们解决方法如下:

使用telnet测试exchange服务的步骤如下:

1.在命令提示符处,键入 telnet,然后按 Enter 键。此命令将打开 Telnet 会话。

2.键入 set localecho 并按 Enter 键。此可选命令可使您在键入字符时查看这些字符。某些 SMTP 服务器可能需要此设置。

3.键入 set logfile<文件名>。此可选命令可以将 Telnet 会话记录到指定的日志文件中。如果您仅指定了文件名,则日志文件的位置将是当前工作目录。如果您指定了路径和文件名,该路径必须位于计算机本地。指定的路径和文件名都必须以 Microsoft DOS 8.3 格式输入。您指定的路径必须已存在。如果您指定了一个不存在的日志文件,系统将为您创建一个日志文件。

4.键入 open mail1.fabrikam.com 25 并按 Enter 键。

5.键入 EHLO contoso.com 并按 Enter 键。

6.键入 MAIL FROM:chris@contoso.com 并按 Enter 键。

7.键入 RCPT TO:kate@fabrikam.comNOTIFY=success,failure 并按 Enter 键。可选的 NOTIFY 命令可定义目标 SMTP 服务器必须向发件人提供的特定传递状态通知 (DSN) 邮件。DSN 邮件是在RFC 1891 中定义的。在本例中,您要查询有关邮件传递成功或失败的 DSN 邮件。

8.键入 DATA 并按 Enter 键。您将收到与以下类似的响应:
354 Start mail input; end with <CLRF>.<CLRF>

9.键入 主题:来自Contoso 的测试,再按 ENTER 键。

10.按 Enter 键。RFC2822 需要在 Subject: 头字段和邮件正文间留一个空行。

11.键入 这是一封测试邮件,再按 ENTER 键。

12.按 Enter 键,键入句点 ( . ),再按 Enter 键。您将收到与以下类似的响应:
250 2.6.0 <GUID> Queued mail for delivery

13.若要与目标 SMTP 服务器断开连接,请键入 QUIT 并按 Enter 键。您将收到与以下类似的响应:
221 2.0.0 Service closing transmission channel

14.若要关闭 Telnet 会话,请键入 quit 并按 Enter 键。

步骤介绍完后,开始还原我们当前的环境介绍:

telnet exchangeserverAddress 25

ehlo

mail from : user01@caihongdun.com

rcpt to : gaowenlong@126.com

wKiom1Z6plWD1hOVAAEh7dvXTE4208.png

分析日之后发现,您的默认的receive connector缺少relay的相关权限.这种情况下,我们通常建议新建一个接受连接器(如果IP范围一样,会有冲突;而且IP设置范围太大,会被外部relay使用造成很大的问题)。因此请参考以下步骤新建一个receive connector 并赋予relay权限:

1.    新建一个receive connector

a.    可通过EAC创建,您之前的步骤中,只需要改IP range 需要修改:

注意:我们需要创建一个前端传输的接受连接器 

b.       或者通过命令行新建(如果您测试telnet所在的这台机器的IP地址为192.168.1.1,例子如下:

以下格式为创建接收器角色为:集线器传输角色的接受连接器

wKiom1Z6poDDdAP_AABWlSO1Yr0671.png

当然,我们可以使用命令来创建;以下命令中我们需要注意的是;

如果不指定角色类型的话,默认创建角色类型是:集线器传输类型;因为我们要创建前端创建角色类型,所以我们需要指定角色类型;-TransportRole“ FrontendTransport

 New-ReceiveConnector-Name "Anonymous Relay" -Usage Custom -PermissionGroups AnonymousUsers,ExchangeServers, ExchangeLegacyServers -Bindings 0.0.0.0:25-RemoteIpRanges 192.168.6.112
New-ReceiveConnector -Name"Anonymous Relay" -Usage Custom -PermissionGroups AnonymousUsers,ExchangeServers, ExchangeLegacyServers -Bindings 0.0.0.0:25 -ReoteIpRanges 192.168.6.111-192.168.6.112

如果需要创建角色:前端传输的角色接受连接器的话,我们需要使用以下格式:

以下命令我们就添加-TransportRole" FrontendTransport"角色类型就可以创建角色类型为前端传输的接受连接器

New-ReceiveConnector-Name "Anonymous Relay" -TransportRole" FrontendTransport"-Usage Custom -PermissionGroups AnonymousUsers, ExchangeServers,ExchangeLegacyServers -Bindings 0.0.0.0:25 -RemoteIpRanges 192.168.6.112
New-ReceiveConnector -Name"Anonymous Relay"  -TransportRole" FrontendTransport"-Usage Custom -PermissionGroups AnonymousUsers, ExchangeServers,ExchangeLegacyServers -Bindings 0.0.0.0:25 -RemoteIpRanges 192.168.6.111-192.168.6.112

2.   成功创建完接受连接器后我们需要 再赋予relay权限,通过命令行:

  
Get-ReceiveConnector "Anonymous Relay"| Add-ADPermission -User "NT AUTHORITY\ANONYMOUS LOGON"-ExtendedRights "Ms-Exch-SMTP-Accept-Any-Recipient"

wKioL1Z6pw-iWEYwAAA663Z-u-0257.png

赋予Realy权限后,我们就可以看见刚才创建的接受连接器---类型为前端传输

wKioL1Z6pzXhQSGnAABxT3StboE482.png

然后我们查看该连接器的属性-记住我们需要勾选匿名

wKiom1Z6pz3TWLAHAABJZ54rjNM530.png注:再次我们需要注意;在添加远程网络地址的时候建议添加127.0.0.1  添加后在Exchange server本地也可以telnet成功;如果不添加在Exchange本地是无法完成telnet测试发送邮件的。(Unable to realy)

wKioL1Z6p3-jsOgyAABJnNoc2sk717.png我们再  测试25端口发送邮件是否成功。

wKioL1Z6p6Ljq4f-AAA10sBHpXk646.png我们在内内部测试是通的,但是在外部测试不同,原因是由于ipv6的问题

wKiom1Z6p7eR-pHMAAA7IqrO4fM113.png所以我们需要在接受连接器中添加ipv6的地址空间

192.168.6.11

::ffff:192.168.6.112这个地址仍然是一个IPv6地址

只是0000:0000:0000:0000:0000:ffff:c0a8:5909的另外一种写法罢了。

我们可以使用windows10 系统自带的计算机进行进制转换

将十进制转换为十六进制

运行

calc打开计算机

选择计算机类型为----程序员

HEX   16进制

DEC  10进制

OCT   8进制

BIN    2进制

 我们单击10进制,然后输入192

十六进制及十进制或者二进制都会自动转换

wKiom1Z6qBKAmlarAACZORczGdM934.png

如果禁用了,我们就从注册表中彻底禁用ipv6服务HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip6\Parameters

请先做注册表的备份,然后创建32 bit DWORD键值(没有请添加)DisabledComponents 设置它的值为0xff,之后再重启机器

如何在 Windows 中禁用 IPv6 或它的组件

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

Disabling IPv6 AndExchange Going All The Way

http://blogs.technet.com/b/rmilne/archive/2014/10/29/disabling-ipv6-and-exchange-_1320_-going-all-the-way.aspx

如果您在外部测试,请把外部测试的这台机器的IP地址也加到IP地址列表中

 最后我们说说关于Exchange身份验证机制介绍:

我们不管是接受连接器还是发送连接器,里面都会有配置选项;

其实我个人理解;就拿接收连接器来说

身份验证功能模块中;

传输层安全性(TLS)一般建议勾选,该功能主要是为了传输的安装使用证书加密

基本身份验证:需要在登录时进行身份验证

集成windows身份验证:NTLMKerberoswindows AD的身份验证模式

外部保护:

权限组:

Exchange服务器:exchange服务器身份验证,当环境内有多台exchange服务器的话之间验证的方式;

旧版exchange服务器:环境内低版本的验证方式

合作伙伴

Exchange用户:仅仅是exchange用户进行验证

匿名:anymouse任何人都可以验证

wKiom1Z6qGDx_LRuAABJZ54rjNM466.pnghttps://technet.microsoft.com/zh-cn/library/jj657472%28v=exchg.150%29.aspx?f=255&MSPPError=-2147217396

wKioL1Z6qKCCjxFoAACqu-g-olQ563.png

https://technet.microsoft.com/zh-cn/library/bb690954(v=exchg.141).aspx


wKiom1Z6qJzTNTuUAACgTfv7IOc742.png

wKioL1Z6qLDgJyqkAAEAV_yzM1M486.png

o    伙伴   伙伴服务帐户

使用命令行管理程序配置接收连接器的属性

您必须先获得权限,然后才能执行此过程。若要查看所需的权限,请参阅传输权限主题中的“接收连接器”条目。

可以使用 Set-ReceiveConnector cmdlet修改现有接收连接器的所有可用设置。 在此示例中,从 Contoso.com 中对接收连接器连接的配置进行了下列更改:

·        将连接器上允许的最大邮件大小更改为 50 MB。

·        在接收连接器上启用协议日志记录。

·        设置缓送间隔。

Set-ReceiveConnector "Connection fromContoso.com" -MaxMessageSize 50MB -ProtocolLoggingLevel Verbose
Set-ReceiveConnector "Connection fromContoso.com" -RemoteIPRanges"10.0.10.0/24","192.168.180.0-192.168.180.255"
$ConnectorConfiguration = Get-ReceiveConnector"Connection from Contoso.com"
$ConnectorConfiguration.RemoteIPRanges += "10.0.10.0/24"
Set-ReceiveConnector "Connection from Contoso.com" -RemoteIPRanges$ConnectorConfiguration.RemoteIPRanges
Set-ReceiveConnector "Connection fromContoso.com" -TarpitInterval 00:00:06