Microsoft Azure没有电子邮件传递服务。无论您是在Azure中测试应用程序还是开发脚本以发送电子邮件,要知道您无法使用本机电子邮件服务。
Azure中的出站SMTP连接通过端口25是完全被阻止的。如果您是企业客户,您可以请求解除对Azure租户端口25的阻止。否则,您还可以通过其他方式从Azure发送电子邮件吗?
通常有两种方法可以通过Azure发送出站电子邮件;使用SMTP智能主机和REST API请求。大多数电子邮件传递服务都提供通过SMTP和API发送电子邮件的方法。在本文中,您将了解如何从Azure发送电子邮件到全球其他地方。
先决条件
本文是一个操作指南,如果您计划按照示例进行操作,您必须满足一些要求。
- Azure订阅。如果您还没有Azure订阅,您可以注册免费试用Azure订阅。
- 一个Azure虚拟机(VM)。请参阅在Azure门户中创建Windows虚拟机,了解如何创建新的虚拟机(VM),如果您还没有的话。
- 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 中继服务或 Email 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虚拟机发送电子邮件。
在运行任何代码之前,您应该了解这些要求。
- 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 发送电子邮件
在 Azure 中使用 SendGrid 发送电子邮件的另一种方式是使用SendGrid Web API V3。与通过 SMTP 与 SendGrid 通信不同,使用 API 是通过 HTTP 进行通信的。HTTP 请求被发送到 SendGrid 的 API 端点 URL。
下面的示例 PowerShell 脚本使用 Invoke-RestMethod
cmdlet 来从 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 Auth将不再起作用。
- SMTP中继服务器地址为smtp.office365.com,端口号为587。
相关: 如何使用Office 365 Direct Send和PowerShell发送电子邮件
创建Office 365发件人地址
在这个例子中,发件人和认证用户是分开的。确保首先连接到Exchange Online PowerShell。连接后,按照以下步骤操作。
使用下面的命令创建一个共享邮箱。将-Name
和-PrimarySMTPAddress
更改为正确的值。
应该已创建共享邮箱,并返回类似以下的结果。

然后,将发送者权限分配给认证用户。在下面的示例中,用户被分配了发送者权限以访问共享邮箱。
执行上述命令后,您应该会得到类似以下的结果。

使用Office 365 SMTP中的Azure发送电子邮件
在创建发件人地址并分配发送者权限之后,下一步是使用PowerShell和Office 365 SMTP中继测试电子邮件传递。
以下代码使用[email protected]进行身份验证。地址[email protected]将显示为发件人。在运行代码之前,请确保分配正确的值。
不建议在明文中使用脚本中的凭据。生产脚本必须使用凭据加密或秘密管理来保护用户名和密码。
现在是时候检查收件人的邮箱了。确认是否收到了测试消息。

使用Microsoft Graph API发送Azure电子邮件
相比使用Office 365 SMTP中继,更安全且推荐的方式是使用Microsoft Graph API。通过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门户。
- 导航到AzureActive Directory —> 应用注册。然后,点击新注册按钮。

2. 在注册应用程序页面,输入应用程序的名称。
3. 在支持的帐户类型下,选择仅此组织目录中的帐户。将HTTP://localhost输入为重定向 URI。最后,点击注册按钮。

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. 您会注意到权限状态为“未授予 <organization name>”。此时,您或全局管理员必须首先同意该应用程序的权限。要授予权限,请单击为<organization>授予管理员同意按钮。

然后,API权限状态将变为“已授予 <organization name>”。

获取访问令牌
发送到Microsoft Graph API的请求需要访问令牌。此时,您已经拥有应用程序ID、密钥和租户ID。这三个信息是获取访问令牌所需的。
以下是发送访问令牌请求到Microsoft Graph API端点的PowerShell脚本。您必须先更新$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