メール送信の仕組み
ASP.NET Identityでのメール送信処理は、App_Start\IdentityConfig.csファイルに定義されたUserManager<T>クラスの派生クラスであるApplicationUserManagerクラス、およびEmailServiceクラスで行います。
ApplicationUserManagerクラスでは、これまでの連載でも登場したCreateメソッドの中で、メール送信処理を行うためのオブジェクトをEmailServiceプロパティに設定します(リスト1)。
public class ApplicationUserManager : UserManager<ApplicationUser> { …(略)… public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context) { var manager = new ApplicationUserManager(new UserStore<ApplicationUser>(context.Get<ApplicationDbContext>())); …(略)… manager.EmailService = new EmailService(); // メール送信処理オブジェクトの設定 …(略)… } }
このEmailServiceプロパティの型はIIdentityMessageService型です。IIdentityMessageService型は、その名の通りASP.NET Idenityの各種メッセージ送信処理を担当するインターフェースで、Taskを返す非同期のSendAsyncメソッドのみ持っています。UserManager<T>クラスはSendEmail拡張メソッドを呼び出すと、このEmailServiceプロパティのSendAsyncメソッドを呼び出してメール送信を行います。
UserManager<T>クラスには同様にSMS(ショートメッセージングサービス)を送信するためのSmsServiceプロパティも定義されています。メール、SMS以外のメッセージ(例えばTwitterで通知する、など)を送信したい場合は、独自の送信処理をIIdentityMessageServiceを実装したクラスとして作成し、そのクラスを使用してメッセージ送信するメソッドをApplicationUserManagerクラスに追加することで可能です。
さて、テンプレートで生成されたコードを見ると、EmailServiceプロパティにEmailServiceクラスの新しいインスタンスを設定しています。このEmailServiceクラスは同じくApp_Start\IdentityConfig.csファイルに定義され、SendAsyncメソッドの枠組みが生成されています。メールを送信するには、テンプレートで生成されたSendAsyncメソッドの中身を、独自に実装する必要があります。
EmailServiceクラスの実装
それでは、メールを送信できるようにEmailServiceクラスの実装を行って行きます。今回はクラウドメールサービスの「SendGrid」を利用してメールの送信を行ってみましょう。SendGridはSMTPサーバーとWeb上の管理コンソール、メール送信用のWeb APIなどを提供するクラウドサービスで、メール送信用ライブラリも提供しています。
SendGridの登録
まずはSendGridを利用するために、SendGridへのユーザー登録を行いましょう。SendGridは「株式会社 構造計画研究所」が日本での正規代理店ですので、そちらのサイトから指示に従って登録を行ってください。
SendGridライブラリのインストール
SendGridのライブラリはNuGetで配布されています。以下のコマンドを「NuGet パッケージ マネージャー コンソール」で実行し、ライブラリをインストールしてください。
PM> Install-Package SendGrid
SendGridのアカウント情報を構成ファイルに定義
次に、プログラムで使用するSendGridのアカウント情報(ユーザー名、パスワード)を構成ファイルから取得するように準備します。こういった認証情報はWeb.configに直に書いても良いのですが、アプリケーションの配置を容易にするため、別のファイルに切り出すことが多いです。今回はWeb.SendGrid.configというファイルに切り出すことにします。
まず、Web.configにWeb.SendGrid.configファイルを使うように記述を追加します(リスト2)。appSettings要素のfile属性を使い、Web.SendGrid.configの内容を読み込むようにしています。
<?xml version="1.0" encoding="utf-8"?> <configuration> …(略)… <appSettings file="Web.SendGrid.config" /> </configuration>
次に、新たにWeb.SendGrid.configという名前でXMLファイルを作成します(リスト3)。
<?xml version="1.0" encoding="utf-8"?> <appSettings> <add key="mailAccount" value="username@kke.com" /> <add key="mailPassword" value="password" /> </appSettings>
なお、ダウンロードできるサンプルにはWeb.SendGrid.configファイルは含めていません。代わりにWeb.SendGrid.config.sampleファイルを付けていますので、Web.SendGrid.configにリネームした後、自分で登録したSendGridのアカウント情報に内容を変更してください。
SendAsyncメソッドの実装
SendMailを使う準備ができたので、EmailServiceクラスのSendAsyncメソッドを実装しましょう(リスト4)。
// (1)メール送信処理の定義 public class EmailService : IIdentityMessageService { public Task SendAsync(IdentityMessage message) { // (2)メールメッセージ作成 var sendGridMessage = new SendGrid.SendGridMessage(); sendGridMessage.AddTo(message.Destination); sendGridMessage.From = new System.Net.Mail.MailAddress( "takano-sho@example.com", "TAKANO Sho"); sendGridMessage.Subject = message.Subject; sendGridMessage.Text = message.Body; sendGridMessage.Html = message.Body; // (3)認証情報の作成 var credentials = new System.Net.NetworkCredential( ConfigurationManager.AppSettings["mailAccount"], ConfigurationManager.AppSettings["mailPassword"] ); // (4)メール送信 var transportWeb = new SendGrid.Web(credentials); return transportWeb.DeliverAsync(sendGridMessage); } }
(1)メール送信処理の定義
IIdentityMessageServiceインターフェースを実装してクラスを定義します。前述の通り、テンプレートによりEmailServiceクラスとそのSendAsyncメソッドの基本的な枠組みは生成されてますので、SendAsyncメソッドの処理を実装します。
(2)メールメッセージ作成
SendGridを使ったメッセージオブジェクトを作成します。メッセージの送信元(From)は、実際は作成するWebアプリケーションの管理者やサポート窓口などのメールアドレスを設定することになるでしょう。
(3)認証情報の作成
SendGridを使用するためのユーザー、パスワードを用いて、System.Net.NetworkCredentialクラスのインスタンスを作成し、認証情報として使用します。ユーザー、パスワードはConfigurationManagerクラスを用いて、先ほど作成したWeb.SendGrid.configファイルで定義した値を使うようにしています。
(4)メール送信
SendGrid.WebクラスのDeliverAsyncメソッドを使用して、SendGridのWeb API経由でメールを送信します。
これでメールを送信するための準備が整いました。