Microsoft Azure沒有郵件發送服務。無論您是在Azure中測試應用程序還是開發腳本來發送郵件,請知道您無法使用本地的郵件服務。
Azure也完全阻止通過25端口的外部SMTP連接。如果您是企業客戶,可以要求為您的Azure租戶解除對25端口的阻塞。否則,您還可以從Azure發送郵件的其他方法是什麼?
通常有兩種方法可以通過Azure發送外部郵件:使用SMTP智能主機和REST API請求。大多數郵件發送服務都提供使用SMTP和API的郵件發送方法。在本文中,您將學習如何從Azure發送郵件到世界各地。
先決條件
本文是一篇操作指南,如果您打算按照示例進行操作,則需要滿足一些要求。
- 需要一個Azure訂閱。如果您還沒有Azure訂閱,可以註冊一個免費試用的Azure訂閱。
- 一個 Azure虛擬機 (VM)。如果您還沒有虛擬機,請參考 在Azure門戶中創建Windows虛擬機 了解如何創建新的虛擬機。
- 需要Windows PowerShell 5.1或PowerShell 7.1。
- A valid sender email address. Using a free email address domain, such as gmail.com, is not recommended. As much as possible, use a sender email address that uses a domain that you own.
了解在Azure中使用哪些電子郵件服務發送郵件
有幾個可用的雲端電子郵件服務。其中一些著名的服務有 SendGrid、MailJet 和 MailGun。不論您選擇哪個郵件服務,使用它們在Azure中發送郵件的方式是相似的;SMTP的伺服器地址和端口,以及REST的API終端點地址。
SendGrid是本文中使用的第三方郵件服務的一個例子。其他作為例子使用的電子郵件服務包括 Office 365 SMTP中繼 和 Microsoft Graph API。
使用SendGrid
SendGrid 可能是從 Azure 發送電子郵件的最受歡迎的電子郵件服務選項。Azure 和 SendGrid 如此受歡迎,是因為以前在 Azure 客戶的免費計劃中有每月 25,000 封電子郵件的限制。
雖然在 Azure 門戶中不再提供免費計劃,如 Microsoft 確認的,但仍然可以註冊一個每天 100 封電子郵件限制的免費訂閱。然後,您將可以使用 SendGrid 的 SMTP 中繼服務或電子郵件 API 從 Azure 應用程序或虛擬機發送電子郵件。
創建 SendGrid 帳戶
使用 SendGrid 的服務需要您先擁有一個 SendGrid 帳戶。前往 註冊 頁面,您應該看到如下所示的表單。輸入您的電子郵件地址和選擇的密碼。然後,接受條款並點擊 創建帳戶 按鈕。

在下一頁中,您需要輸入您的姓名和公司信息。您還需要選擇適當的選項,例如您的角色、每月要發送的電子郵件數量和員工人數。然後,點擊 開始。

當您第一次登錄SendGrid時,您可能會遇到一個錯誤:“您未獲授權訪問SendGrid;請聯繫支援”。在這種情況下,與SendGrid支援開啟一個工單。在解鎖您的訪問權限之前,他們可能需要提出一些驗證問題。
您將在第一次登錄時被要求啟用雙重身份驗證。請確保準確遵循指示。
創建SendGrid寄件人身份
在創建SendGrid帳戶之後,下一步是授權寄件人的身份。有兩種選擇:驗證單個寄件人(例如,[email protected])或驗證整個域名(例如,domain.com)。
在本例中,您將創建一個作為您的寄件人地址的單個寄件人身份。只有驗證的寄件人地址才能通過SendGrid的服務發送郵件。請按照下面的指示創建單個寄件人身份。
- 在歡迎頁面上,點擊創建單個寄件人按鈕。

2. 接下來,在創建寄件人彈出窗口中,提供所有必需的信息。必填字段旁邊有一個紅色星號作為標記,以便更容易參考。輸入詳細信息後,點擊創建。

然後您將在單一寄件者驗證頁面下看到新的寄件者地址。如下面的示例所示,該地址尚未驗證,如已驗證欄下的紅色X所示。

3. 要驗證寄件者,找到發送到寄件者地址的郵件,類似下面的屏幕截圖。然後,點擊驗證單一寄件者按鈕。

寄件者的地址將變為已驗證。您應該看到類似下面的頁面,確認寄件者驗證已完成。

創建SendGrid API金鑰
在創建單一寄件者地址之後,將可使用界面創建API金鑰。將SendGrid API金鑰視為密碼。如果沒有它,您的代碼將無法與SendGrid SMTP中繼服務進行身份驗證。按照以下步驟創建新的API金鑰。
- 在左側菜單中,點擊設置 > API金鑰。然後,點擊頁面右上角的創建API金鑰按鈕。

2. 出現創建API金鑰快顯窗口。輸入正在創建的API金鑰的名稱。使用一個有意義的名稱,例如“Azure測試API金鑰”。然後,為了簡單起見,選擇完全訪問權限作為權限。最後,點擊創建和查看按鈕。

3. 顯示新的API金鑰。現在複製並保存該金鑰值,因為它將不再顯示給您。複製金鑰後,點擊完成。

使用SendGrid SMTP中繼從Azure發送郵件
現在您已經具備使用 SendGrid 發送 Azure 郵件的所需組件(帳戶、寄件者和金鑰)。現在是測試 SendGrid SMTP 中繼服務是否正常工作的時候了。在本節中,您將使用 PowerShell 從 Azure VM 發送郵件。
在運行任何代碼之前,您應該了解以下要求。
- SendGrid SMTP 伺服器地址為 smtp.sendgrid.net。
- 用於 SMTP 認證的用戶名始終為 apikey。
- 要使用的密碼是您在 SendGrid 中創建的 API 金鑰的值。
- 請不要使用 25 端口,而是使用 587 端口。
- 只有在 SendGrid 中驗證過的寄件人地址才能作為您郵件的發件人。在此示例中,授權的寄件人是 [email protected]。
下面的腳本將通過 SendGrid SMTP 中繼發送郵件。複製下面的代碼,並更改 $sendGridApiKey
、From
、To
和 Body
的值。然後,在 PowerShell 會話中運行該代碼。請參考註釋以了解每行代碼的功能。
下面的示例演示了实时运行上述代码的PowerShell样子。

要确认电子邮件的可投递性,请检查收件人邮箱以查找你发送的测试邮件。结果将类似于下图所示。正如你所见,该消息来自发件人的地址通过sendgrid.net发送。

相关: Send-MailMessage:使用PowerShell发送电子邮件的方法
使用SendGrid API从Azure发送电子邮件
使用SendGrid与Azure发送电子邮件的另一种方式是使用SendGrid Web API V3。与通过SMTP与SendGrid通信不同,使用API是通过HTTP进行通信。HTTP请求发送到SendGrid的API端点URL。
下面是一個範例的 PowerShell 腳本,該腳本使用 Invoke-RestMethod
指令來將電子郵件請求從 Azure 傳送到 SendGrid。複製這段程式碼並更改 $sendGridApiKey
、$fromAddress
、$toAddress
、$mailSubject
和 $mailMessage
的變數值。
在更新完變數後,使用 PowerShell 執行這段程式碼。
執行上述 PowerShell 程式碼後,檢查收件人的郵箱,確認是否收到測試郵件。下面的範例顯示了 Azure 通過 SendGrid API 成功傳送的測試郵件。

如果您想了解更多關於 SendGrid Web API 的資訊,請訪問 V3 Mail Send API 頁面。
使用 Office 365 SMTP Auth
還有一種傳送 Azure 郵件的方式是使用 Office 365 SMTP 中繼。前提是您的組織已經訂閱了 Exchange Online。與使用 SendGrid 作為 SMTP 智慧主機一樣,Office 365 SMTP 中繼也需要驗證並且只能使用 587 端口。
在使用 Office 365 SMTP 中繼之前,您必須了解以下條件。
- 發送者地址必須是有效的 Exchange Online 收件者物件,例如郵箱或郵件使用者。但如果要存儲非傳遞回條 (NDR),請使用郵箱。
- 驗證使用者必須具有有效的 Exchange Online 授權。只有有授權的 Exchange Online 使用者才可以使用 Office 365 SMTP 中繼。
- 假設身份驗證使用者與寄件者不同。在這種情況下,必須將使用者指派「以寄件者身分發送」權限給寄件者帳戶。
- 使用的身份驗證方法是「基本(傳統)」。這意味著如果您的組織已停用 SMTP 基本驗證,或者當 Microsoft 最終停用基本驗證時,SMTP 認證將不再運作。
- SMTP 中繼伺服器位址為smtp.office365.com,端口號碼為 587。
相關資訊:如何使用 Office 365 直接寄送和 PowerShell 寄送電子郵件
建立 Office 365 寄件者地址
在這個範例中,寄件者和身份驗證使用者是分開的。請確保先連線到 Exchange Online PowerShell。連線成功後,請按照以下步驟進行。
使用下列命令建立共用郵箱。將-Name
和-PrimarySMTPAddress
更改為正確的值。
共用郵箱應該建立成功,並返回類似以下的結果。

然後,將「發送作為」權限分配給驗證使用者。在下面的示例中,使用者被分配了「發送作為」權限以共用郵件箱。
執行上述命令後,您應該會得到類似下面的結果。

使用 Office 365 SMTP 中繼從 Azure 發送郵件
在創建發送者地址並分配「發送作為」權限後,下一步是使用 PowerShell 和 Office 365 SMTP 中繼測試郵件傳遞。
下面的代碼使用 [email protected] 進行身分驗證。地址 [email protected] 將顯示為發件人。在運行代碼之前,請務必分配正確的值。
脚本中明文存储凭据不建议使用。生产脚本必须使用凭据加密或秘密管理来保护用户名和密码。
現在是時候檢查收件人的郵箱了。確認是否收到了測試郵件。

使用 Microsoft Graph API 發送 Azure 郵件
使用Microsoft Graph API而不是使用Office 365 SMTP中繼是更安全和推薦的方法。使用Microsoft Graph API,您可以使用REST API呼叫從組織中的任何郵箱發送郵件。
要使用Microsoft Graph API發送郵件,需要註冊一個已註冊的Azure AD應用程序。註冊的應用程序必須分配Mail.Send API權限。以下部分將顯示如何配置Microsoft Graph API並使用它來發送郵件。
相關資訊:使用PowerShell與Microsoft Graph API
在Azure Active Directory中註冊新應用程式
在此部分中,您將在Azure活動目錄中註冊新的Web應用程式。新的應用程式充當Microsoft Graph的身份驗證標識。如果尚未登錄,請登錄到Azure Portal。
- 導航到Azure Active Directory —> 應用程式註冊。然後,點擊新註冊按鈕。

2. 在註冊應用程式頁面上,輸入應用程式的名稱。
3. 在支援的帳戶類型下,選擇僅此組織目錄中的帳戶。將重定向 URI設為HTTP://localhost。最後,點擊註冊按鈕。

4. 等待註冊完成。此過程只需幾秒鐘。別忘了記下應用程式 (客戶端) ID和目錄 (租户) ID的值。您稍後會需要這些值。

創建用戶端密鑰
將之前創建的應用程式 ID 視為用戶名,而該應用程式 ID 需要一個密碼 – 這就是密鑰。
按照以下步驟添加新的應用程式密鑰。
- 前往憑證和密鑰,然後點擊新的客戶端密鑰。
- 輸入客戶端密鑰的描述,例如key1。
- 選擇密鑰過期的時間,然後點擊新增。在下面的示例中,密鑰過期時間為1年。

您將在客戶端密鑰部分中看到新的密鑰列表。這是唯一一次可以看到密鑰值的時候,所以請保存一份副本。

分配 API 權限並授予管理同意
現在,您已經創建了應用程式 ID 和密鑰,剩下的就是分配所需的 Microsoft Graph API 權限。如果未分配權限,應用程式可以進行身份驗證,但無權執行任何操作,例如發送郵件。
按照以下步驟開始分配權限。
- 在左側菜單中點擊API權限
2. 然後,在已配置的權限頁面中,點擊添加權限按鈕。

3. 在請求API權限彈出窗口中,點擊選擇Microsoft Graph API。

4. 當要求選擇應用程式所需的權限類型時,點擊應用程式權限。
5. 在搜索框中輸入Mail.Send進行搜索。在結果中,點擊勾選Mail.Send權限。最後,點擊添加權限。

6. 您會注意到權限狀態為“未授予<組織名稱>”。此時,您或全局管理員必須首先授予應用程式許可權。要授予許可權,請點擊授予<組織>的管理員許可權按鈕。

然後,API權限狀態變為“已授予<組織名稱>”。

獲取存取權杖
發送到Microsoft Graph API的請求需要一個存取權杖。此時,您已經擁有應用程式ID、密鑰和租戶ID。這三個信息是獲取存取權杖所需的。
下面的PowerShell腳本將存取權杖請求發送到Microsoft Graph API端點。您必須先更新$client_id
、$client_secret
和$tenant_id
為正確的值。然後,將代碼複製並粘貼到PowerShell中請求存取權杖。
以下示範展示了上面的 PowerShell 腳本的運作方式。請注意,所請求的存取權杖會儲存在 $token
變數中。

存取權杖僅在獲取時的一 (1) 小時內有效。在先前的權杖過期後,您需要請求另一個存取權杖。
使用 Microsoft Graph API 與 Azure 發送郵件
您現在可以使用 Azure 的 Microsoft Graph API 來
# 提供發件人和收件人的電子郵件地址
$fromAddress = 'SENDER ADDRESS HERE'
$toAddress = 'RECIPIENT ADDRESS HERE'
# 指定電子郵件主題和內容
$mailSubject = 'This is a test message from Azure via Microsoft Graph API'
$mailMessage = 'This is a test message from Azure via Microsoft Graph API'
# 請勿更改以下任何內容
# 構建 Microsoft Graph API 請求
$params = @{
"URI" = "https://graph.microsoft.com/v1.0/users/$fromAddress/sendMail"
"Headers" = @{
"Authorization" = ("Bearer {0}" -F $token)
}
"Method" = "POST"
"ContentType" = 'application/json'
"Body" = (@{
"message" = @{
"subject" = $mailSubject
"body" = @{
"contentType" = 'Text'
"content" = $mailMessage
}
"toRecipients" = @(
@{
"emailAddress" = @{
"address" = $toAddress
}
}
)
}
}) | ConvertTo-JSON -Depth 10
}
# 發送郵件
Invoke-RestMethod @params -Verbose