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 で電子メールを送信するために使用する電子メールサービスを知る
いくつかのクラウド電子メールサービスが利用可能です。その中でも主要なものには、SendGrid、MailJet、MailGunなどがあります。どの電子メールサービスを選択しても、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のアカウントを作成する必要があります。以下のように表示されるフォームが表示されるサインアップページに移動し、メールアドレスと選択したパスワードを入力します。その後、利用規約に同意し、アカウントを作成ボタンをクリックします。

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

SendGridに初めてログインすると、「SendGridにアクセスする権限がありません。サポートに連絡してください。」というエラーが表示される場合があります。この場合は、SendGridのサポートにチケットを開く必要があります。アクセスを解除する前にいくつかの確認質問をされることがあります。
初回ログイン時には、二要素認証の有効化を求められます。指示に従って正確に設定してください。
SendGridの送信者識別子を作成する
SendGridアカウントを作成したら、次のステップは送信者の識別子を認証することです。2つのオプションがあります。単一の送信者を認証する(例:[email protected])か、ドメイン全体を認証する(例:domain.com)かです。
この例では、送信者アドレスとして機能する単一の送信者識別子を作成します。確認された送信者アドレスのみがSendGridのサービスを介してメッセージを送信できるようになります。以下の手順に従って単一の送信者識別子を作成してください。
- 「ようこそ」ページで、単一の送信者を作成ボタンをクリックします。

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

その後、単一送信者の検証ページに新しい送信者アドレスが表示されます。以下の例からわかるように、アドレスはまだ検証されておらず、VERIFIED列の下に赤い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リレーサービスが機能するかテストする時が来ました。このセクションでは、Azure VMから電子メールを送信するためにPowerShellを使用します。
コードを実行する前に、以下の要件を知っておく必要があります。
- 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経由ではなく、APIを使用して通信します。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認証の使用
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
を正しい値に変更してください。
共有メールボックスが作成され、以下のような結果が返されます。

次に、認証ユーザーに「送信元として送信」の権限を割り当てます。以下の例では、ユーザーに共有メールボックスへの「送信元として送信」の権限が割り当てられます。
上記のコマンドを実行すると、以下のような結果が得られます。

Azureを使用してOffice 365 SMTPリレーからメールを送信する
送信元アドレスの作成と「送信元として送信」権限の割り当てが完了したら、次のステップはPowerShellとOffice 365 SMTPリレーを使用してメールの配信をテストすることです。
以下のコードでは、[email protected]を使用して認証します。送信者として[email protected]が表示されます。コードを実行する前に、正しい値を割り当ててください。
平文でスクリプト内の資格情報を使用することは推奨されません。本番のスクリプトでは、資格情報の暗号化や秘密管理を使用してユーザー名とパスワードを保護する必要があります。
それでは、受信者のメールボックスを確認しましょう。テストメッセージが受信されたことを確認してください。

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にログインします。
- 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