はじめに
本記事では、Azure VM からメールを送信したい場合に、どのような制約があり、どのような手段が現実的な選択肢になるのかを整理したうえで、具体的な設定方法を紹介します。
まず前提として、Azure 環境では SMTP の扱いにいくつか注意点があります。特に 25 番ポートに関する制限は、初めて Azure でメール送信を行う際につまずきやすいポイントです。
問題点
Azure環境では、通常SMTPに使う送信25番ポートに関してブロックする、いわゆるOP25Bのような動作が基本となっています。以下のようになっていて、EA(エンタープライズ契約)契約以外は送信25番ポートはブロックとなります。
| 契約 | 既定の動作 |
|---|---|
| EA(エンタープライズ契約) | 送信25番ポート許可 |
| MCA-E(エンタープライズ契約) | 送信25番ポート許可 |
| CSP(代理店再販) | 送信25番ポート拒否 |
| 従量課金(Pay-As-You-Go) | 送信25番ポート拒否 |
| その他 | 送信25番ポート拒否 |
注意すべきは、代理店経由の契約であるCSPであっても送信25番ポートをブロックする点です。また、ブロックされていなくても、Azureから25番ポートを使って直接メール送信することは、マイクロソフトの推奨ではありません。
25番ポートからの送信はできませんが、サブミッションポートである587番ポートはブロックしませんので、「外部サービスを使ってメールリレーしましょう」というのが推奨される方法です。
そして、よく検討にあがってくるのが、SendGridなどのメール配信サービスではないかと思います。また、Azureだけで完結させたいのであれば、Azure Communication Service (ACS)もさほど手間をかけずにメールリレーできると思います。
今回、上記2つの方法をAzureで使う方法を紹介します。
1. ACSの作成
Azureで「commnication」などと検索すれば「Communication Services」が候補にでてくるので、そこからリソースの画面を表示させて、作成ボタンをクリックすればよいでしょう。
作成画面で、表示の通りリソースグループ、リソース名、データロケーションを設定します。データロケーションは「Japan East」とかではなく「Japan」しかないようです。
2.SMTP接続用パスワードの作成
SMTPとしてACSに接続するパスワードを作成する必要があります。これは、サービスプリンシパルである必要があります。要件は以下の通りです。
メール送信するACSに対してサービスプリンシパルに以下のロールが付与されていること
- Communication and Email Service Owner
または、以下のアクセス許可があるカスタムロール
- Microsoft.Communication/CommunicationServices/Read
- Microsoft.Communication/CommunicationServices/Write
- Microsoft.Communication/EmailServices/write
Entra ID > 左のブレードから 管理 > アプリの登録 の順に画面をたどり、「新規作成」をクリックしてサービスプリンシパルを作成します。既定のまま名前だけ入れればよいです。
作成後、サービスプリンシパルの画面に遷移するので、左のブレードから「証明書とシークレット」をクリックし「新しいクライアント シークレット」をクリックして、シークレットを作成します。ここで作成されたシークレットの値がSMTP接続時のパスワードになります。
ACSのIAM(ロール設定の画面)に移動して、作成したサービスプリンシパルに「Communication and Email Service Owner」またはカスタムロールを付与します。
3.メールドメインの設定
メールドメインを追加します。今の状態では送信元メールアドレスがない状態です。ドメインには「マネージド ドメイン」と「カスタム ドメイン」があります。
初めに、「Email Communication Service」という種類のリソースを作成する必要があります。
画面上部の検索バーから検索するなどして、リソースを作成します。リージョンは「グローバル」固定です。Data Locationは「Japan」が選択可能です。
作成したら、リソースの画面に移動し、左のブレードから Settings > Provisioned domains の順にたどります。
3.1.マネージドドメインの追加
マネージドドメインでよければ、「Add domin」をクリックして候補から「Azure Domain」をクリックしてください。するとデプロイが走り、<自動設定される文字列>.azurecomm.net というドメインが自動で追加されます。
3.2.カスタムドメインの追加
カスタムドメインを追加する場合は、同じく「Add domin」をクリックして「Custom domain」をクリックします。ドメインレジストラから有効なドメインを取得していることが前提となります。
画面が表示されたら、自分の持っているドメインを入力して「Confirm」をクリックし、下側にある「Add」をクリックします。
ドメインを検証する必要がある旨表示されるので、「Verify Domain」をクリックします。
TXTレコードを追加するよう表示されるので、ドメインを管理している権威DNS(普通はドメインレジストラのDNS)サーバにレコードを追加します。
注意
特定のDNSサーバを指定することはできないので、例えば、まだ外部に公開したくないので、権威DNSから委任していないDNSサーバに問い合わせてドメイン検証させる、ということはできません。
DNSに設定して、「Next」をクリックし、「Finish」タブまで移動するとドメイン検証中という画面が出てきます。待っていると自動的に検証されてドメイン登録されます。
このままでもメールは送信できるはずですが、SPF/DKIMも設定できます。一覧のSPF Status/DKIM Status/DKIM2 Statusいずれかの列に表示されている「Configure」をクリックすると、登録すべきレコードの一覧が表示されるので、権威DNSサーバにレコード登録します。
先ほどと同様、「Next」をクリックし、「Finish」タブまで移動するとドメイン検証中という画面が出てきます。待っていると自動的に検証されます。ステータスがすべて「Verified」になれば成功です。
4.送信メールアドレスの設定
次に送信メールアドレスを設定します。送信メールアドレスがないとメールは送信できません。
ACSを開き、ブレードから メール > ドメイン の順にたどります。「Connect domain」をクリックします。設定画面が表示されたら、作成したEmail Serviceと利用するドメインを選択します。
次に「3.メールドメインの設定」で設定した「Email Communication Service」(ここでは、リソース名:acs-mail-service-exampleとしたもの)を開き、左のブレードから Settings > Provision domains の順にたどると、登録したメールドメインの一覧が表示されるので、使いたいドメインをクリックします。
さらに、左のブレードから Email services > MailFrom addresses の順にたどると、使用できる送信元メールアドレスを表示させることができます。既定では「DoNotReply@<メールドメイン>」というメールアドレスが追加されているはずです。
ここで画面上部の「+ Add」ボタンをクリックすると任意の名前のメールアドレスを追加できます
注意
既定ではメールアドレスの追加はできないようになっています。既定で設定されているメール送信数の上限値ではメールアドレスを追加する要件を満たしていません。サポートリクエストで送信数の上限のクォータを引き上げてもらう必要があります。その後、Addボタンのグレーアウトが解除されます。
5.SMTPユーザーを作成する
ポータルでACSを開き、左のブレードから メール > SMTPユーザー名 の順にたどり、「+ Add SMTP Username」をクリックします。
表示された画面に従って、値を入力してください。「Entra Applicaiton」は「2.SMTP接続用パスワードの作成」で作成したサービスプリンシパルを選択してください。「Username Type」は既定のまま「Custom Text」でよいです。その下のテキストボックスがSMTPユーザー名です。任意の名前を入力してください。
「Save」をクリックして、一覧に作成したユーザーが表示されれば成功です。
6.メールを送信する
VMのほうで作業します。説明するのはPostfixの例です。
はじめに、/etc/postfix/sasl_passwd を作成して、以下の通り記述して保存します。
smtp.azurecomm.net <5.で作成したSMTPユーザー名>:<1.で作成したサービスプリンシパルのシークレットの値>
# 例
# smtp.azurecomm.net example-user:XXXXXXXXXXXXXXXXXXXXXXXX-XXXXXXXXXXXXXXX
そのあと、以下のコマンドを実行して、このファイルをPostfixが参照するように設定します。
# chmod 600 /etc/postfix/sasl_passwd
# postmap hash:/etc/postfix/sasl_passwd
Postfixの設定ファイル /etc/postfix/main.cf で以下の通り追記します。
relayhost = smtp.azurecomm.net:587
smtp_use_tls = yes
smtp_sasl_auth_enable = yes
smtp_tls_security_level = encrypt
header_size_limit = 4096000
smtp_sasl_security_options = noanonymous
smtp_sasl_tls_security_options = noanonymous
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
設定できたらPostfixを再起動してください。
では、メールを送信してみます。(簡易的にtelnetで送信してみます)
以下のようにコマンドを実行します
$ telnet localhost 25 # TELNETで接続を開始する
220 xxx ESMTP Postfix # 220が返ってくればOK
MAIL FROM: <送信元メールアドレス(ACSの登録したもの)>
250 2.1.0 Ok # 250が返ってくればOK
RCPT TO: <宛先メールアドレス>
250 2.1.0 Ok # 250が返ってくればOK
DATA
from: <送信元メールアドレス(ACSに登録したもの)>
subject: <メールのタイトル>
<本文>
. # 最後に[.](ドット)を入力してEnter
250 2.0.0 Ok: queued as C7E91C00207 # 250が返ってくればOK
QUIT
221 2.0.0 Bye
Connection closed by foreign host.
これでメールが送信できたはずです。
Azure VMからメール送信する その2 に続きます。















