[Azure Communication Services]Azureでメール送信する方法

# はじめに
今まで`Azure`でメール送信する場合は、`SendGrid`などのサードパーティサービスを利用するのが一般的でした。
※Azure公式でもそのように案内していた。

しかし気付けば`Azure`から公式にメールを送ることのできるファーストパーティサービス「`Azure Communication Services Email`」が登場していたので、今回使ってみる！

:::note warn
注意
`Azure`でVMを立てて`SMTPサーバー`を構築してメールを送る手法は`非推奨・サポート外`です。
`Azure VM`では、グローバルIPを使いまわしている形となっているので、悪意あるユーザーが`Azure VM`からスパムメールを送った場合、その時のグローバルIPがブラックリスト登録されてしまい、後から別の`Azure VM`にそのグローバルIPが割り当てられてしまう可能性があるようです。
:::

# 必要なリソース
メール送信をするためには、以下の3つのリソースが必要です。
※わかりにくい・・・
- 通信サービス
- メール通信サービス
- メール通信サービス ドメイン

# 利用料金
利用した分の`従量課金`となります。

https://learn.microsoft.com/ja-jp/azure/communication-services/concepts/email-pricing#email-price

- 送信メール数
    - ＄0.00025 / 1通
- メールサイズ
    - ＄0.00012 / MB

たとえば1ヶ月あたり、1MBのメールを1000通送る場合、以下のようになります。
※1ドル=147.43円換算
- 送信メール数
    - 1000通 × ＄0.00025 = ＄0.25（￥36.86）
- メールサイズ
    - 1MB × 1000通 × $0.00012 = ＄0.12（￥17.69）
- 合計
    - ＄0.37（￥54.55）

思ったより安いですね！

# 制限事項
メール送信の制限が少し厳しめです。
- レート制限（1サブスクリプションあたり）
    - 1分あたり ： `30通`
    - 1時間あたり ： `100通`
- サイズ制限
    - 受信者の数 ： `50人`
    - 合計サイズ (添付ファイルを含む) ： `10MB`

https://learn.microsoft.com/ja-jp/azure/communication-services/concepts/service-limits#email

:::note info
制限の引き上げについて
あとから制限を引き上げることも可能だそうです。
https://learn.microsoft.com/ja-jp/azure/communication-services/concepts/service-limits#action-to-take-3
> メールを送信して送信者の評判を確立したら、送信ボリュームの制限の引き上げを要求できます。
レート制限を 超える量のメッセージを送信する必要がある場合は、必要なメール送信制限を引き上げるサポート リクエスト を送信します。
メール クォータの引き上げ要求は自動的には承認されません。
レビュー チームは、全体的な送信者の評判を考慮します。
これには、メール配信の失敗率、doメインの評判、承認状態を決定するときのスパムと不正使用のレポートなどの要因が含まれます。
:::

# 通信サービスの作成
まずは`通信サービス`を作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352434/2a4ae0cf-5b05-e139-dba5-7cf8c2303f27.png)

:::note warn
注意
ここの「`データの場所`」は、作成するリソース全てで合わせる必要あり
:::

# メール通信サービスの作成
次に`メール通信サービス`を作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352434/993d35b8-2990-6e6b-61ee-7891e86d0f57.png)

:::note warn
注意
ここの「`Data location`」は、先ほど作成した`通信サービス`と同じリージョンに設定する必要あり
:::

# メール通信サービス ドメインの作成
先ほど作成した`メール通信サービス`を開き、「`ドメインをプロビジョニングする`」を選択し、「`Azure ドメイン`」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352434/aeabb5c2-1d67-62ea-2a28-203475280ca4.png)
`ドメイン`の作成には少し時間がかかるので、終わるまでしばらく待ちましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352434/4f1bad34-8759-fbd1-138b-ea20e5d9a410.png)
完了するとこのような画面になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352434/158d8c3d-57e2-ef2d-5f31-3cdfcafae831.png)

# 作成したドメインを接続する
先ほど作成した`ドメイン`を`メール通信サービス`に接続します。
`メール通信サービス`を開き、「`ドメイン`」を選択し、「`ドメインを接続する`」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352434/542612d6-f03c-cfb8-edce-fd1de6d78b2c.png)
`メールドメインの接続`画面が表示されるので、先ほど作成した`メール通信サービス ドメイン`の情報を設定して「`接続`」ボタンを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352434/076323f4-b73d-8b70-5dd8-db8d090a1ff2.png)
完了メッセージが表示されればOK。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352434/14694fa2-8cfa-6887-7505-538fe4b473f6.png)
これで一通りの設定が完了しました。

# 実際にプログラムから使ってみる
今回はC#でメール送信するプログラムを書いてみます。
※別に言語は何でも良いので、ここは読み飛ばしてもらってもOK

```csharp:Program.cs
using Azure;
using Azure.Communication.Email;

// 接続文字列
string connectionString = "endpoint=<通信サービスのエンドポイント>;accesskey=<通信サービスのアクセスキー>";
var emailClient = new EmailClient(connectionString);

var senderAddress = "<送信元メールアドレス(ドメインの接続時に表示される「メール送信元」)>";
var recipientAddress = new EmailRecipients(new EmailAddress[] { new EmailAddress("<送信先メールアドレス>") });
var content = new EmailContent(subject: "テスト メール")
{
    PlainText = "メールで Hello World。"
};
var emailMessage = new EmailMessage(senderAddress, recipientAddress, content);
var emailSendOperation = await emailClient.SendAsync(WaitUntil.Completed, emailMessage);

Console.WriteLine($"Email send operation ID: {emailSendOperation.Id}");
```

:::note warn
注意
Azureでサンプルコードが表示されるが、かなり間違っているし、そもそも構文エラーもあるので注意してください(笑)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352434/b1b598e3-eaf5-2504-d193-65dd63bef3ff.png)

:::

いざ実行！ポチッ！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352434/78657f95-e529-931f-e598-3dd8ac0ec81f.png)
ちゃんと届いた！

# 余談
`Gmail`だと問題なくメールが届いたが、会社で利用している`MS365 Outlook`に送信した場合、検疫に引っかかってメールが届かなかった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352434/0714f814-b5e3-07b4-c9e9-d0e3d3aa3120.png)

:::note warn
注意
検疫の引っかかり方も、`Azureドメイン`を使用した場合と`カスタムドメイン`を使用した場合で少し挙動が違ったので注意が必要。
- Azureドメインを使用した場合
    - 送信元がデフォルトの`DoNotReply@作成したドメイン`の場合、`High Confidence Phish`に分類
        - 管理者でないと検疫の一覧に出てこないので、個人では検疫からの解放は不可
    - `user1@作成したドイメイン`などDoNotReply以外の場合、`迷惑メール`に分類
        - 個人で検疫からの解放が可能
- カスタムドメイン(SPF, DKIM設定済み)を使用した場合
    - 送信元がデフォルトの`DoNotReply@作成したドメイン`の場合、`フィッシング詐欺`に分類
        - 個人で検疫からの解放が可能
    - `user1@作成したドイメイン`などDoNotReply以外の場合、 ~~`迷惑メール`に分類~~ 問題なく受信できた
        - ~~個人で検疫からの解放が可能~~
:::

# まとめ
価格も安価で、ファーストパーティのサービスとして手軽に利用できるが、送信相手側で検疫に引っかかる可能性もあるので、利用シーンには注意が必要。