Azureを使用してSendGrid、Graph、およびOffice 365でメールを送信する

Microsoft Azureにはメール配信サービスがありません。Azureでアプリケーションをテストしたり、スクリプトを開発してメールを送信する場合、ネイティブのメールサービスは利用できません。

また、Azureではポート25を介したアウトバウンドSMTP接続も完全にブロックされています。エンタープライズクライアントの場合、Azureテナントでポート25のブロック解除を要求することができます。それ以外の場合、Azureからどのようにメールを送信できるのでしょうか?

Azureを介してアウトバウンドメールを送信する方法は通常2つあります。SMTPスマートホストを使用する方法と、REST APIリクエストを使用する方法です。ほとんどのメール配信サービスは、SMTPおよびAPIの両方の方法でメールを送信することができます。この記事では、Azureから世界中にメールを送信する方法について学びます。

前提条件

この記事はハウツー形式であり、進行に従って例を実行する予定の場合、いくつかの要件を満たす必要があります。

  • Azureのサブスクリプション。まだサブスクリプションを持っていない場合は、無料トライアルのAzureサブスクリプションに登録することができます。
  • Azure 仮想マシン (VM)。まだ持っていない場合は、新しい 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 で電子メールを送信するために使用する電子メールサービスを知る

いくつかのクラウド電子メールサービスが利用可能です。その中でも主要なものには、SendGridMailJetMailGunなどがあります。どの電子メールサービスを選択しても、Azure から電子メールを送信する方法は似ています。SMTP のためのサーバーアドレスとポート、および REST のための API エンドポイントアドレスが必要です。

この記事では、SendGrid をサードパーティの電子メールサービスの例として使用しています。その他の例として使用される電子メールサービスには、Office 365 SMTP リレーと Microsoft Graph API があります。

関連記事: 2021 年に選ぶ Azure の電子メールサービス

SendGrid の使用

SendGridは、おそらくAzureからのメール送信に最も人気のあるオプションです。AzureとSendGridは非常に人気があります。なぜなら、かつてAzureの顧客に対して1ヶ月に25,000通のメールを送信する無料プランが提供されていたからです。

Azureポータルでは現在、無料プランは提供されていませんが、Microsoftによって確認されているように、1日あたり100通の制限付きの無料サブスクリプションに登録することが可能です。その後、AzureアプリやVMからメールを送信するために、SendGridのSMTPリレーサービスまたはEmail APIにアクセスできます。

SendGridアカウントの作成

SendGridのサービスを利用するには、まずSendGridのアカウントを作成する必要があります。以下のように表示されるフォームが表示されるサインアップページに移動し、メールアドレスと選択したパスワードを入力します。その後、利用規約に同意し、アカウントを作成ボタンをクリックします。

Signing up for a free SendGrid account

次のページでは、名前と会社情報を入力する必要があります。また、役割、1ヶ月あたりの送信メール数、従業員数などの適切なオプションを選択する必要があります。その後、開始をクリックします。

Entering your account information

SendGridに初めてログインすると、「SendGridにアクセスする権限がありません。サポートに連絡してください。」というエラーが表示される場合があります。この場合は、SendGridのサポートにチケットを開く必要があります。アクセスを解除する前にいくつかの確認質問をされることがあります。

初回ログイン時には、二要素認証の有効化を求められます。指示に従って正確に設定してください。

SendGridの送信者識別子を作成する

SendGridアカウントを作成したら、次のステップは送信者の識別子を認証することです。2つのオプションがあります。単一の送信者を認証する(例:[email protected])か、ドメイン全体を認証する(例:domain.com)かです。

この例では、送信者アドレスとして機能する単一の送信者識別子を作成します。確認された送信者アドレスのみがSendGridのサービスを介してメッセージを送信できるようになります。以下の手順に従って単一の送信者識別子を作成してください。

  1. 「ようこそ」ページで、単一の送信者を作成ボタンをクリックします。
Creating a single sender

2. 次に、送信者を作成のフライアウトで、必要な情報をすべて入力します。必須フィールドは赤いアスタリスクでマークされています。詳細を入力した後、作成をクリックします。

Providing the sender details

その後、単一送信者の検証ページに新しい送信者アドレスが表示されます。以下の例からわかるように、アドレスはまだ検証されておらず、VERIFIED列の下に赤いXが表示されています。

Viewing the sender address verification status

3. 送信者を検証するには、以下のスクリーンショットと同様に送信者のアドレスに送信されたメールを見つけて、単一送信者を検証ボタンをクリックします。

Verifying the Single Sender address

送信者のアドレスが検証済みになります。以下のスクリーンショットと同様のページが表示され、送信者の検証が完了したことが確認されます。

Confirming that the sender address verification is complete

SendGrid APIキーの作成

単一の送信者アドレスを作成した後、APIキーを作成するためのインターフェースが利用可能になります。SendGrid APIキーはパスワードと考えてください。これがないと、コードはSendGrid SMTPリレーサービスで認証できません。以下の手順に従って新しいAPIキーを作成します。

  1. 左側のメニューで、設定 > APIキーをクリックします。次に、ページの右上隅にあるAPIキーの作成ボタンをクリックします。
Creating a new SendGrid API key

2. APIキーの作成フライアウトが表示されます。作成するAPIキーの名前を入力します。”AzureテストAPIキー”など、意味のある名前を使用してください。次に、簡単のために、権限としてフルアクセスを選択します。最後に、作成して表示ボタンをクリックします。

Naming the API key and choosing permissions

3. 新しいAPIキーが表示されます。キーの値をコピーして保存してください。再表示されないためです。キーをコピーしたら、完了をクリックします。

Saving the new SendGrid API key

SendGrid SMTPリレーを使用してAzureからメールを送信する

SendGridを使用してAzureのメールを送信するために必要なコンポーネント(アカウント、送信者、キー)が揃いました。SendGridのSMTPリレーサービスが機能するかテストする時が来ました。このセクションでは、Azure VMから電子メールを送信するためにPowerShellを使用します。

コードを実行する前に、以下の要件を知っておく必要があります。

  • SendGridのSMTPサーバーアドレスはsmtp.sendgrid.netです。
  • SMTP認証に使用するユーザー名は常にapikeyです。
  • 使用するパスワードはSendGridで作成したAPIキーの値です。
  • ポート25ではなく、代わりにポート587を使用してください。
  • SendGridで確認済みの送信者アドレスのみ、メールの送信元として有効です。この例では、認可された送信者は[email protected]です。

以下のスクリプトは、SendGridのSMTPリレーを介してメールを送信します。以下のコードをコピーし、$sendGridApiKeyFromToBodyの値を変更してください。その後、PowerShellセッションでコードを実行してください。各行のコードの役割については、コメントを参照してください。

# ここにAPIキーを設定します
$sendGridApiKey = 'SG...........P258'

$SendGridEmail = @{
	# 確認済みの送信元アドレスを使用してください
	From = '[email protected]'
	# メールの受信者を指定します。有効なメールアドレスならどれでも機能します
	To = '[email protected]'
	# 使用するメールの件名を更新してください
	Subject = 'This is a test message from Azure via SendGrid'
	# 送信したいメールの本文やメッセージを更新してください
	Body = 'This is a test message from Azure via SendGrid'
	
	# この行以下の部分は変更しないでください
	SmtpServer = 'smtp.sendgrid.net'
	Port = 587
	UseSSL = $true
	Credential = New-Object PSCredential 'apikey', (ConvertTo-SecureString $sendGridApiKey -AsPlainText -Force)	
}

# メールを送信する
Send-MailMessage @SendGridEmail

以下のデモでは、PowerShellで上記のコードを実行した場合のリアルタイムの表示例を示しています。

Sending an Email from Azure using SendGrid SMTP Relay

メールの配信可否を確認するために、受信者のメールボックスを確認して送信したテストメッセージを見つけてください。結果は以下の例と似ています。送信元アドレスはsendgrid.net経由でメッセージが届いたことがわかります。

Confirming the SMTP test message was delivered

関連: Send-MailMessage: PowerShellでメールを送信する方法

SendGrid APIを使用してAzureからメールを送信する

AzureでSendGridを使用してメールを送信する別の方法は、SendGrid Web API V3を使用する方法です。SMTP経由ではなく、APIを使用して通信します。HTTPリクエストはSendGridのAPIエンドポイントURLに送信されます。

以下のPowerShellスクリプトの例では、Invoke-RestMethodコマンドレットを使用して、AzureからSendGridへのメールリクエストを送信します。コードをコピーして、$sendGridApiKey$fromAddress$toAddress$mailSubject、および$mailMessage変数の値を変更してください。

変数の更新が完了したら、PowerShellでコードを実行します。

Set your API Key here
 $sendGridApiKey = 'SG………..P258'
 Set the sender and recipient addresses
 $fromAddress = "[email protected]"
 $toAddress = "[email protected]"
 Set the mail subject
 $mailSubject = "This is a test message from Azure via SendGrid API"
 Set the mail message
 $mailMessage = "This is a test message from Azure via SendGrid API"
 DO NOT CHANGE ANYTHING BELOW THIS LINE
 Compose the Mail Body
 $mailbody = @{
   personalizations = @(
     @{
       to      = @(
         @{
           email = $toAddress
         }
       )
       subject = $mailSubject
     }
   )
   from             = @{
     email = $fromAddress
   }
   content          = @(
     @{
       type  = "text/plain"
       value = $mailMessage
     }
   )
 } | ConvertTo-Json -Depth 10
 $headers = @{'Authorization' = "Bearer $($sendGridApiKey)" }
 $mailApiUri = 'https://api.sendgrid.com/v3/mail/send'
 Send the email
 Invoke-RestMethod -Method Post -Uri $mailApiUri -Body $mailbody -Headers $headers -ContentType application/json

上記のPowerShellコードを実行した後、受信者のメールボックスを確認し、テストメッセージを受信したことを確認してください。以下の例は、AzureからSendGrid APIを介して正常に配信されたテストメッセージを示しています。

Confirming the API test message was delivered

SendGrid Web APIについて詳しく学びたい場合は、V3 Mail Send APIページをご覧ください。

Office 365 SMTP認証の使用

Azureのメールを送信する別のオプションは、Office 365 SMTPリレーを使用することです。これは、組織が既にExchange Onlineサブスクリプションを持っている場合にのみ使用できます。SendGridをSMTPスマートホストとして使用する場合と同様に、Office 365 SMTPリレーでは認証とポート587の使用が必要です。

Office 365 SMTPリレーを使用する前に、以下の条件を満たす必要があります。

  • 送信者アドレスは、メールボックスまたはメールユーザーなどの有効なExchange Online受信オブジェクトである必要があります。ただし、非配信レシート(NDR)を保存する場合は、メールボックスを使用してください。
  • 認証ユーザーには有効なExchange Onlineライセンスが必要です。Office 365 SMTPリレーを使用するには、ライセンス付きのExchange Onlineユーザーのみが許可されています。
  • 送信者とは異なる認証ユーザーの場合、ユーザーは送信者アカウントに「送信権限」を割り当てられる必要があります。
  • 使用されている認証メソッドは「基本(レガシー)」です。これは、組織でSMTP基本認証が無効になっている場合、またはMicrosoftが基本認証を廃止した場合、SMTP Authは機能しなくなります。
  • SMTPリレーサーバーアドレスは「smtp.office365.com」であり、ポート番号は587です。

関連情報:Office 365 Direct SendとPowerShellを使用してメールを送信する方法

Office 365の送信者アドレスの作成

この例では、送信者と認証ユーザーが別々です。まず、Exchange Online PowerShellに接続してください。接続後、以下の手順に従ってください。

以下のコマンドを使用して共有メールボックスを作成します。 -Name-PrimarySMTPAddress を正しい値に変更してください。

New-Mailbox -Shared -Name 'SMTP Mailer 365' -PrimarySMTPAddress '[email protected]'

共有メールボックスが作成され、以下のような結果が返されます。

Creating a new shared mailbox as the sender

次に、認証ユーザーに「送信元として送信」の権限を割り当てます。以下の例では、ユーザーに共有メールボックスへの「送信元として送信」の権限が割り当てられます。

Add-RecipientPermission -Identity '[email protected]' -Trustee '[email protected]' -AccessRights SendAs -Confirm:$false

上記のコマンドを実行すると、以下のような結果が得られます。

Assigning Send As permission

Azureを使用してOffice 365 SMTPリレーからメールを送信する

送信元アドレスの作成と「送信元として送信」権限の割り当てが完了したら、次のステップはPowerShellとOffice 365 SMTPリレーを使用してメールの配信をテストすることです。

以下のコードでは、[email protected]を使用して認証します。送信者として[email protected]が表示されます。コードを実行する前に、正しい値を割り当ててください。

# SMTPの認証情報を提供してください
$username = '[email protected]'
$password = '*************'

# 送信者と受信者のメールアドレスを指定してください
$fromAddress = '[email protected]'
$toAddress = '[email protected]'

# メールの件名とメッセージを指定してください
$mailSubject = 'This is a test message from Azure via Office 365 SMTP Relay'
$mailMessage = 'This is a test message from Azure via Office 365 SMTP Relay'

# 以下の行以降の部分を変更しないでください
$Office365RelayEmail = @{
	From = $fromAddress
	To = $toAddress
	Subject = $mailSubject
	Body = $mailMessage	
	SmtpServer = 'smtp.office365.com'
	Port = 587
	UseSSL = $true
	Credential = New-Object PSCredential $username, (ConvertTo-SecureString $password -AsPlainText -Force)	
}

# メールを送信する
Send-MailMessage @Office365RelayEmail

平文でスクリプト内の資格情報を使用することは推奨されません。本番のスクリプトでは、資格情報の暗号化や秘密管理を使用してユーザー名とパスワードを保護する必要があります。

それでは、受信者のメールボックスを確認しましょう。テストメッセージが受信されたことを確認してください。

Confirming the Office 365 SMTP relay test message was delivered

Azureメールを送信するためにMicrosoft Graph APIを使用する

Office 365 SMTPリレーを使用する代わりに、より安全で推奨される方法はMicrosoft Graph APIを使用することです。Microsoft Graph APIを使用すると、REST API呼び出しを使用して組織内の任意のメールボックスからメールを送信できます。

Microsoft Graph APIを使用してメールを送信するには、登録済みのAzure ADアプリが必要です。登録済みのアプリにはMail.SendAPIの許可が割り当てられている必要があります。次のセクションでは、Microsoft Graph APIの構成方法と使用方法について説明します。

関連情報:PowerShellでMicrosoft Graph APIを使用する方法

Azure Active Directoryで新しいアプリを登録する

このセクションでは、Azure Active Directoryに新しいWebアプリを登録します。新しいアプリは、Microsoft Graphの認証アイデンティティとして機能します。ログインしていない場合は、Azure Portalにログインします。

  1. Azure Active Directory —> アプリ登録に移動します。次に、新規登録ボタンをクリックします。
Creating a new app registration

2. アプリを登録するページで、アプリの名前を入力します。

3. サポートされるアカウントの種類の下で、組織のディレクトリ内のアカウントのみを選択します。 リダイレクト URIとしてHTTP://localhostを入力します。 最後に、登録ボタンをクリックします。

Registering an application

4. 登録が完了するまで待ちます。 プロセスは数秒で完了します。 アプリケーション(クライアント)IDディレクトリ(テナント)IDの値を忘れずにメモしておいてください。 それらは後で必要になります。

Saving the Application ID and Directory values

クライアントシークレットキーの作成

前のセクションで作成したアプリケーションIDをユーザー名と考えてください。 そして、そのアプリケーションIDにはパスワードが必要です-それがシークレットキーです。

新しいアプリケーションシークレットキーを追加するには、以下の手順に従ってください。

  1. 証明書とシークレットに移動し、新しいクライアントシークレットをクリックします。
  2. クライアントシークレットの説明を入力し、key1などとします。
  3. シークレットの期限を選択し、追加をクリックします。 以下の例では、シークレットキーの期限は1年です。
Adding a new client secret key

新しいキーがクライアントシークレットセクションにリストされます。 これがキーの値を表示する最初で最後の機会なので、コピーして保存してください。

Viewing the client secret key value

アプリケーションIDとシークレットを作成したので、残りは必要なMicrosoft Graph APIの権限を割り当てることです。 権限を割り当てない場合、アプリケーションは認証できますが、電子メールを送信するなど何も実行する権限がありません。

権限を割り当てるには、以下の手順に従ってください。

  1. 左側のメニューでAPIの権限をクリックします。

2. 次に、構成済みの権限ページで権限を追加ボタンをクリックします。

Adding API permission

3. APIの権限を要求のフライアウトで、Microsoft Graph APIを選択します。

Selecting Microsoft Graph API

4. アプリケーションに必要な権限のタイプを選択するよう求められたら、アプリケーションの権限をクリックします。

5. 検索ボックスにMail.Sendと入力して検索します。結果からMail.Sendの権限をチェックし、最後に権限を追加をクリックします。

Assigning mail.send permission

6. 権限のステータスが「<組織名>に対して許可されていません」と表示されます。この時点で、あなたまたはグローバル管理者がアプリケーションに対して許可を与える必要があります。権限を付与するために、<組織名>に対して管理者の同意を付与ボタンをクリックしてください。

Granting Admin consent

すると、APIの権限ステータスが「<組織名>に対して許可されています」と変わります。

Confirming the API permission status

アクセストークンの取得

Microsoft Graph APIに送信するリクエストにはアクセストークンが必要です。この時点で、アプリケーションID、シークレットキー、テナントIDをすでに取得しています。これらの情報がアクセストークンを取得するために必要なものです。

以下のPowerShellスクリプトは、アクセストークンをMicrosoft Graph APIエンドポイントに送信するリクエストを行います。まず、$client_id$client_secret$tenant_idを正しい値に更新してください。次に、PowerShellにコードをコピーしてアクセストークンをリクエストします。

#アプリケーションIDに置き換えてください
$client_id = 'APPLICATION ID'
#シークレットキーに置き換えてください
$client_secret = 'SECRET KEY'
#テナントIDに置き換えてください
$tenant_id = 'TENANT ID'

#以下の行は変更しないでください
$request = @{
        Method = 'POST'
        URI    = "https://login.microsoftonline.com/$tenant_id/oauth2/v2.0/token"
        body   = @{
            grant_type    = "client_credentials"
            scope         = "https://graph.microsoft.com/.default"
            client_id     = $client_id
            client_secret = $client_secret
        }
    }
#アクセストークンを取得
$token = (Invoke-RestMethod @request).access_token
#トークンの値を表示
$token

下記のデモンストレーションは、上記のPowerShellスクリプトが実行されています。要求されたアクセストークンは$token変数に保存されていることに注目してください。

Requesting access 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


Source:
https://adamtheautomator.com/azure-send-email/