こんにちわ。今日はAzure Communication Services(以下ACS)を利用したメール送信を行ってみたいと思います。また、ACSにカスタムドメインとして当ドメインを設定し、当ドメインからのメールとして迷惑メールとならずにクラウドメールを利用する方法をエックスサーバーへの設定方法として実施していきます。
Azure Communication Servicesとは?
「Azure Communication Servicesとは、マイクロソフトのクラウドプラットフォームであるAzureが提供する統合通信サービスです。このサービスを利用すると、音声やビデオでの通話、チャット、SMS、メールなどのリアルタイム通信機能を簡単にアプリケーションに組み込むことができます。」とCopilotさんが言っています。
なぜAzure Communication Services?
Azureに限らないかもしれませんが、クラウドサービスで送信メールサーバーを立てることは推奨されておらず、クラウドからメールを送信したい場合は基本的にはSendGridなどのリレー方式のメール送信サービスを利用するのが定石かと思います。
SendGridは到達率が高く、いろいろといいサービスなんですが、如何せん価格が高い・・・。Proの最安プランで月額13,000円超で10万通まで送信可能。ただ、月間送信数が少ないと大分無駄になってしまっています。月間送信通数が少ない方はACSメールサービスにリプレイスすればごっそり支払い料金を節約できるという感じ。
そして、昨今の迷惑メール対策として、SPFやDKIM認証がSendGridでも必須化されていくことに伴い、いっそのことカスタムドメインではSPF・DKIMマストなACSに乗り換え検討してみようかというのがことの発端です。
さらに今まで国内でのデータ保持が担保されていなかったのが、ロケーションとして日本も追加されたのが大きいかな。
ってことでACSを利用したメール送信を検証していきましょう。
Azure Communication Servicesを利用したメール送信
ACSリソースの作成
まずは、Azure Communication Servicesリソースを追加していきます。メール送信を行うためには「Communication Services」というリソースと、「Email Communication Services」の二つのリソースを追加する必要があります。
Communication Services Emailリソースの作成
まずはCommunication Services Emailリソースを追加してみます。
Email Communication Servicesを検索し、「作成」をクリックします。
サブスク、リソースグループを選択し、リソース名を入力します。リージョンはグローバルなので選択はできませんが、データを保持するロケーションを選択します。以前は日本国内は選択できませんでしたが、しっかり「Japan」が選択できるようになりました。やったね!
「確認と作成」をクリックします。
「作成」をクリックします。
リソースができあがりました。が、このままでは空っぽのリソースですので、メール送信用のドメインを準備する必要があります。[設定]にある「ドメインをプロビジョニングする」を選択します。
以下の画面で、「ドメインの追加」から「Azureドメイン」を選択します。お手軽にメールを実装するにはAzure側で用意してくれるAzureドメインを選択でよいのですが、後述しますが、ちょっといただけない理由があります。ひとまずAzureドメインで進めていきます。
あっという間にメール送信用のドメインの準備が完了しました。Emailリソースはひとまずここまで。
Communication Servicesリソースの作成
次にCommunication Servicesリソースをデプロイしていきます。リソースを検索し、以下の画面で「作成」をクリック。
こちらでも同様にサブスク、リソースグループを選択し、リソース名を入力します。注意点は「データの場所」ですが、Emailサービスで選択したロケーションと同一のものを選択しましょう。今回は「Japan」が選択できるようになっていますのでもちろん「Japan」で。「出逢いは億千万」ですので。「タグ」はお好みで。「レビューと作成」をクリックします。
確認画面で「作成」をクリックします。
Communication Servicesリソースができました。
次に作成したACSリソースにEmailリソースで追加したドメインを紐づけてあげる必要があります。[メール]の「ドメイン」をクリックします。
以下の画面になるので、「ドメインを接続する」をクリックします。
「メールドメインの接続」が表示されるので、前手順で追加したAzureドメインを選択し、「接続」をクリックします。
ドメインが「接続済み」になればACSとEmailリソースを利用してメール送信を行うことができる状態です。
ACSでのメール送信をC#で実装する
今回はVisual StudioでC#コンソールアプリとしてメール送信を試してみたいと思います。基本はMSのLearnサンプル通りです。
まずは準備として、送信元メールアドレスの確認です。AzureポータルからEmailサービスリソースに遷移し、プロビジョニングされたドメイン名をクリックします。そして、「MailFrom address」を選択すると以下の画面が表示されるので、対象メールアドレスの横三点リーダーから「Copy MailFrom address」で送信元メールアドレスを取得しておきます。追加したり修正したければ「@の前」と「Display Name」に関しては編集できます。
次もAzureポータルからACSリソースにアクセスし、[設定]-「キー」を選択します。接続文字列をコピーしておきます。この後利用します。
したらば、VisualStudioに移ります。まずはNugetパッケージマネージャーで「Azure.Communication.Email」パッケージをインストールします。
実装するソースコードサンプルは以下の感じです。{Azure Communication Servicesの接続文字列}にはACSリソースから取得した接続文字列、{送信元メールアドレス}にはEmailリソースで取得したMailFrom addressを入力します。
ちなみに毎度当たり前のことですが、接続文字列はコード内にべた書きせず、セキュアな場所に保持して参照するようにしておくのが定石です。今回はメール送信ができるか確認するだけですのでべた書きしてますが、よい子のみんなはマネしちゃだめだぞ~www
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
using Azure; using Azure.Communication.Email; string connectionString = {Azure Communication Servicesの接続文字列}; EmailClient emailClient = new EmailClient(connectionString); // タイトル var subject = "ACSメール送信テスト"; // 本文 var htmlContent = "Azure Communication Serviceからメール送信をしてみました。<BR>届きましたかね?"; // 送信元メールアドレス var sender = {送信元メールアドレス}; // 送信先メールアドレス var recipient = "xxxxx@example.com"; try { Console.WriteLine("メール送信中..."); EmailSendOperation emailSendOperation = await emailClient.SendAsync(Azure.WaitUntil.Completed, sender, recipient, subject, htmlContent); EmailSendResult statusMonitor = emailSendOperation.Value; Console.WriteLine($"メール送信しました。ステータス = {emailSendOperation.Value.Status}"); string operationId = emailSendOperation.Id; Console.WriteLine($"オペレーションID = {operationId}"); } catch (RequestFailedException ex) { Console.WriteLine($"メール送信失敗: {ex.ErrorCode}, メッセージ: {ex.Message}"); } |
あとは実行するだけです。コードを実行すれば、指定のアドレスにメールが送信されているのが確認できると思います。あ~ら簡単w
しかしながら以下の画像で表示しているように、お手軽Azureドメインを利用しているメールドメインですので、表示されているドメインの長さときたら・・・。これではユーザーに怪しまれてしまいそうですよね。
ってことでメールアドレスにカスタムドメインを当てていきたいと思います。
Azure Communication Services Emailにカスタムドメインを設定する
ってことで、Azure無料ドメインは、迷惑メール対策としてのSPF・DKIM認証設定などはしっかりされていますが、送信元メールアドレスがいただけないので、カスタムドメインを当てていこうと思います。
今回、所有するドメインがエックスサーバーのサーバーにあたっているという前提で進めていきます。カスタムドメインを当てる場合、レンタルサーバーや自社サーバー側のDNSレコードを編集する必要がありますが、海外有名どこのレジストラでの設定方法はいくつかMS Learnに載っていましたが・・・。
エックスサーバーに関してはもちろん載っていませんでしたので、ハマりポイントなんかも記述していきます。
ACS Emailにカスタムドメインの追加&ドメイン所有権の検証
そいでは初めにAzureポータルに行き、Emailリソースを開きます。[設定]-「ドメインをプロビジョニングする」から、「ドメインの追加」-「カスタムドメイン」を今度は選択します。
以下の画面で自身の所有するドメインを入力し、「確認する」をクリックします。
「追加」をクリック。
ドメインの追加ができると画面が変化します。「ドメインの確認」をクリックします。
追加したカスタムドメインの所有権を有しているのかをチェックする必要があります。以下の画面の「TXT値」をコピーしましょう。そしたらこの画面はこの後使うのでそのまま放置で。
この後はエックスサーバー側で作業します。エックスサーバーのサーバーパネルにサインインし、対象ドメインの「DNSレコード設定」をクリックします。
以下の画面で、「DNSレコード追加」タブをクリックします。
DNSレコード編集画面になるので、種別に「TXT」、内容にAzureポータルでコピーした値を設定し、「確認画面へ進む」をクリックします。ホスト名はサブドメインなどあればよしなに。TTLの値はおそらくデフォルトで3600で一致してると思いますが違ったらAzure側に合わせましょう。
確認画面で「追加する」をクリックします。
これでDNSレコードの追加がうまくいきました。Azureポータルに戻りましょう。
先ほどの画面で、「次へ」をクリックします。
この画面で「完了」をクリックします。
ドメイン所有権の検証が始まります。「閉じる」をクリックします。
Domain statusが「検証済み」になりカスタムドメインの所有権の検証に成功しました。検証後は、先ほどエックスサーバー側に追加したTXTレコードは削除できます。次に、SPF statusの「構成」をクリックして次のステップを行っていきましょう。
SPF・DKIM認証レコードをエックスサーバーに設定
次にAzureポータル側で表示されたSPF、DKIMの値をエックスサーバー側に設定していきます。ちなみにエックスサーバーではSPFレコードがすでに登録済みのため、以下のレコードをそのまま追加してはうまくいきません。
以下の赤枠で囲んだ部分、「include:spf.protection.outlook.com」をコピーしておきます。
DKIMレコードはそのままコピーして使います。
エックスサーバーのサーバーパネルからDNSレコード設定を開き、DNSレコード一覧をクリックします。すでに「v=spf1~」で始まるTXTレコードが登録済みだと思いますので、「変更」をクリックすると以下の画面に遷移します。ここの内容にAzureポータルでコピーしたSPFレコードの値を既存の内容を保持したまま追加します。
ちなみに上記に関してよくわからなかったのでCopilotに聞いてみました。
SPFレコードの「~all」と「-all」は、どちらもSPF認証が失敗した場合の処理方法を指定するものですが、その扱い方に違いがあります。
「-all」はハードフェイル(Hard Fail)を意味し、SPFレコードにリストされていないIPアドレスからのメールは完全に拒否されるべきだと示します。つまり、そのメールは配信されず、スパムとして扱われるか、削除される可能性があります。
「~all」はソフトフェイル(Soft Fail)を意味し、SPFレコードにリストされていないIPアドレスからのメールは疑わしいものとしてマークされるべきだと示しますが、それでも配信はされることが多いです。
最近では、多くのメールサービスプロバイダーは「-all」と「~all」を同じように扱い、どちらもSPF認証の「NOT PASS」を意味するとしています。しかし、実際のメール処理においては、プロバイダーによって異なる扱いをすることがあります。そのため、ドメインの評判を守りつつ、メールの配信性を確保するためには、DMARCポリシーと合わせて適切に設定することが重要です
要するに「-all」の方がより厳しめということですかね。無知ですみません。
TXTレコードを編集出来たら「変更する」をクリックします。
SPFレコードが登録できました。
今度はDKIMレコードを追加していきます。ホスト名をAzure指定の「CNAMEレコード名」、種別は「CNAME」を選択し、内容にコピーした「DKIM値」を入力します。入力後、「確認画面へ進む」をクリック。
確認画面で「追加する」でDKIMレコードの追加が完了です。
同様の手順でDKIM2レコードの追加も行いましょう。
サブドメインの場合は若干ホスト名の入力を変更する必要ありますが、その辺もLearnに記載されています。
今度はAzureポータル側に戻ります。以下の画面で「Next」をクリックします。
以下の画面で「Done」をクリックするとSPF、DKIMの検証が開始されます。
「Close」をクリックして、しばし待たれよ。
DKIMは速攻で検証OKになります。
前述の「~all」のまま進めると、以下の画面のようにエラーになってしまします。「-all」にエックスサーバー側を変更後、もう一度検証を実行しましょう。
以下のようにすべてオールグリーンになればカスタムドメインの追加は完了です。次に送信元メールアドレスを追加するので、ドメイン名をクリックしましょう。
カスタムドメインの送信元メールアドレス追加
カスタムドメインの送信元メールアドレスを追加します。「MailFrom addresses」を選択し、「Add」をクリックします。
以下の画面で、表示名と送信元アドレスを入力します。「Save」をクリックし、設定を保存しましょう。
ばっちり送信元メールアドレスが追加されました。
カスタムドメインのAzure Communication Servicesへの接続
最後の手順ですが、追加したカスタムドメインをACSに接続する必要があります。Azure Communication Servicesリソースにアクセスし、[メール]の「ドメイン」をクリックします。ACSに接続できるのは1つのメールサービスだけなので、初めに接続したAzureドメインを一度切断しましょう。
「ドメインを接続する」をクリックし、追加したカスタムドメインを入力します。その後、「接続」をクリックしましょう。
「接続済み」となれば無事ACSとカスタムドメインが関連付けられました。
カスタムドメインを設定後のメール送信
それでは、ソースコードの送信元メールアドレスを変更して、もう一度アプリを実行してみます。
以下のようにしっかりGmailにも迷惑メールとならずにメールが届いていることが確認できます。すごくいい!
さいごに
Azure Communication Servicesを利用することで、なんとも簡単にメール送信を行うことができました。カスタムドメインを使うのは若干手間がかかりますが、それでも高コスパなので使わない手はないですね。今回は触れていませんが、メトリックなどを活用してメールの到達確認もできるようです。
Azure Functionsでの実装ですが、SendGridでは出力バインドでメール送信できていたので、ACSは現時点で出力バインドがないので、そこの変換がちょっと手間かなという感じです。カスタムバインドって言う手もあるようですね。
まぁ、出力バインドでSendGrid出力バインドをQueue出力バインドにリプレースしつつ、1本QueueトリガーFunction噛ませてメール送信を集約してそこで行うように検討しようかなぁ・・・。
以上、Azure Communication Servicesを利用したメール送信でした。
最後までご覧いただきありがとうございました。
コメント