创建 TLS 和非 TLS Office 365 SMTP 中继

恨它还是爱它;电子邮件无处不在。将该电子邮件传送到各个地方的协议是SMTP,而SMTP“路由器”是SMTP中继

Not a reader? Check out this tutorial’s related video.

设置SMTP中继在不同系统间有所差异,但如果你的邮件服务提供商是Office 365,你的选择就有限。设置可能会复杂且容易出错,特别是对于不支持TLS的设备。

请注意,通过Office 365发送电子邮件不需要SMTP中继。你可以让客户端直接将电子邮件发送到Office 365,而无需添加不需要任何配置更改的SMTP中继。要了解详情,请阅读如何发送Office 365直接发送/SMTP客户端提交电子邮件(PowerShell)

先决条件

在继续之前,需要满足以下要求。

  1. Office 365订阅。如果你还没有,可以注册Office 365 E5试用订阅
  2. A Windows 10 computer with PowerShell v5.1
  3. A public static IP address. You can still create an SMTP relay in Office 365 even without this, but you might not test.
  4. 从客户端到Office MX端点的TCP端口25访问。
  5. A valid SSL certificate. This certificate could be a wildcard certificate (eg. *.yourdomain.com) issued by third-party certificate authorities like LetsEncrypt, Digicert, etc. Note, that you cannot use self-signed certificates or certificates issued by an internal PKI because they are not supported. (only required for TLS connections)

要设置SMTP中继,您首先必须在Office 365中创建一个连接器以接受SMTP事务。该连接器将从应用程序或设备接收SMTP中继事务。

在尝试创建连接器之前,请确保您的帐户具有适当的Exchange Online权限。确保您的帐户是Organization Management组的成员。

有两种创建连接器的方法。您可以使用Exchange管理中心或PowerShell。这两个选项将执行相同的任务。由您决定使用哪一个。在本文中,我们将涵盖两者。我们还将介绍创建非TLS和TLS连接器。

使用Exchange管理中心创建非TLS连接器

首先,让我们创建一个非TLS连接器。您将首先学习如何通过Exchange管理中心执行此操作。您可以在Exchange管理中心中配置许多Office 365 SMTP设置。

登录后,单击邮件流(1) –> 连接器(2) –> 新建(3)。将弹出新建连接器窗口。

New Connector

新建连接器窗口中,选择From: Your organization’s email server(1),选择To: Office 365(2),然后点击下一步(3)

Selecting a mail flow scenario

在下一个窗口中,输入名称SMTP中继(非TLS)或选择您自己的名称(1),键入描述接受来自本地SMTP服务器的中继(2),取消选中保留内部Exchange电子邮件标头(推荐)(3),然后点击下一步(4)

Assigning a name to the connector

在下一个窗口中,选择通过验证发送服务器的IP地址是否与您组织的这些IP地址之一匹配(1),然后点击添加(2)

Adding allowed IP adresses to the connector

在新弹出的窗口中,输入您的公共IP地址(1),然后点击确定(2)。这应该会将您带回到先前的窗口。

Adding allowed IP adresses to the connector

确认IP地址已添加到列表中(1),然后点击下一步(2)

Adding allowed IP adresses to the connector

然后您将看到需要实施的更改摘要。首先处理必要的更改。如果没有更改,您可以直接点击保存

回到Exchange管理中心,您现在可以确认已创建新连接器。

Office 365 Connector has been created

现在应该已经创建了一个非TLS连接器。

使用Exchange管理中心创建TLS连接器

创建TLS连接器类似于创建非TLS连接器。就像您创建非TLS连接器一样,回到新连接器向导并使用相同的邮件流程方案。我将使用一个连接器名称SMTP中继(非TLS),但您的可能会有所不同。

在定义 Office 365 的窗口中应该识别来自您的电子邮件服务器的电子邮件,选择:

  • 通过验证发送服务器用于与 Office 365 进行身份验证的证书上的主题名称与此域名匹配(推荐) (1)
  • 然后键入 SSL 证书的主题 (2)
  • 并单击下一步 (3)
Create a TLS Connector using Exchange Admin Center

然后,您将看到所需更改的摘要。在处理之前先完成它们。如果没有,您可以立即单击保存按钮。

使用 PowerShell 创建非 TLS 连接器

如果通过 GUI 创建 Office 365 连接器不是您的菜,您始终可以通过 PowerShell创建。为此,首先确保您已连接到 Exchange Online PowerShell。

要创建连接器,您需要运行New-InboundConnector命令。该命令需要一些不同的参数,因此我将使用 PowerShell 批处理提前设置这些参数。

I’ve added some comments in the code itself below but here’s a breakdown of each parameter and what it’s used for:

  • Name – 这是连接器的名称。
  • ConnectorType – 这是连接器的类型。此值可以是OnPremisesPartner。在这种情况下,适当的类型是OnPremises
  • SenderDomains – 这可以是允许的发件人域名列表。仅您租户的已验证域名是有效选择。星号(*)表示您允许所有已验证域名使用此连接器中继消息。如果您只需要允许某些发件人域名,请将此值更改为域名数组。(例如:'domain1.com','domain2.com'
  • SenderIPAddresses – 这是您的公共IP地址。执行前不要忘记更改此项。
  • RestrictDomainsToIPAddresses – 当此值设置为$true时,表示此连接器将仅接受来自您允许的公共IP地址的发件人地址的电子邮件。
$splat = @{
    ## 定义连接器的名称。
    Name = 'SMTP Relay'
    ## 定义要创建的连接器的类型。
    ConnectorType = 'OnPremises'
    ## 允许中继的发件人域的集合。
    SenderDomains = '*'
    ## 将此项更改为您的实际公共IP地址。
    SenderIPAddresses = '110.x.x.x'
    ## 仅将电子邮件中继限制为您的发件人域和发件人IP地址
    RestrictDomainsToIPAddresses = $true
}

## 创建连接器
New-InboundConnector @splat

执行后,您应该看到类似下面的内容。

New-InboundConnector

使用PowerShell创建TLS连接器

假设您已经连接,请运行以下代码以使用PowerShell创建TLS连接器。您可以看到下面许多参数与创建非TLS连接器相同。与创建非TLS连接器不同的必需参数包括:

  • RequireTLS – 这指定此连接器接收到的所有消息都需要TLS传输
  • TlsSenderCertificateName – 这是发件人使用的证书的名称(或主题)。
$splat = @{
    ## 定义连接器的名称。
    Name = 'SMTP Relay (TLS)'
    ## 要创建的连接器类型。
    ConnectorType = 'OnPremises'
    ## 允许中继的发件人域集。
    SenderDomains = '*'
    ## 要求TLS
    RequireTLS = $true
    ## SSL证书的主题/名称
    TlsSenderCertificateName = '*.YourDomain.com'
}

## 创建连接器
New-InboundConnector @splat

执行以上代码,即可创建TLS连接器并准备好接收电子邮件。

使用PowerShell测试Office 365 SMTP中继连接器

创建连接器后,准备进行测试。最简单的方法是使用PowerShell。在本节中,我们将创建一些PowerShell脚本,以便您轻松确保连接器正常工作。

在开始测试之前,请确保您知道您的Exchange Online域的MX终结点URL是什么。如果您不知道如何找到MX终结点URL,请登录到Office 365管理门户。点击设置,选择域,点击域名 复制MX Points到地址或值。

测试非TLS SMTP中继(IP地址)

注意:此测试必须在允许在Office 365 SMTP中继设置中使用的计算机上进行。

使用以下PowerShell代码进行测试。在运行之前,请务必更改FromToSmtpServer参数值以使用您自己的Office 365 SMTP中继设置。

  • To – 必须包括一个内部域收件人和一个外部域收件人。不要忘记更改这些值为您自己的值。
  • From – 必须更改为您指定的发件人地址。电子邮件地址的域部分必须是您租户的电子邮件域之一。
  • SmtpServer – 必须更改为您Office 365租户的MX终结点。
$mailParams = @{
    SmtpServer = '<tenant>.mail.protection.outlook.com'
    Port = '25'
    From = '[email protected]'
    To = '[email protected]','[email protected]'
    Subject = ('SMTP Relay - ' + (Get-Date -Format g))
    Body = 'This is a test email using SMTP Relay'
    DeliveryNotificationOption = 'OnFailure','OnSuccess'
}

Send-MailMessage @mailParams

测试TLS SMTP中继(证书)

注意:在进行此测试之前,您必须具有以PFX格式保存的公共SSL证书。

由于 TLS SMTP 中继需要证书,所以您不能使用 Send-MailMessage PowerShell 命令,因为它不允许您选择特定的证书。相反,使用两个名为 System.Net.Mail.SmtpClient 的 .NET 对象来定义 SMTP 参数,以及 System.Net.Mail.MailMessage 来组成消息。

以下是一个 PowerShell 代码片段,您可以使用它来测试 TLS SMTP 中继。在运行之前,请不要忘记更改 pfxFilepfxPassFromToSmtpServer 的值,以使用您的 Office 365 SMTP 中继设置。

# 指定您的 PFX 证书的完整路径
$pfxFile = "C:\Certificate\cert.pfx"
$pfxPass = '<cert password here>'
$pfxBytes = Get-Content -path $pfxFile -encoding Byte -ErrorAction:SilentlyContinue
$X509Cert = New-Object -TypeName System.Security.Cryptography.X509Certificates.X509Certificate2
$X509Cert.Import([byte[]]$pfxBytes, $pfxPass,"Exportable,PersistKeySet")

# 构建 SMTP 属性
$smtpServer = '<tenant>.mail.protection.outlook.com'
$smtpPort = '25'
$smtp = New-Object Net.Mail.SmtpClient($smtpServer,$smtpPort)
$smtp.ClientCertificates.Add($X509Cert)
$smtp.EnableSSL = $true

# 组成消息
$emailMessage = New-Object System.Net.Mail.MailMessage
$emailMessage.From = '[email protected]'
$emailMessage.To.Add('[email protected]')
$emailMessage.To.Add('[email protected]')
$emailMessage.Subject = ('SMTP Relay (TLS) - ' + (Get-Date -Format g))
$emailMessage.Body = 'This is a test email using SMTP Relay (TLS)'

# 发送消息
$smtp.Send($emailMessage)

如果设置了正确的 TLS 连接器,通过 Add() 方法定义的收件人应该会收到测试邮件。

使用消息标题验证 SMTP 中继跳跃

现在,您已经设置了一个使用本地服务器和 Office 365 SMTP 中继的功能性 SMTP 中继。所有测试都成功了,您的设备可以将消息发送到内部和外部收件人。干得好!

如果您仍然怀疑并需要确认这些消息是否通过 Office 365 SMTP 中继发送,您可以查看接收到的电子邮件的消息头。

注意:打开消息头的方法因不同的邮件客户端而异。以下示例特定于 Gmail。

在 Gmail 界面中打开电子邮件,打开消息,并单击三个垂直点 (1),然后单击 显示原始 (2)

Validating SMTP Relay Hops using the Message Header

A new page will show the email message headers. Click on Copy to clipboard (1).

Validating SMTP Relay Hops using the Message Header

在新的浏览器选项卡中导航到 https://testconnectivity.microsoft.com/

转到 消息分析器 (1) 选项卡,将复制的数据粘贴到框中 (2),然后单击 分析头部 (3)

Analyzing headers

分析结果将显示在下面的表格中。

Analyzing results

您应该在上述结果中看到以下工作流程:

  1. IP 地址 192.168.0.3 表示计算机的源。
  2. 本地 SMTP 中继服务器收到消息。
  3. Exchange Online 保护 (EOP) 收到消息。
  4. Exchange Online 服务器收到消息并将其重新路由以进行出站传送。
  5. Office 365 传递消息至 google.com。

根据分析结果,您可以确认消息确实按照预期通过了 Office 365 SMTP 中继。

摘要

在本文中,您已经学会了如何创建TLS和非TLS Office 365 SMTP中继。您还学会了如何使用不同的技术测试和确认它们的功能,以及如何验证消息通过的SMTP路由。

进一步阅读

Source:
https://adamtheautomator.com/office-365-smtp-relay/