ASP.NET MVCから手紙を送ります

多くの場合、アプリケーションでは、ユーザーに手紙を送る必要があります。 今日は、ActionMailer .Netを使用してこのタスクを簡単に解決する方法を示します。 コントローラーアクションの形式で送信された文字を表示することの主な利点は、文字の本文がディスプレイに表示されることと、デバッグモードではメールサーバーを使用せずにメッセージをハードドライブに直接保存できることです。



空のプロジェクトを作成します。 NuGetを使用して、ActionMailerを追加します。

PM> Install-Package ActionMailer
      
      







デモンストレーションのために、1つのHomeコントローラーを作成し、それに4つのアクションを追加します。メインページ、送信、送信の成功、送信の失敗の場合:

 public class HomeController : Controller { public ActionResult Index() { return View(); } [HttpPost] public ActionResult Index(EmailModel model) { throw new NotImplementedException(); } public ActionResult Success() { return View(); } public ActionResult Error() { return View(); } }
      
      





次に、書き込み用のモデルを追加します。

 public class EmailModel { public string Subject { get; set; } public string From { get; set; } public string To { get; set; } public string Body { get; set; } }
      
      





インデックスアクションのマッピングを作成します。 必要なフィールドを備えたこの単純な小さなフォームがあります。

 @model TestSendEmail.Models.EmailModel @{ Layout = "~/Views/Shared/_Layout.cshtml"; ViewBag.Title = "Index"; } @using(Html.BeginForm("Index", "Home", FormMethod.Post, new { @class = "well"})) { @Html.ValidationSummary() <label>Subject</label> @Html.TextBoxFor(m => m.Subject, new { @class = "input-xxlarge" }) <label>To</label> @Html.TextBoxFor(m => m.To, new { @class = "input-xxlarge" }) <label>From</label> @Html.TextBoxFor(m => m.From, new { @class = "input-xxlarge" }) <label>Body</label> @Html.TextAreaFor(m => m.Body, new { @class = "input-xxlarge" }) <br/> <input type="submit" class="btn" value="Send"/> }
      
      





このフォームを取得します。



手紙を直接送信するコントローラーを作成します。 EmailControllerと呼び、MailerBaseから継承します。 また、レターを送信するアクションを追加および実装します。

 public class EmailController : MailerBase { public EmailResult SendEmail(EmailModel model) { To.Add(model.To); From = model.From; Subject = model.Subject; return Email("SendEmail", model); } }
      
      





To、From、Subject-コントローラーの内部プロパティであり、それらの値は電子メールの送信時に使用されます。 Toがリストであるため、大量のメール送信が可能です。 スパマーは喜ぶでしょう。

次に、アクションにビューを追加します。 この場合、ビューは送信された手紙の本文の役割を果たします。 HTMLマークアップを追加できます。

 @model TestSendEmail.Models.EmailModel @{ Layout = null; } <html> <body> <h1>@Model.Subject</h1> <p>@Model.Body</p> </body> </html>
      
      





ビューファイルの命名についても気づきます。 デフォルトバージョンでは、ResetPassword.cshtmlという名前になります。 ActionMailerを正しく動作させるには、名前がResetPassword.html.cshtmlの形式になるように.htmlを追加する必要があります。

また、正常に動作するには、メールを送信するためのパラメーターを追加する必要があります。 ほぼローカルディスクに送信される保存の最初のオプション:

 <mailSettings> <smtp deliveryMethod="SpecifiedPickupDirectory"> <specifiedPickupDirectory pickupDirectoryLocation="C:\" /> <network host="localhost" /> </smtp> </mailSettings>
      
      





メールサーバーを使用する場合の2番目のオプション:

 <mailSettings> <smtp deliveryMethod="Network"> <network host="smtp.gmail.com" userName="myemail@gmail.com" password="mypassword" enableSsl="true"/> </smtp> </mailSettings>
      
      





これらの行は、 <system.net>セクションのWeb.configに追加する必要があります

それでは、 HomeコントローラーのIndexアクションにレターを送信するロジックを追加しましょう。

 [HttpPost] public ActionResult Index(EmailModel model) { if (ModelState.IsValid) { try { new EmailController().SendEmail(model).Deliver(); return RedirectToAction("Success"); } catch (Exception) { return RedirectToAction("Error"); } } return View(model); }
      
      





これで、ボタンをクリックすると、レターが送信されます(またはディスクに保存されます)。



追加資料:

http://geeksharp.com/2011/01/26/actionmailer-net-email-templates-for-the-mvc-crowd/



All Articles