Azure Function Appから定期的にメールを送る

# 概要
気が向いた && 自分が追加したテンプレートが無事masterにマージされたので、そのテンプレートについて書きます。タイトルの通り、Azure Functionsを使って定期的にメールを送る方法です。C#オンリーです。悪しからず。

Azure Advent Calendar 2の15日目です。

# 背景
Azure Function Appには既存のテンプレートが沢山あり、自分でフルスクラッチで書かなくても、どれかテンプレートを選択すれば必要なファイルが自動的に作成されます。自分は定期的にメールを送るFunction Appを作りたかったのですが、ちょうどいいテンプレートがありませんでした。「タイマー起動するテンプレート」と「Storageにエントリが追加されたらメールを送るテンプレート」があるのに、もっと実用的な「タイマーでメール送信するテンプレート」がないのはどういうわけでしょう。ということでそのためのテンプレートを作ってプルリクしたらマージされました。

# 準備1: SendGridのアカウントを作る
SendGridを使いますので、SendGridのアカウント登録が必要です。Azureのサブスクリプションからならば一日当たり25,000通まで無料なので、個人用であれば十分無料の範囲で使えます。

ポータルから「More services」→「Send」とタイプ→「SendGrid Accounts」をクリックします。

![1.PNG](https://qiita-image-store.s3.amazonaws.com/0/32767/d3ae94b5-2c5c-379b-6a5b-167d4ccc4149.png "ポータルからSendGridへ")

「Add」をクリックして新規作成ブレードに行き、項目をすべて埋めます。Pricing tierはF1を選び、Selectをクリックします。

![2.PNG](https://qiita-image-store.s3.amazonaws.com/0/32767/932659fa-9c64-9f00-a5fd-5cd66c02f7fa.png "SendGridアカウント作成")

Contact Informationを開いて項目を埋め、最後にLegal termsを開いてPurchaseをクリックしてください。Purchaseといっても無料プランなのでお金はかかりません。あとはCreateをクリックして少し待てばSendGridのアカウントが作成されます(スクリーンショットには例として2つのアカウントが表示されてます)。

![3-2.PNG](https://qiita-image-store.s3.amazonaws.com/0/32767/f0ee5dd8-1f8c-25cc-157d-e861ff67a934.png)

# 準備2: SendGridのAPIキーを得る
今作成されたSendGridアカウントをクリックしてから「Manage」をクリックし、SendGridのダッシュボードを開きます。

![4.PNG](https://qiita-image-store.s3.amazonaws.com/0/32767/9ebaec11-7283-7204-adaa-a5e0ff1d39aa.png)

ダッシュボード左下の「Settings」をクリックして「API Keys」をクリックします。
![5.PNG](https://qiita-image-store.s3.amazonaws.com/0/32767/96c76ebf-4072-6bfc-44f5-ce3bb846fe2f.png)

右上にある青いボタン「Create API Key」を押し、"Generate API Key"をクリックします。"Add New General API Key"というウィンドウが開くので、名前とアクセス権を設定してからSaveを押せば新しいキーが作成されます。とりあえずMail Send, Alerts, Email Activity, Statsあたりのアクセス権を取得しておけばいいと思います。

![6.PNG](https://qiita-image-store.s3.amazonaws.com/0/32767/d06bbd05-6545-b96b-89a9-338723a36b11.png)

無事にキーが作成されると秘密鍵が表示されます。一度この画面を抜けると二度と表示されないので、コピーしてメモ帳などに保存しておいてください。これを後で使います。

![7.PNG](https://qiita-image-store.s3.amazonaws.com/0/32767/530507b3-6f08-9fe7-522e-7970b6d897ef.png)

これでSendGridの準備はおしまいです。ダッシュボードを閉じてOKです。

# Function Appを作る

Azureポータルのトップから「＋」マークを選び、funcとタイプすると「Function App」が表示されるのでクリックします。
![8.PNG](https://qiita-image-store.s3.amazonaws.com/0/32767/4aa8825b-01cc-190e-79c5-7230ef44809e.png)

Function Appを選択してCreateをクリックし、普段App Serviceを作るのと同様に名前を付けて作成してください。
![9.PNG](https://qiita-image-store.s3.amazonaws.com/0/32767/517f5b92-d22e-bc3d-5c1c-f0f375a89bad.png)

しばらく待つとFunction Appが作成されます。「デプロイされたよ」という通知をクリックするとFunction Appへのリンクがありますのでクリックしましょう。
![10.PNG](https://qiita-image-store.s3.amazonaws.com/0/32767/f37c3d39-fa06-4560-6084-4b657633565a.png)

# Functionを作る

前項で作ったFunction Appは、いわば各種Functionを登録するためのコンテナのようなものだと考えてください。なので、次はその中にFunctionを追加していきます。"New Function"をクリックするとテンプレート一覧が表示されます。

ここでLanguageをC#、ScenarioをSamplesまたはAllとすると、ScheduledMail-CSharpが見つかると思います(アルファベット順なので少しスクロールしないと出てこないと思います)。これを選択してください。
![11.PNG](https://qiita-image-store.s3.amazonaws.com/0/32767/63a5be3e-8406-4a9b-8295-7c3fa4f9967b.png)

テンプレートを選択すると、その下にテンプレート固有のパラメータ入力エリアが表示されます。*SendGrid API Keyは変更せずに*、それ以外のフィールド(名前、cron、To address、From address)を設定してください。
![12.PNG](https://qiita-image-store.s3.amazonaws.com/0/32767/1e337ba5-bcdd-52c8-e257-477c36161274.png)

デフォルトではUTCで23:00:00に起動するようになっていますので、まあお好みで変えてください。あとはCreateボタンを押せばFunctionが作成されます。

# APIキーを設定する

次にSendGridのAPIキーを設定しましょう。左下の"Function app settings"をクリックしてから"Configure app settings"を押してください。
![13.PNG](https://qiita-image-store.s3.amazonaws.com/0/32767/c404f192-d61e-1337-8867-21d5260c996b.png)

App Serviceの設定画面が開きますので、SendGridApiKeyという名前で、APIキーの設定を追加します。最後にSaveを押すのを忘れずに！
![14.PNG](https://qiita-image-store.s3.amazonaws.com/0/32767/e4eca6a1-9bcb-1450-1524-55f2414bebfc.png)

さっそくテストしてみましょう。Functionに戻ってDevelopを選択してください。画面中央上に大きく「Run」ボタンがあるので押してみましょう。ログに"Function completed"と表示されたら、しばらく待てばメールが送られるはずです。エラーが出た場合はSendGridApiKeyが正しく設定されているか、メールアドレスが正しいかあたりを確認してみてください。
![15.PNG](https://qiita-image-store.s3.amazonaws.com/0/32767/b20cbe93-ff08-e8ca-17a7-e832807a3836.png)

# あとはお好みで

メール送信ができるようになりましたので、あとはRun()の中に好きにビジネスロジックを書きましょう。ToはRun()内で設定可能なので、宛先を都度指定することもできます。このあたりはSendGridのドキュメントをご参照ください。固定値でよいならば「Integrate」からSendGridを選択することでいつでも変更できます。

![16.PNG](https://qiita-image-store.s3.amazonaws.com/0/32767/b274e4cc-fbfe-c0ab-f719-bf6b2efe4b23.png)

# 最後に

Azure Functionsは自分のいるApp Serviceで作ってますが、基本オープンソースなのでfeature requestはプルリクで行いました。皆さんも何か作ったらぜひどうぞ！ではでは。