Azure Communication Services (EMail) を用いた SMTP メール送信
API 利用して送信する記事は多かったのですが、SMTP を利用して~が見当たらなかったので、雑多ですが個人的な備忘メモとして。 端的に言うと SendGrid 等ではなく Email Communication Services を利用してメール送信してみようという話です。
Azure Communication Services リソースの作成
Azure Portal の検索から "Communication Services" 選択して、任意でリソースを作成
Email Communication Services リソースの作成
以下、参照
クイック スタート: メール通信サービスのリソースを作成して管理する
https://learn.microsoft.com/ja-jp/azure/communication-services/quickstarts/email/create-email-communication-resource
カスタムドメイン
カスタムドメインのプロビジョニング
クイック スタート: 検証済みカスタム メール ドメインを追加する方法
https://learn.microsoft.com/ja-jp/azure/communication-services/quickstarts/email/add-custom-verified-domains?pivots=platform-azp
- Email Communication Services に直接ドメインを追加する。手順は Entra ID のカスタムドメイン追加とほぼ同じ。
- 前段で作成していた ECSリソース を選択
- ドメインの追加 > カスタムドメイン > TXTレコードでの認証
- Entra ID にカスタムドメインを追加する時と同様に TXTレコード ほか、各DNSレコードの登録を求められるので進める。
- ドメインの検証がすべて完了すると、下図のようになる (送信が主なのでMXレコードはない)
Azure Communication Services と Email Communication Services の関連付け
- 事前に作成していた ACS と、ECS を関連付ける
- 作成していた ACSリソース を選択、メール → ドメイン から、ECS を作成していた サブスクリプション / リソースグループ / ECS / 確認済みドメイン を選択し、接続する。
SMTP 認証の準備
Azure Communication Services でのメール SMTP サポート
https://learn.microsoft.com/ja-jp/azure/communication-services/concepts/email/email-smtp-overview
サービスプリンシパルの作成
Microsoft Entra ID にアプリケーションを登録し、サービス プリンシパルを作成する
https://learn.microsoft.com/ja-jp/entra/identity-platform/howto-create-service-principal-portal#register-an-application-with-microsoft-entra-id-and-create-a-service-principal
- Entra ID → アプリの登録 → 新規登録 (名前を入力し、他は既定値で作成)
クライアントシークレットの作成
手順 3: 新しいクライアント シークレットを作成する
https://learn.microsoft.com/ja-jp/entra/identity-platform/howto-create-service-principal-portal#option-3-create-a-new-client-secret
-
前段で登録したアプリケーションを選択 → 管理 → 証明書とシークレット → “+新しいクライアント シークレット”
カスタムロールの作成
Microsoft Entra アプリケーションのカスタム メール ロールの作成
https://learn.microsoft.com/ja-jp/azure/communication-services/quickstarts/email/send-email-smtp/smtp-authentication
- 事前に作成していた ACSリソース を選択 → アクセス制御 (IAM) → 役割 → 閲覧者ロールを複製する。
- “基本” で任意を名称を入力後、アクセス許可の追加で許可するものを選択する (詳細はドキュメント参照)
- Microsoft.Communication/CommunicationServices/Read
- Microsoft.Communication/CommunicationServices/Write
-
Microsoft.Communication/EmailServices/write
カスタムロールをアプリケーションへの割当
- 事前に作成していた ACSリソース を選択 → アクセス制御 (IAM) → “+追加” → ロール割当の追加
- 前段で作成していたカスタムロールを選択し、メンバーには、事前に Entra ID に登録していたアプリケーションを選択
SMTP 資格情報の取得
SMTP認証ユーザ名
- SMTP 認証に使う ID は下記3つの情報で構成されます。各リソースからそれらを取得します。
- Azure Communication Services リソースの名前
- Microsoft Entra アプリケーション ID
- Microsoft Entra テナント ID
- Azure Communication Services リソースの名前
- 取得できたらそれらを “.” (ドット) または “|” (パイプ) で 1行 にまとめます。これが SMTP認証 に用いる ID になります。
username: <Azure Communication Services Resource name>.<Microsoft Entra Application ID>.<Microsoft Entra Tenant ID>
username: <Azure Communication Services Resource name>|<Microsoft Entra Application ID>|<Microsoft Entra Tenant ID>
SMTP認証パスワード
- 認証パスワードは Entra ID に登録したアプリケーションで事前に作成していたシークレットになります。
- シークレットをコピペし忘れていた場合は、事前に作成していたものを削除し改めて作り直しましょう。
メール送信テスト
SMTP AUTH クライアントの送信を設定する方法
https://learn.microsoft.com/ja-jp/azure/communication-services/quickstarts/email/send-email-smtp/smtp-authentication#how-to-set-up-smtp-auth-client-submission
以下の情報を用いて、送信クライアント等の設定を行いテストします。
デバイスまたはアプリケーションの設定 | 値 |
---|---|
サーバー/スマート ホスト | smtp.azurecomm.net |
ポート | ポート 587 (推奨) またはポート 25 |
TLS / StartTLS | 有効 |
ユーザー名とパスワード | Azure Communication Services リソースにアクセスできるアプリケーションから、Microsoft Entra アプリケーションの資格情報を入力します |
送信元メールアドレスの確認
- ECSリソース に追加していたドメインを選択
- EmailFrom Addresses から既定の From アドレスを確認
2025/3/10 追記
送信元メールアドレスの追加は az コマンド経由であれば手動でも対応できました。ただし "communication email" のコマンドグループはプレビューとあったので実行時には注意してください。
## az コマンドのアップグレード
az upgrade
## az コマンドで指定したテナントにサインイン
az login --tenant xxxxxxxx-xxxxxxxx-xxxxxxx
## MailFrom アドレスの追加
az communication email domain sender-username create --domain-name <ドメイン名> --email-service-name <ECSリソース名> -g <リソースグループ名> --sender-username <Fromアドレスの@より前> --username <Fromアドレスの@より前> --display-name <表示名>
2025/3/13 追記
また聞きだけど、送信元メールアドレスは最大でも100程度が上限?との事なので、送信元を大量に登録して~とか考えると問題になるかも
テスト例
適当な PowerShell を用いて送信をテストする。 送信自体は Azure 以外の環境からも出来ます。
# メールサーバの情報
$smtpServer = "smtp.azurecomm.net"
$smtpPort = 587
$smtpUser = "<SMTP認証ユーザ>"
$smtpPassword = "<SMTP認証パスワード>"
# メールの詳細 (from/to 要修正)
$from = "DoNotReply@example.com"
$to = "xxxx@example.com"
$subject = "Test Email"
$body = "This is a test email sent from PowerShell."
# メール送信
Send-MailMessage -SmtpServer $smtpServer -Port $smtpPort -Credential (New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $smtpUser, (ConvertTo-SecureString $smtpPassword -AsPlainText -Force)) -From $from -To $to -Subject $subject -Body $body -UseSsl
ログについて
送信時のログや結果等については ACS 側の監視の項目にて確認する。
何通か送信テストをした際にはメトリック等でも送信された形跡が見れますが、トラブルシューティングも含む情報を得たい場合は、診断設定を有効にし Azure Monitor / Log Analytics で確認できるようにしましょう。
参考情報・備忘メモ
料金について
メールの送信数 + メールサイズが課金大量となるので料金計算ツールで算出しましょう。
料金計算ツールの該当箇所
Azure VM からでもメール送れる?
上述の通り Azure Communication Services 自体は 587 (or 25) ポートで開放されているため、問題なく送信できます。 以下 Azure VM + RHEL9 で ZABBIX をインストールして、下図設定で試したところ問題なく送信できました。
Discussion