你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

从自动化 Runbook 发送电子邮件

可以使用 PowerShell 通过 SendGrid 从 runbook 发送电子邮件。

如果没有 Azure 订阅,请在开始之前创建一个免费帐户

先决条件

创建 Azure Key Vault

创建一个 Azure 密钥保管库和密钥保管库访问策略,该策略允许凭据获取和设置指定密钥保管库中的密钥保管库机密。

  1. 使用 Connect-AzAccount cmdlet 以交互方式登录到 Azure,并按照说明进行操作。

    # Sign in to your Azure subscription
    $sub = Get-AzSubscription -ErrorAction SilentlyContinue
    if(-not($sub))
    {
        Connect-AzAccount
    }
    
    # If you have multiple subscriptions, set the one to use
    # Select-AzSubscription -SubscriptionId <SUBSCRIPTIONID>
    
  2. 为以下变量提供适当的值,然后执行脚本。

    $resourceGroup = "<Resource group>"
    $automationAccount = "<Automation account>"
    $region = "<Region>"
    $SendGridAPIKey = "<SendGrid API key>"
    $VaultName = "<A universally unique vault name>"
    
    $userAssignedManagedIdentity = "<User-assigned managed identity>"
    
  3. 创建密钥保管库并分配权限

    # Create the new key vault
    $newKeyVault = New-AzKeyVault `
        -VaultName $VaultName `
        -ResourceGroupName $resourceGroup `
        -Location $region
    
    $resourceId = $newKeyVault.ResourceId
    
    # Convert the SendGrid API key into a SecureString
    $Secret = ConvertTo-SecureString -String $SendGridAPIKey `
        -AsPlainText -Force
    
    Set-AzKeyVaultSecret -VaultName $VaultName `
        -Name 'SendGridAPIKey' `
        -SecretValue $Secret
    
    # Grant Key Vault access to the Automation account's system-assigned managed identity.
    $SA_PrincipalId = (Get-AzAutomationAccount `
        -ResourceGroupName $resourceGroup `
        -Name $automationAccount).Identity.PrincipalId
    
    Set-AzKeyVaultAccessPolicy `
        -VaultName $vaultName `
        -ObjectId $SA_PrincipalId `
        -PermissionsToSecrets Set, Get
    
    # Grant Key Vault access to the user-assigned managed identity.
    $UAMI = Get-AzUserAssignedIdentity `
        -ResourceGroupName $resourceGroup `
        -Name $userAssignedManagedIdentity
    
    Set-AzKeyVaultAccessPolicy `
        -VaultName $vaultName `
        -ObjectId $UAMI.PrincipalId `
        -PermissionsToSecrets Set, Get
    

    若要通过其他方式创建 Azure 密钥保管库并存储机密,请参阅密钥保管库快速入门

向托管标识分配权限

向适当的托管标识分配权限。 Runbook 可使用自动化帐户的系统分配的托管标识或用户分配的托管标识。 已提供为每个标识分配权限的步骤。 以下步骤使用 PowerShell。 如果你偏向于使用门户,请参阅使用 Azure 门户分配 Azure 角色

  1. 使用 PowerShell cmdlet New-AzRoleAssignment 将角色分配给系统分配的托管标识。

    New-AzRoleAssignment `
        -ObjectId $SA_PrincipalId `
        -ResourceGroupName $resourceGroup `
        -RoleDefinitionName "Reader"
    
  2. 为用户分配的托管标识分配角色。

    New-AzRoleAssignment `
        -ObjectId $UAMI.PrincipalId`
        -ResourceGroupName $resourceGroup `
        -RoleDefinitionName "Reader"
    
  3. 对于系统分配的托管标识,请显示 ClientId 并记录值供稍后使用。

    $UAMI.ClientId
    

创建用于发送电子邮件的 runbook

在创建密钥保管库并存储 SendGrid API 密钥后,接下来可以创建 Runbook 来检索 API 密钥和发送电子邮件。 让我们使用一个 Runbook,该 Runbook 使用系统分配的托管标识向 Azure 进行身份验证,以便从 Azure 密钥保管库检索机密。 我们将该 runbook 命名为 Send-GridMailMessage。 可以修改用于不同方案的 PowerShell 脚本。

  1. 登录到 Azure 门户,并导航到自动化帐户。

  2. 在打开的自动化帐户页面中,选择“流程自动化”下的“Runbook”

  3. 选择“+ 创建 Runbook”。

    1. 将 runbook 命名为 Send-GridMailMessage
    2. 从“Runbook 类型”下拉列表中,选择“PowerShell” 。
    3. 选择创建

    创建 Runbook

  4. 此时会创建 Runbook 并打开“编辑 PowerShell Runbook”页。 编辑 Runbook

  5. 将以下 PowerShell 示例复制到“编辑”页中。 确保 VaultName 指定你为密钥保管库选择的名称。

    Param(
      [Parameter(Mandatory=$True)]
      [String] $destEmailAddress,
      [Parameter(Mandatory=$True)]
      [String] $fromEmailAddress,
      [Parameter(Mandatory=$True)]
      [String] $subject,
      [Parameter(Mandatory=$True)]
      [String] $content,
      [Parameter(Mandatory=$True)]
      [String] $ResourceGroupName
    )
    
    # Ensures you do not inherit an AzContext in your runbook
    Disable-AzContextAutosave -Scope Process
    
    # Connect to Azure with system-assigned managed identity
    $AzureContext = (Connect-AzAccount -Identity).context
    
    # set and store context
    $AzureContext = Set-AzContext -SubscriptionName $AzureContext.Subscription -DefaultProfile $AzureContext 
    
    $VaultName = "<Enter your vault name>"
    
    $SENDGRID_API_KEY = Get-AzKeyVaultSecret `
        -VaultName $VaultName `
        -Name "SendGridAPIKey" `
        -AsPlainText -DefaultProfile $AzureContext
    
    $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"
    $headers.Add("Authorization", "Bearer " + $SENDGRID_API_KEY)
    $headers.Add("Content-Type", "application/json")
    
    $body = @{
    personalizations = @(
        @{
            to = @(
                    @{
                        email = $destEmailAddress
                    }
            )
        }
    )
    from = @{
        email = $fromEmailAddress
    }
    subject = $subject
    content = @(
        @{
            type = "text/plain"
            value = $content
        }
    )
    }
    
    $bodyJson = $body | ConvertTo-Json -Depth 4
    
    $response = Invoke-RestMethod -Uri https://api.sendgrid.com/v3/mail/send -Method Post -Headers $headers -Body $bodyJson
    
  6. 如果希望 Runbook 使用系统分配的托管标识执行,请按原样保留代码。 如果希望使用用户分配的托管标识,则执行以下操作:

    1. 从第 18 行中删除 $AzureContext = (Connect-AzAccount -Identity).context
    2. 将其替换为 $AzureContext = (Connect-AzAccount -Identity -AccountId <ClientId>).context,然后
    3. 输入之前获取的客户端 ID。
  7. 选择“保存”、“发布”,并在出现系统提示时选择“是” 。

若要验证 runbook 是否成功执行,可以按测试 runbook启动 runbook 下的步骤操作。

如果一开始看不到测试电子邮件,请检查 Junk 和 Spam 文件夹。

清理资源

  1. 如果不再需要该 Runbook,请在 Runbook 列表中选择它,然后选择“删除”

  2. 使用 Remove-AzKeyVault cmdlet 删除密钥保管库。

    $VaultName = "<your KeyVault name>"
    $resourceGroup = "<your ResourceGroup name>"
    Remove-AzKeyVault -VaultName $VaultName -ResourceGroupName $resourceGroup
    

后续步骤