C# ASP.NET の MVC3/MVC4 の ActionMailer を介して非同期的に送信する電子メールを取得しようとしています。
しかし、私は2つの問題に遭遇しました:
プライベート関数を使用して Task.Run または Task.Start メソッドを使用しようとすると、HttpContext が null になり、電子メールが送信されません。これは、組み込みの非同期配信方法を使用する場合にも当てはまります。
メール送信関数に async/await をかけようとしても、return メソッドが void であるため機能せず、void 関数では await できないと言われました。
両方のシナリオで使用したコードを次に示します (どちらの場合も、e は Model オブジェクトであると仮定します)。
シナリオ 1:
Action mailAction = new Action(() => { OnSentEmail(e); });
Task mailTask = new Task(mailAction);
mailTask.Start();
private void OnSentEmail(Model e)
{
new MailController().SendMail(e).Deliver();
//HttpContext is null here, so cannot send mail
}
OR
new MailController().SendMail(e).DeliverAsync();
シナリオ 2:
await Task.Run(async() => await new MailController().SendMail(e).Deliver());
私はまだ非同期メソッドにあまり慣れていませんが、これは私が思いつくことができる最高のようでした。送信する必要がある電子メールはリッチ HTML 形式であるため、通常の SmtpClient を使用することはできません。そのため、電子メールを送信してビューのようにスタイルを設定できるように、ActionMailer を選択しました。
私が必要とするのは、HttpContextを強制することによって(メールを送信するためにMailerBaseがHttpContextからどの情報を使用するのかわかりません)、または非同期/待機できるようにすることで、メールを非同期的に送信できるようにすることです。