Azure Communication Service でメールを送信する

Azure Communication Service でメールを送信するコードを紹介します。

概要

Microsoft AzureのAzure Communication Service でメールを送信するための手順とコードを紹介します。

Azure Communication Service でのメール送信

メール送信ではSMTPを利用するのが一般的ですが、セキュリティやスパム判定の問題などを考慮した場合、 将来的にはSMTPを利用しない方式に移行したいです。
SMTPを利用しない方式で、かつ(Microsoft以外の)サードパーティのサービスを利用しない方式としてAzure Communication Serviceを利用する方法があります。
今回、現状ではベータ版ですが、Azure Communication Serviceを利用してメール送信する方法を実装します。

事前準備: メール通信サービスを作成

Azureのメール通信サービスを作成します。手順はこちらの記事を参照してください。

事前準備: Azure Communication Serviceのリソース作成、メール通信サービスの追加

Azure Communication Serviceのリソースを作成します。作成後、メール通信サービスの追加をします。 手順はこちらの記事を参照してください。

プログラム

Windows Formアプリケーションでメールを送信するプログラムを作成します。

事前準備:パッケージのインストール

Azure.Communication.Common と Azure.Communication.Email パッケージをインストールします。
NuGetパッケージマネージャーコンソールを利用する場合の手順はこちら、 GUIでインストールする場合はこちらの記事を参照してください。

UI

下図のフォームを作成します。Buttonコントロールを1つ配置します。

コード

using System.Net.Mail;
using Azure.Communication.Email;
using Azure.Communication.Email.Models;

namespace SimpleSendMailDesktopApp
{
  public partial class FormMain : Form
  {
    public FormMain()
    {
      InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
 
    }
    private void Button1_click(object sender, EventArgs e)
    {
      var connectionString = @"(接続文字列)";
      EmailClient emailClient = new EmailClient(connectionString);

      EmailContent emailContent = new EmailContent("テストメールのタイトル");
      emailContent.PlainText = "テストメールの本文";
      List<EmailAddress> emailAddresses = new List<EmailAddress> {
        new EmailAddress("xxxxxx@ipentec.com(送信先メールアドレス)") { DisplayName = "(送信者名)" }
      };
      EmailRecipients emailRecipients = new EmailRecipients(emailAddresses);
      EmailMessage emailMessage = new EmailMessage("[送信者メールアドレス]", emailContent, emailRecipients);
      SendEmailResult emailResult = emailClient.Send(emailMessage, CancellationToken.None);
    }
  }
}

解説

接続文字列から、Azure.Communication.Email.EmailClient オブジェクトを作成します。
  var connectionString = @"(接続文字列)";
  EmailClient emailClient = new EmailClient(connectionString);

接続文字列はAzure PortalのAzure Communication Serviceの[キー]の画面で取得できます。(詳細はこちらの記事を参照)


送信するメールのコンテンツオブジェクトとなる、EmailContentオブジェクトを作成します。コンストラクタの第一引数に 送信するメールのサブジェクト文字列を与えます。
  EmailContent emailContent = new EmailContent("テストメールのタイトル");

EmailContentオブジェクトのPlainTextプロパティにメールの本文を設定します。
  emailContent.PlainText = "テストメールの本文";

メールの送信先を設定します。List<EmailAddress>オブジェクトを作成し、EmailRecipients オブジェクトを作成します。
送信するメールのオブジェクトとなるEmailMessage オブジェクトを作成します。EmailMessage オブジェクトのコンストラクタの第一引数に送信者のメールアドレス、 第二引数にEmailContentオブジェクト、第三引数に送信先のEmailRecipientsオブジェクトを与えます。
  List<EmailAddress> emailAddresses = new List<EmailAddress> {
    new EmailAddress("xxxxxx@ipentec.com(送信先メールアドレス)") { DisplayName = "(送信者名)" }
  };
  EmailRecipients emailRecipients = new EmailRecipients(emailAddresses);

  EmailMessage emailMessage = new EmailMessage("[送信者メールアドレス]", emailContent, emailRecipients);

送信者のメールアドレスは任意のアドレスではなく、メール通信サービスのドメイン設定の[送信者のドメイン]のメールアドレスを利用します。


EmailClientオブジェクトのSendメソッドでメールを送信します。送信するメールのEmailMessage オブジェクトを第一引数に与えます。
  SendEmailResult emailResult = emailClient.Send(emailMessage, CancellationToken.None);

実行結果

プロジェクトを実行します。下図のウィンドウが表示されます。


[button1]をクリックします。正常に実行できると、例外やエラーが発生せず何も表示されない動作になります。


送信先のメールボックスを確認します。メールが届いていることが確認できます。


キー(接続文字列)が間違っている場合

接続文字列のキーが間違っている場合はAzure.RequestFailedException例外が発生し、次のエラーメッセージが表示されます。
エラーメッセージ
Azure.RequestFailedException
  HResult=0x80131500
  Message=Denied by the resource provider.
Status: 401 (Unauthorized)
ErrorCode: Denied

Content:
{"error":{"code":"Denied","message":"Denied by the resource provider."}}

Headers:
Transfer-Encoding: chunked
X-Cache: REDACTED
X-Azure-Ref: REDACTED
Date: Ddd, 00 Mon 0000 00:00:00 GMT
Content-Type: application/json

"Denied by the resource provider."のエラーメッセージが表示されます。

送信者のメールアドレスが[送信者のドメイン]のメールアドレスと異なる場合

送信者のメールアドレスが[送信者のドメイン]のメールアドレスと異なる場合は実行時に次のAzure.RequestFailedException例外が発生します。
エラーメッセージ
Azure.RequestFailedException
  HResult=0x80131500
  Message=Email sender's username is invalid. Please use a username from the list of valid usernames configured by your admin.
Status: 400 (Bad Request)
ErrorCode: InvalidSenderUserName
Content:
{"error":{"code":"InvalidSenderUserName","message":"Email sender's username is invalid. Please use a username from the list of valid usernames configured by your admin.","target":null,"details":null,"innererror":null}}

Headers:
mise-correlation-id: REDACTED
Repeatability-Result: REDACTED
x-ms-request-id: 8f25a3b7-9bed-4362-b880-d661b48979cf
x-ms-error-code: REDACTED
api-supported-versions: REDACTED
X-Cache: REDACTED
X-Azure-Ref: REDACTED
Date: Ddd, 00 Mon 0000 00:00:00 GMT
Content-Length: 218
Content-Type: application/json; charset=utf-8

"Email sender's username is invalid." のエラーメッセージが表示されます。送信者のメールアドレスが正しくないことがわかります。


補足:メール送信方式のメリット、デメリット

メール送信の方法

Microsoft AzureのAzure Communication Service でメールを送信する方法を紹介しましたが、 メールの送信方法は、ほかに次の方式があります。

  • プロバイダやメールサービスのSMTPサーバーを利用する
  • SendGridを利用する (SMTP or API)
  • Microsoft Graphを利用する
  • Azure Communication Serviceを利用する

プロバイダやメールサービスのSMTPサーバーを利用する方法

プロバイダやメールサービス(Microsoft Exchange Online, Microsoft Outlook Web, Google Gmail)で利用可能なSMTPサーバーを利用する方法です。
メール送信ではオーソドックスな方式ですが、元の仕様がセキュリティ面が弱いため追加の対応が必要であったり、 送信時のチェックが厳しいといった制約が多々あります。

メリット

  • 古くからの方式のため、実装が多く、実装がこなれている
  • 動作方式がシンプル
  • メールのFromを送信者のメールアドレスに設定できる
  • メール送信数に応じた費用が発生せず

デメリット

  • SMTPの標準ポート25がインターネット接続プロバイダによってブロックされている場合がある (OP25B)
  • サーバーによってはスパムチェックがあり、送信元のIPを許可する必要がある(spamhausなど)
  • サーバーによってはスパムチェックがあり、DNSサーバーへの送信元のIPを登録する必要がある
  • SMTP Auth, POP before SMTP など認証やセキュリティ面での追加の実装が必要な場合がある
  • SSLによる通信が必要なサーバーがあり、ライブラリによっては対応していない場合がある
  • 送信アカウントのメールボックスに有効なライセンスが必要 (Micrsoft Exchange Online)
  • 大量のメールを送信するとSMTPサーバ側でスパム判定される可能性あり

SendGridを利用する方法

メールを送信するサービスである SendGrid を利用する方法です。 メールを送信するサービスのため、大量のメールを送信することができます。

メリット

  • 大量のメールを送信可能
  • SMTP, APIどちらの方式でも利用可能

デメリット

  • 仕様が変わることがある
  • 運営が安定していない? (買収等)
  • メール送信数が多い場合は費用が発生
  • メールのFromはプロビジョニングしたドメインのメールアドレスのみ設定可能

Microsoft Graphを利用する方法

Microsoft Graphを利用してメールを送信する方法もあります。

メリット

  • 新しい仕組みのため、セキュリティが強固
  • SMTPを利用しない、APIを利用した送信

デメリット

  • 実装例が少ない
  • 実装が複雑
  • Azure Active Directoryへのアプリケーション登録が必要
  • Exchange Onlineのライセンスが必要(?)

Azure Communication Serviceを利用する方法

Azure Communication Serviceでメールを送信する方法です。

メリット

  • 新しい仕組みのため、セキュリティが強固
  • SMTPを利用しない、APIを利用した送信
  • コードが比較的シンプル

デメリット

  • 実装例が少ない
  • まだベータ版
  • メールのFromはプロビジョニングしたドメインのメールアドレスのみ設定可能
  • 1通送信するごとに費用が発生する
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
掲載日: 2022-08-27
iPentec all rights reserverd.