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については以下を参考にしてください
すること
シンプルに、MicrosoftのAzureのFunctions Appからメールを送ります。
簡単なフローは以下。
今回はテストを利用してSendGridからEmailを送ってみます
Functions Appのプログラム
本体のプログラム(C#)は以下。いろいろ参考にしながら書きました。
プログラム自体は以下のGistにおいておきましたので必要に応じて参照してください。
run.csx
#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を利用することができます。
今回利用したテストデータの中身は以下です。
{
"payload_raw": "VGhpcyBpcyBiYXNlNjQgZW5jb2RlZCBkYXRhIQ=="
}
base64で届くことが多いと思うのでbase64で変換しています。中身は「This is base64 encoded data!」です。
本来渡されるデータはサービス提供元が形式などを公開しているので、それに合わせて上手くパースして上げる必要があると思います。
メール到達確認
指定したメールアドレスで受信を確認してみましょう。
これで簡単にメールを送れるようになりました。簡単な通知確認などに使うと便利かも(IoT用途とか)。