創建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中繼。要了解詳情,請閱讀《如何使用PowerShell發送Office 365直接發送/SMTP客戶端提交郵件》。

先決條件

在繼續之前,需要滿足以下要求:

  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权限。确保您的帐户是组织管理组的成员。

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

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

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

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

New Connector

新连接器窗口中,选择从:您的组织的电子邮件服务器(1),选择到:Office 365(2),点击下一步(3)

Selecting a mail flow scenario

在下一个窗口中,输入名称SMTP Relay(非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 Relay(非TLS),但您的可能有所不同。

在定義Office 365的窗口中,應該從您的郵件服務器識別電子郵件,選擇:

  • 通過驗證發送服務器用於與Office 365進行身份驗證的證書的主題名稱與此域名匹配(推薦)(1)
  • 然後輸入SSL證書的主題(2)
  • 並點擊下一步(3)
Create a TLS Connector using Exchange Admin Center

同樣,在處理之前,您將看到必要更改的摘要。如果沒有,您可以立即點擊保存按鈕。

使用PowerShell創建非TLS連接器

如果通過圖形用戶界面創建Office 365連接器不是您的菜,您也可以通過PowerShell創建。為此,首先確保您已連接到Exchange Online PowerShell。

要創建連接器,您需要運行New-InboundConnector命令。該命令需要幾個不同的參數,因此我將使用PowerShell splatting提前設置這些參數。

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

  • 名稱 – 這是連接器的名稱。
  • 連接器類型 – 這是連接器的類型。此值可以是OnPremisesPartner。在此情境中,適當的類型是OnPremises
  • 寄件者域名 – 這可以是允許的寄件者域名清單。只有您的租戶已驗證的域名才是有效的選擇。星號(*)表示您允許所有已驗證的域名使用此連接器轉發郵件。如果您只需要允許某些寄件者域名,將此值更改為域名的數組(例如:'domain1.com','domain2.com'
  • 寄件者IP地址 – 這是您的公共IP地址。在執行之前請務必更改此值。
  • 限制域名為IP地址 – 當此值設置為$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点的地址或值。

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

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

使用下面的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 cmdlet,因為它不允許您選擇特定的憑證。取而代之,請使用兩個名為System.Net.Mail.SmtpClient的.NET物件來定義SMTP參數,並使用System.Net.Mail.MailMessage來撰寫郵件內容。

以下是一段PowerShell程式碼片段,您可以在運行之前更改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/