Azure Functions AppとSendGridで簡単にメールを送る方法

How to send "email" via Azure Functions App using SendGrid?

AzureのFunctions Appでメールのアラート通知を作成する方法について紹介します。

実際に試したのは結構前なのですが、案外情報が少ないのでせっかくなのでまとめておきます。

# 事前準備

以下の準備が整っているものとします。

**1. Azureに登録しており、Azure Functions Appの使い方がわかる**

**2. 雰囲気でC#がわかる**

**3. SendGrid API keyを作成済み**

API Keyについては以下を参考にしてください

https://sendgrid.com/docs/ui/account-and-settings/api-keys/#creating-an-api-key

# すること

シンプルに、MicrosoftのAzureのFunctions Appからメールを送ります。

簡単なフローは以下。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211407/8101be33-f0ff-13c7-8deb-8ccc2f028113.png)

今回はテストを利用してSendGridからEmailを送ってみます

# Functions Appのプログラム

本体のプログラム（C#）は以下。いろいろ参考にしながら書きました。

プログラム自体は以下のGistにおいておきましたので必要に応じて参照してください。

https://gist.github.com/himitu23/7c070ee316e7127e59d906645cce5251

### run.csx
```csharp
#r "Newtonsoft.Json"
#r "System.Configuration"
#r "System.Data"
#r "SendGrid"

//email
using Microsoft.Extensions.Logging;
using SendGrid;
using SendGrid.Helpers.Mail;

//encoding
using System.Text;

using System.Net;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;
using Newtonsoft.Json;

public static async Task<IActionResult> Run(HttpRequest req, ILogger log)
{
    log.LogInformation("C# HTTP trigger function processed a request.");

    //receive paramters (sample), custom yourself
    //string dev_id = req.Query["dev_id"];//Recive JSON Data's Tag
    string payload_raw = req.Query["payload_raw"];//Recive JSON Data's Tag

    string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
    dynamic data = JsonConvert.DeserializeObject(requestBody);

    //parse query
    payload_raw = payload_raw ?? data?.payload_raw;

    //converted from paylad as base64
    byte[] payload_byte_data = Convert.FromBase64String(payload_raw);
    string payload_decoded_data = Encoding.UTF8.GetString(payload_byte_data);

    string Msg_mail = "This is test notification of sample send grid";
    Msg_mail += "<br>" +  payload_decoded_data;

    //you can check the data before sending e-mail here as a Log output
    log.LogError(Msg_mail);

    /** ----- create and send Email ----- **/
    
    //add below
    var client = new SendGridClient("Custom SendGrid key App Setting Name");
    var msg = new SendGridMessage()
    {
        From = new EmailAddress("no-reply@example.com", "Simple SendGrid HttpTrigger"),
        Subject = "Simple SendGrid HttpTrigger (Alert Test)",
        PlainTextContent = " This is Simple SendGrid Sender with HttpTrigger",
        HtmlContent = Msg_mail + "<br><br><br> This is test notification. <br> Send from Microsoft Azure Function App via SendGrid. <br> Tokina(@_tokina23)"
    };

    var recepients = new List<EmailAddress>
    {
        new EmailAddress("Your Mail Address", "Your Name")
    };

    msg.AddTos(recepients);
    msg.SetFooterSetting(true, " [Simple SendGrid HttpTrigger Test]", "");

    var response = await client.SendEmailAsync(msg);//Send Msg Here!

    /** ----- ====================== ----- **/
    
    //response
    return payload_raw != null
        ? (ActionResult)new OkObjectResult($"Received from, {Msg_mail}")
        : new BadRequestObjectResult("Please pass a name on the query string or in the request body");

}
```

以下簡単に説明します

- Functions Appキック時に渡されるデータ

```
string payload_raw = req.Query["payload_raw"];//Recive JSON Data's Tag
```
渡されるデータのJSONタグを受け取ります。今回はテストで"payload_raw"というタグでBase64でエンコードされたデータが受け取られる想定をしています

- SendGrid Key

```
var client = new SendGridClient("Custom SendGrid key App Setting Name");
```

ここにSendGridのキーを入れます

- メール内容など

```
    var msg = new SendGridMessage()
    {
        From = new EmailAddress("no-reply@example.com", "Simple SendGrid HttpTrigger"),
        Subject = "Simple SendGrid HttpTrigger (Alert Test)",
        PlainTextContent = " This is Simple SendGrid Sender with HttpTrigger",
        HtmlContent = Msg_mail + "<br><br><br> This is test notification. <br> Send from Microsoft Azure Function App via SendGrid. <br> Tokina(@_tokina23)"
    };
```

メールの送信元や件名、本文などを指定します。また、HTML形式での記入も可能です。

- 送信先メールアドレス

```
    var recepients = new List<EmailAddress>
    {
        new EmailAddress("Your Mail Address", "Your Name")
    };
```

リスト型で定義しているので、複数の送信先のメールアドレスを指定することができます。

- メールのフッター

```
msg.SetFooterSetting(true, " [Simple SendGrid HttpTrigger Test]", "");
```

以上をうまい感じにカスタマイズしましょう。

# Funcstions Appのテスト

では実際にテストしてみましょう。

テスト部分では、実際にこのFunctions Appがキックされたときに受け取るJSONを利用することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211407/606d2953-8917-929a-45fc-998b0a683d50.png)

今回利用したテストデータの中身は以下です。

```
{
  "payload_raw": "VGhpcyBpcyBiYXNlNjQgZW5jb2RlZCBkYXRhIQ=="
}
```

base64で届くことが多いと思うのでbase64で変換しています。中身は「This is base64 encoded data!」です。

本来渡されるデータはサービス提供元が形式などを公開しているので、それに合わせて上手くパースして上げる必要があると思います。

# メール到達確認

指定したメールアドレスで受信を確認してみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211407/9926f434-19fb-b5c4-2d7e-ea85cfd225aa.png)

これで簡単にメールを送れるようになりました。簡単な通知確認などに使うと便利かも（IoT用途とか）。