![Exchange 连接器无法发送到外部域](https://linux22.com/image/799078/Exchange%20%E8%BF%9E%E6%8E%A5%E5%99%A8%E6%97%A0%E6%B3%95%E5%8F%91%E9%80%81%E5%88%B0%E5%A4%96%E9%83%A8%E5%9F%9F.png)
我是一名开发人员,正在尝试让我的 .Net 应用程序通过我们的 Exchange 服务器发送电子邮件。我不是 Exchange 专家,所以我会先说明这一点!
我们在 Exchange 中设置了一个接收连接器,它具有以下属性:
网络:允许通过端口 25 的所有 IP 地址。
身份验证:选中传输层安全性和外部安全复选框。
权限组:选中匿名用户和 Exchange 服务器复选框。
但是,当我直接在我们的 Exchange 服务器上运行此 Powershell 语句时,当我发送到本地域地址时它可以工作,但是当我尝试发送到远程域时它会失败。
作品:
C:\Windows\system32>Send-Mailmessage -To [email protected] -From [email protected] -Subject testing -Body testing -SmtpServer OURSERVER
(顺便说一句:我的 OURSERVER 值为 =boxname.domainname.local。这是我启动 Exchange 管理 Shell 时显示的相同完全限定名称)。
失败:
C:\Windows\system32>Send-Mailmessage -To [email protected] -From [email protected] -Subject testing -Body testing -SmtpServer OURSERVER
Send-MailMessage:邮箱不可用。服务器响应为:5.7.1 无法中继 第 1 行 字符:17 + Send-Mailmessage <<<< -To[电子邮件保护]-从[电子邮件保护]-主题测试-Body himom-SmtpServer FTI-EX + CategoryInfo:InvalidOperation:(System.Net.Mail.SmtpClient:SmtpClient)[Send-MailMessage],SmtpFailed RecipientException + FullyQualifiedErrorId:SmtpException,Microsoft.PowerShell.Commands.SendMailMessage
编辑: 根据@TheCleaner 的建议,我对中继运行了 Add-ADPermission,但没有帮助;
[PS] C:\Windows\system32>Get-ReceiveConnector "Allowed Relay" | Add-ADPermission -User "NT AUTHORITY\ANONYMOUS LOGON" -ExtendedRights "Ms-Exch-SMTP-Accept-Any-Recipient"
Identity User Deny Inherited
-------- ---- ---- ---------
FTI-EX\Allowed Relay NT AUTHORITY\ANON... False False
谢谢你的帮助。马克
答案1
您应该设置一个在非标准端口(可能是 2525)上运行的接收连接器,并限制它只接受您知道允许发送的服务器的 IP 地址。创建连接器时,不要勾选“身份验证”和“权限组”中的“匿名用户”。
之后,您需要在 PS 中运行以下命令,因为 Exchange 默认阻止任何接收连接器上的匿名中继。
Get-ReceiveConnector “Receive Connector Name” | Add-ADPermission -User “NT AUTHORITY\ANONYMOUS LOGON” -ExtendedRights “Ms-Exch-SMTP-Accept-Any-Recipient”
我刚刚在自己的 Exchange 服务器上测试了这一点,并设法发送到 Gmail 和我自己的域,从 Exchange 域和虚假域发送。
还将-port 2525
参数添加到您的 PS 脚本中。
答案2
有一些方法可以从您的内部网络中继到外部世界而无需进行身份验证(通过在边缘或集线器上创建新的 SMTP 连接器)。
在大多数情况下,如果可以的话,最好设置身份验证。如果您只从少数专用进程/脚本等发送,这种方法很有效。
如果您想要进行未经身份验证的中继,请创建新的集线器接收连接器规则。要执行此操作(假设单个 Exchange 服务器充当所有 Exchange 角色):
服务器配置 -> 集线器传输
使用所有可用的 IP 地址进行接收,并输入将中继到“从远程服务器接收邮件”设置的任何远程主机。
您可能不想要任何身份验证方法(可能是 TLS),并且权限组应该设置为匿名。
答案3
我假设只有一台 Exchange 服务器,没有什么网关/垃圾邮件过滤器等。
在您的接收连接器上(称之为“中继”):
确保“从具有这些 IP 地址的远程服务器接收邮件”具有您将在其上运行此应用程序的服务器的 IP 地址。
在“身份验证”选项卡上,唯一需要检查的是“外部安全”
在权限组中,唯一需要检查的是“Exchange 服务器”
注意:如果您使用原始帖子中所示的“匿名”,则需要在 Exchange shell 中运行此命令才能使该类型的中继连接器正常工作:
Get-ReceiveConnector "NAMEOFCONNECTOR" | Add-ADPermission -User "NT AUTHORITY\ANONYMOUS LOGON" -ExtendedRights "Ms-Exch-SMTP-Accept-Any-Recipient"
然后,从 IP 位于上述 #1 中的服务器之一再次尝试该应用程序。请勿直接在 Exchange 服务器本身上尝试。
答案4
这可能更像是一种解决方法,但在脚本中指定凭据应该允许您进行外部发送,而无需在 Exchange 端进行任何配置更改。