検索
リンク
タグ
ASP.NET
.NET
ASP.NET MVC
F#
Azure
Visual Studio
ASP.NET Core
ライトニングトーク
Plone
Selenium
AJAX
C#
jQuery
ADO.NET Entity Framework
JavaScript
SQL Server
EFCore
LINQ
WebMatrix
Fizz-Buzz
カテゴリ
最新の記事
最新のコメント
記事ランキング
最新のトラックバック
以前の記事
2024年 02月 2024年 01月 2023年 12月 2023年 11月 2023年 10月 2023年 09月 2023年 08月 2023年 07月 2023年 06月 2023年 05月 2023年 04月 2023年 03月 2023年 02月 2023年 01月 2022年 12月 2022年 11月 2022年 10月 2022年 09月 2022年 08月 2022年 07月 2022年 06月 2022年 05月 2022年 04月 2022年 03月 2022年 02月 2022年 01月 2021年 12月 2021年 11月 2021年 10月 2021年 09月 2021年 08月 2021年 07月 2021年 06月 2021年 05月 2021年 04月 2021年 03月 2021年 02月 2021年 01月 2020年 12月 2020年 11月 2020年 10月 2020年 09月 2020年 08月 2020年 07月 2020年 06月 2020年 05月 2020年 04月 2020年 03月 2020年 02月 2020年 01月 2019年 12月 2019年 11月 2019年 10月 2019年 09月 2019年 08月 2019年 07月 2019年 06月 2019年 05月 2019年 04月 2019年 03月 2019年 02月 2019年 01月 2018年 12月 2018年 11月 2018年 10月 2018年 09月 2018年 08月 2018年 07月 2018年 06月 2018年 05月 2018年 04月 2018年 03月 2018年 02月 2018年 01月 2017年 12月 2017年 11月 2017年 10月 2017年 09月 2017年 08月 2017年 07月 2017年 06月 2017年 05月 2017年 04月 2017年 02月 2017年 01月 2016年 12月 2016年 11月 2016年 10月 2016年 09月 2016年 08月 2016年 07月 2016年 06月 2016年 05月 2016年 04月 2016年 03月 2016年 02月 2016年 01月 2015年 12月 2015年 11月 2015年 10月 2015年 09月 2015年 08月 2015年 07月 2015年 05月 2015年 04月 2015年 03月 2015年 02月 2015年 01月 2014年 12月 2014年 11月 2014年 10月 2014年 09月 2014年 08月 2014年 06月 2014年 04月 2014年 03月 2014年 02月 2014年 01月 2013年 12月 2013年 10月 2013年 09月 2013年 08月 2013年 07月 2013年 06月 2013年 05月 2013年 04月 2013年 03月 2013年 02月 2013年 01月 2012年 12月 2012年 11月 2012年 10月 2012年 09月 2012年 08月 2012年 07月 2012年 06月 2012年 05月 2012年 04月 2012年 03月 2012年 02月 2012年 01月 2011年 12月 2011年 11月 2011年 10月 2011年 09月 2011年 08月 2011年 07月 2011年 06月 2011年 05月 2011年 04月 2011年 03月 2011年 02月 2011年 01月 2010年 12月 2010年 11月 2010年 10月 2010年 09月 2010年 08月 2010年 07月 2010年 06月 2010年 05月 2010年 04月 2010年 03月 2010年 02月 2010年 01月 2009年 12月 2009年 10月 2009年 09月 2009年 07月 2009年 06月 2009年 05月 2009年 04月 2009年 03月 2009年 02月 2009年 01月 2008年 12月 2008年 11月 2008年 10月 2008年 09月 2008年 08月 2008年 07月 2008年 06月 2008年 05月 2008年 04月 2008年 03月 2008年 02月 2008年 01月 2007年 12月 2007年 11月 2007年 04月 2007年 03月 2007年 02月 2007年 01月 2006年 11月 2006年 10月 2006年 09月 2006年 08月 2006年 07月 |
2017年 01月 11日
C# スクリプト、又は F# スクリプトで、「メールを送信する」という Azure Function App の "ファンクション" を実装する際の話。
Azure Functions では、"トリガー" (ファンクションを実行するきっかけ) やファンクションの実行結果として、様々な外部サービスと連携できるようになっている。 実行結果のひとつとして、メール送信サービスのひとつである SendGrid を使ってメール送信を行う、ということができる。 もちろん、C#/F# スクリプトでは、古くから .NET Framework に標準装備されている System.Net.Mail.SmtpClient クラスを用いることで、Azure Functions のファンクション中から任意の SMTP サーバに対してメール送信を行うことが可能だ。 とはいえそれはそれとして、Azure Functions が備える SendGrid 連携によるメール送信の実装がどのようなものか、試してみることにした。 新たなファンクションを作るなら...「実行結果として SendGrid 連携によるメール送信が行われる」という "ファンクション" を、Azure ポータル Web サイト画面上から新規に追加するのであれば、帝国兵さんの下記の Qiita 記事が詳しい。Azure Function Appから定期的にメールを送る http://qiita.com/superriver/items/d245539b7652b7512f9b 既存のファンクションに、ポータルから付け足すこともできそうだが...いっぽう、すでに実装済みの既存の "ファンクション" に対し、あとから「実行結果として SendGrid 連携によるメール送信が行われる」ようにすることも、当然可能である。Azure ポータル Web サイト画面からは、当該 "ファンクション" のブレードを開いている状態から、「Integrate」カテゴリにて、「Outputs」の箇所で「+ New Output」をクリックすると、"ファンクション実行結果の出力内容" の選択肢がずらっと出てくる。 ここから「SendGrid」を選択すれば良いらしい。 詳しくはあとで説明するが、さらに Run.csx の変更も必要なのだ。 外部からデプロイしてるとポータル画面からは操作できないさらに言えば、ローカル開発環境で開発していてそれを「Web発行」や ローカル Git リポジトリからの "git push"、はたまた CI 連携などの方法で Azure Functions 上にデプロイしている場合は、Azure ポータル Web サイト画面上での上記操作はロックダウンされてしまう(当たり前だが)。ということで、手作業で各種ファイルを編集することで、既存の "ファンクション" に、実行結果として SendGrid 連携によるメール送信が行われるように変更する手順を明らかにしてみた。 仕組み・構造改めて「"ファンクション" の実行結果として SendGrid 連携によるメール送信が行われる」仕組み・構造をまとめると以下のとおりだ。"ファンクション" の戻り値に、SendGrid 用ライブラリに収録の Mail 型のオブジェクトを返すように構成することで、その "ファンクション" が実行された結果の戻り値で返却された Mail オブジェクトを用いてメール送信が実行される。 準備・前提条件何はともあれ SendGrid サービスを使うのだから、SendGrid にサインアップして SendGrid アカウントを取得しておく必要がある。Azure Functions で~という話なので、Azure のアカウントからマーケットプレイスで特典アカウントとして SendGrid アカウントを作成するのがよいだろう。 SendGrid アカウントができたら、API キーを生成し入手。 さらに、その API キーについて「Mail Send」「Alerts」「Email Activity」「Stats」の機能アクセス可否を「Full Access」に設定 ( Full Access の選択肢がないものは 「Read Access」) しておく。 このあたりの手順は先に紹介した Qiita 記事を参照されるとよろしいかと (URL再掲)。 準備1: SendGridのアカウントを作る http://qiita.com/superriver/items/d245539b7652b7512f9b#%E6%BA%96... 準備2: SendGridのAPIキーを得る http://qiita.com/superriver/items/d245539b7652b7512f9b#%E6%BA%96... 実装手順すでにある "ファンクション" に、実行結果として SendGrid 連携によるメール送信が行われるようにする改造・変更手順は以下のとおり。※なお、以下の説明では C# スクリプトで実装していることを前提に進めるが、F# スクリプトでも編集内容に大差ない。 "project.json" に、SendGrid NuGet パッケージを使用する旨を追記。 { ※どうも、Azure ポータル Web サイト画面上での実装作業においては、project.json がなくても SendGrid のアセンブリが参照可能になっているように見える。が、とりあえずローカル開発環境でインテリセンス等の IDE 支援を得ることを前提として、上記のとおり NuGet パッケージを明示的に示す説明とする。 "function.json" に、SendGrid によるメール送信に関する構成を追記。 {ちょっと落とし穴だったのが、"apiKey" プロパティの設定。 上記では「"apiKey": "SendGridApiKey"」としているように、 ここに実際の API キーを書いてはいけない。 このプロパティで指定しているのは、そのプロパティ名とは裏腹に API キーそのものではなく、 API キーを格納しているアプリケーション構成のエントリ名を指定 しているのだ。 (今さらだけど、なんでこんなプロパティ名にしたんだ...orz) なので、後述するとおり、Azure ポータル Web サイトのアプリケーション構成設定画面にて、"SendGridApiKey" というエントリ名で SendGrid の API キーを設定追加する必要がある。 ちょっと話が逸れるがもうひとつ。 上記要領の "function.json" の編集が、どうやら、Azure ポータル Web サイト画面上から「+ New Output」したときの編集内容に該当する模様だ。 なので、もしも Azure ポータル Web サイト画面上でコーディングしてて、「Integrate」カテゴリで「+ New Output」で SendGrid を追加した場合は、ここまでの手順は不要で、このあとの Run.csx ( F# なら Run.fsx ) の編集以降の手順を行えばよい。 さて、話を戻して。 run.csx にて、SendGrid NuGetパッケージで提供される、SendGrid アセンブリへの参照設定を追記。 ついでにコードを略記できるよう名前空間「SendGrid.Helpers.Mail」も開いておく。 #r "SendGrid" ファンクション本体である "Run" 静的メソッドの戻り値を、(SendGrid アセンブリが提供する、SendGrid.Helpers.Mail 名前空間の) Mail 型とするよう変更。 public static Mail Run(...) 送信したいメール内容のとおり Mail オブジェクトを組み立てて、Run メソッドの戻り値として返却。 public static Mail Run(...) 最後に、Azure ポータル Web サイトの画面にて、「Function app setting」カテゴリから「Configure app settings」を開いて、アプリケーション構成に SendGrid の API キーを掲載したエントリを追加。 以上で、このファンクションが実行されると SendGrid 連携によるメール送信が行われるようになる。 メール送信についてエトセトラここまでの説明で例示した "function.json" では、宛先と差出人アドレスだけ指定していたが、件名や本文も "function.json" 中にて指定可能だ。たとえば "function.json" に {というように subject プロパティと text プロパティを追記しておけば、Run メソッドからは下記のとおり Mail オブジェクトを new して返すだけで、ほかのコーディング不要で、"function.json" にて指定された宛先・差出人アドレス・件名・本文にてメール送信が行われるようになる。 return new Mail(); はたまた、その逆というか、Run メソッド中でことごとメール送信内容を指定すれば、"function.json" での指定よりも優先してその指定内容が採用される。 なので、宛先や差出人アドレスも、Run メソッド中で実行時に指定可能だ (下記例)。 return new Mail( あと、ファンクションが実行されてもメールを送信したくない場合は、Run メソッドの戻り値として null を返せばよいようだ。 return null; まとめ以上のとおり、Azure Functions が備える SendGrid 連携を使ってメール送信を行うよう、ファンクションを構成することができることがわかった。System.Net.mail.SmtpClient を使った場合と比較して、Run メソッド中の記述量が減り、本来の「こういう内容をメール送信したい」という、 "やりたいこと" に集中して記述できる のはよいと感じた。 とくにメール送信のサービスとして SendGrid を採用している場合は、API キーに基づいた認証・アクセス権管理となるので、セキュリティ面でも System.Net.mail.SmtpClient を使うよりは安全・柔軟だと思われる。 参考) SendGrid ブログ「APIキー認証でセキュリティを強化しよう」 https://sendgrid.kke.co.jp/blog/?p=3659 ただし、1回のファンクション実行によって、複数のメール送信を行いたい場合は、この方式では対応できなさそう、と感じた。 もっとも、ファンクションは単機能にして、複数のファンクションを連携・積み重ねてより複雑・大規模な構成へと構築していくのがベストプラクティスとは思うので、メール送信の粒度ごとにファンクションを分ければ解決するかもしれない。 それでもどうしても1回のファンクション実行で複数のメール送信の必要がある場合は、Azure Functions プラットフォームによる SendGrid 連携はやめて、
by developer-adjust
| 2017-01-11 20:31
| .NET
|
Comments(0)
|
ファン申請 |
||