はまったりひらめいたり…とか…

Angularや.NETやAzureやその他色々。

Azure Communication Services Emailを触ってみた話

はじめに

2022年5月25日時点の記事となります。

この時点でAzure Communication Services EmailはPreviewです。

記事中にでてくる画面キャプチャやコードは参照時期によっては変更されている可能性がありますのでご留意ください。

Azure Communication Services Email

Azure上でメール送信する仕組みは非推奨ということもあり

Azureでメールを取り扱いたいといった場合、Logic Appsを経由してOutlookで送るとか、外部サービスのSend Grid等を使用するかしかありませんでした。

Azure 上にメールサーバー/SMTP サーバーを構築する場合の注意事項 | Microsoft Docs

しかし、今回のBuildでAzure Communication Services Emailが発表されたことにより

外部サービスを使うことなく利用できることになりそうなので良きって感じですね!

早速見ていきたいと思います。

触ってみる

Communication Servicesを作成する

Communication Servicesを介してEmailが送信されるのでまずはCommunication Servicesの作成からです。

Data Locationは一応United Statesを選択。

Communication Services Emailを作成する

作成時の設定内容は特に難しいものはないので割愛

Domainの設定を行う

まずは雑にAzureのドメインを利用して作ってみます。

といってもClickしたら作られるだけなので特に設定作業ははさみません。簡単。

Communication ServicesとCommunication Services Emailを接続する

Communication Services側からEmailのDomainで先程作成したドメインと接続を行います。

接続もリソースを選択していくだけなので簡単ですね。

送信コードを組んでみる

今回はC#で組んでみようと思います。

NuGetのPrereleaseでAzure.Communication.Emailが提供されているのでそれを利用します。

接続文字列はCommunication Services側のKeysから取得します。

あとはこんな感じで送信。ほぼ公式のサンプル通りですがちょいちょい付け足しています、

using Azure.Communication.Email;
using Azure.Communication.Email.Models;

Console.WriteLine("Hello, World!");

var connectionString = @"Communication Servicesから取得した接続文字列";

var emailClient = new EmailClient(connectionString);

// EmailContentの文字列引数はメールタイトル
EmailContent emailContent = new EmailContent("Welcome to Azure Communication Services Email APIs.");

// 内容(Htmlが設定されたらHTML側が優先される?)
emailContent.PlainText = "This email meessage is sent from Azure Communication Services Email using .NET SDK.";
emailContent.Html = "<h1>HTMLのあれやこれや</h1>";

// 送信するアドレスの設定
List<EmailAddress> emailAddresses = new List<EmailAddress> { new EmailAddress("<送信先メールアドレス>") };
// EmailRecipientsのインスタンスは(To, Cc, Bcc)引数のようだ
EmailRecipients emailRecipients = new EmailRecipients(emailAddresses);

EmailMessage emailMessage = new EmailMessage("<送信元メールアドレス>", emailContent, emailRecipients);
SendEmailResult emailResult = emailClient.Send(emailMessage, CancellationToken.None);

// 送信結果の確認
var status = emailClient.GetSendStatus(emailResult.MessageId);

Console.WriteLine("おわり");

こんな感じで届きました。簡単ですね!

送信までは少し時間が掛かるようなので送信結果を抑えてから別の処理を行いたい場合は

emailClient.GetSendStatus(emailResult.MessageId)outForDeliveryになるまで待ちましょう。

ステータスはこんな感じみたいです。

添付ファイルはBase64変換したファイルをEmailAttachmentに設定してEmailMessageAttachmenstsのListに追加すれば良さそうです。

// 添付ファイル
string base64St = Convert.ToBase64String(File.ReadAllBytes(@"C:\temp\sample.txt"));
EmailAttachment attachment =  new EmailAttachment("さんぷる.txt", EmailAttachmentType.Txt, base64St);
emailMessage.Attachments.Add(attachment);

上記のコードで👇のように届きます。

MS Docsより詳細なサンプルも例のごとくGitHubに転がっているので何はともあれ見てみるのがいいと思います

気になること

まだベストプラクティスは出ていないですが、他のAzure SDKのClient同様RESTベースの通信していそうです。

ライブラリの実装:azure-sdk-for-net/EmailRestClient.cs at 7a5012587cee93bf34d23cc8caddb0dd915fba1c · Azure/azure-sdk-for-net · GitHub

SDKのプラクティス:C#.NET Guidelines: Implementation | Azure SDKs

なのでWeb Appsなどで構成する場合はSingleton構成にするのがベターなのかなーと思ってたりはしています。

送信元の情報変更

メールアドレスなど送信者の情報のメタデータを変更できます。

作成したメールドメインの設定画面から変更できるようです。

MailFromはDoNoyReplyから好きなものに変更できます

ユーザーがメールを開いたかなどのトラッキングも行えるようです。

設定を行ったあとメール送信すると下図のようになります。

名前やアドレスはもちろん、トラッキング用と思しきタグが生えているのも確認できます。

データの確認なんかはまだログだとできないんですかね。

他のサービスよろしくACS???みたいな感じで生えているかなーと少し期待していたのですが。ここもしばらく待っておけば出てくるかもしれません。

(EventLog追っかける元気はなかった…😫

価格

Public Preview段階ですが価格情報ももう出ています。

Email pricing - An Azure Communication Services concept document | Microsoft Docs

電子メール送信と転送されたデータで価格が決定するようです。

価格の例が出ているのでわかりやすいですね。

まとめ

Azure Communication Service Emailでメールの送信を行うことが確認できました。

色々とやりにくかった、Azureでのメール送信が楽になるかもしれませんね。

SendGridなどの外部サービスとくらべて何ができて何ができないかは気になるところではありますが、Azureの中で一つの選択肢ができたのはとてもわくわくすることだと思います。

Emailを使用するような機能を実装したい場合は積極的に検証していきたいですね(まだPreviewですが…

余談ですが、会社でSend Gridを使っているのですが、それと同じようなノリでSDKを使うことができました。

ロジックをうまく分離できていたらメール送信層だけすげ替えればあっさりと移行できるかもしれないのも良いなと思いました。