2017-02-22 25 views
-2

Microsoft Docs、Getting Startedチュートリアル、および多くのスタックオーバーフロー検索でASP.NETコアを学習するのに過去2〜3週間を費やしました。私はチュートリアルから単純なWebアプリケーションを作成することで得ることができますが、私の外にあるものは私のために機能する関数を作成することと、アプリケーションのさまざまな部分から変数にアクセスする方法です。MailKitを使用してMVCコントローラにフォームデータを送信する方法

私の問題:ASP.NETコアとMailKit(メールクライアントライブラリ)を使用して

。いくつかは知っているかもしれないが、彼らは最近ASP.NET CoreからSystem.Net.Mailを削除したので、代わりにMailKitを使用することに決めました。

私は、それぞれの対応するコードスニペットの下で私が追い払った質問のいくつかを明確にしたいと思います。

マイセットアップ:

  • wwwrootの
  • コントローラ
    • HomeController.cs
  • モデル
    • Mail.cs
  • ビュー
    • ホーム
      • Index.cshtml
    • 共有
      • _Layout.cshtml

すべてのファイルがすべてのフォルダに含まれていませんでした。私はこの質問に関連すると思うものだけを示しました。


ビュー:Index.cshtml私は私の内SubmitInput機能にIndex.cshtmlから作られた情報を送信するにはどうすればよい

<form asp-controller="Home" asp-action="SubmitInput" method="post"> 
    <input asp-for="Name" required /> 
    <input asp-for="Email" required /> 
    <input asp-for="CompanyName" required /> 
    <input asp-for="Website" required /> 
    <textarea asp-for="Message"></textarea> 
    <button type="submit">Submit</button> 
</form> 

HomeController.cs


コントローラ:HomeController.cs

namespace Project.Controllers 
{ 
    public class HomeController : Controller 
    { 
     [HttpPost] 
     [ValidateAntiForgeryToken] 
     public IActionResult SubmitInput() 
     { 
      string fromEmail = Email, 
        fromName = Name, 
        toEmail = "[email protected]", 
        subject = "ASP.NET Core with MailKit" 
        content = Message 
        site =  Website, 
        company = CompanyName; 

      // MailKit 
      Models.Mail.Send(fromEmail, fromName, toEmail, subject, content); 

      return View(); 
     } 

     public IActionResult Index() 
     { 
      return View(); 
     } 

     public IActionResult Error() 
     { 
      return View(); 
     } 
    } 
} 

HomeController.csIndex.cshtmlでフォームの送信から変数を取得する必要があります。なぜ私がフォームから値を取得していないのか分かりません。


モデル:Mail.cs

namespace Project.Models 
{ 
    public class Mail 
    { 
     public static string Send(
      string fromEmail, 
      string fromName, 
      string toEmail, 
      string subject, 
      string content) 
     { 
      try 
      { 
       // Get, Set Variables 
       MimeMessage Email = new MimeMessage(); 
       Email.From.Add(new MailboxAddress(fromName, fromEmail)); 
       Email.To.Add(new MailboxAddress("", toEmail)); 
       Email.Subject = subject; 
       Email.Body = new TextPart("Plain") { Text = content }; 

       // SMTP Mail Client 
       using (var client = new SmtpClient()) 
       { 
        // Accept all SSL certificates (in case the server supports STARTTLS) 
        client.ServerCertificateValidationCallback = (s, c, h, e) => true; 

        client.Connect(
         "smtp.gmail.com", 
         587, 
         MailKit.Security.SecureSocketOptions.StartTlsWhenAvailable); 

        // Since we don't have an OAuth2 token, disable the XOAUTH2 authentication mechanism. 
        client.AuthenticationMechanisms.Remove("XOAUTH2"); 

        // Only needed if the SMTP server requires authentication 
        client.Authenticate("[email protected]", "password"); 
        client.Send(Email); 
        client.Disconnect(true); 
        return "Success"; 
       } 
      } 
      catch (Exception) 
      { 
       return "Failed"; 
      } 
     } 
    } 
} 

私はにMailKitコードをどこに置くかわかりません。 ModelフォルダーにMail.csとして存在することは許可されていますか?

+1

フォームから値を取得する方法や、システムのアーキテクチャを設計する方法を尋ねていますか? MailKitコード*がModelフォルダに存在しないようにするには? –

+0

この質問は、メールとは関係がありません。「フォームデータをMVCコントローラに送信する方法」に関するすべてのことは、 –

答えて

-2

HomeController.csは、Index.cshtmlのサブフォーム から変数を取得する必要があります。私はちょうど私が の値をフォームから取得していない理由を知らない。

それは手動のasp.net MVCのようにフォームに反偽造キーを追加することが必要だ場合、私はremmemberませんが、あなたはそれがトークンを送信していますことを確認するために、フォームタグにasp-antiforgery="true"を追加してみてください。

ちなみに、あなたのSubmitInputアクションはコントローラに情報を取得するためのモデルを受け取るべきではありませんか?あなたはどのように値を渡すことを期待していますか? 強力な型付きビューを使用するか、Request.Formディクショナリから値を取得する必要があります。

MailKitコードをどこに入れるのかわかりません。 ModelフォルダにMail.csとして が存在しますか?

私はインスピレーションのために鉄筋を調べることをお勧めします。 通常、私がやることは、このためにHelpers\Mailerフォルダを作成することです。

1

HomeController.csは、Index.cshtmlのサブフォーム から変数を取得する必要があります。私はちょうど私が の値をフォームから取得していない理由を知らない。

SubmitInputアクションメソッドにはパラメータがありません。 Viewからの値がコントローラにどのように来ると思いますか? コントローラレベルで変数EmailMessageWebsiteなどが宣言されている場合は、そうではありません。 あなたのケースでは、値をRequest.Formから次のように取得しようとする必要があります。

[HttpPost] 
[ValidateAntiForgeryToken] 
public IActionResult SubmitInput() 
{ 
    string fromEmail = Request.Form["Email"], 
      fromName = Request.Form["Name"], 
      toEmail = "[email protected]", 
      subject = "ASP.NET Core with MailKit", 
      content = Request.Form["Message"], 
      site =  Request.Form["Website"], 
      company = Request.Form["CompanyName"]; 

    // MailKit 
    Models.Mail.Send(fromEmail, fromName, toEmail, subject, content); 
    return View(); 
} 

これを行うには良い方法は、これらすべてのプロパティを持つモデルクラスを作成して、代わりにForm.Requestのモデルクラスのオブジェクトの一部として値を送信することです。

MailKitコードをどこに入れるのかわかりません。 ModelフォルダにMail.csとして が存在しますか?

このようにしても問題はありませんが、お勧めできません。これを行う適切な方法は、電子メール送信機能をサービスクラスにラップすることです。

public class EmailService 
{ 
    public string SendEmail(string fromEmail, 
     string fromName, 
     string toEmail, 
     string subject, 
     string content) 
    { 
     try 
     { 
      // Get, Set Variables 
      MimeMessage Email = new MimeMessage(); 
      Email.From.Add(new MailboxAddress(fromName, fromEmail)); 
      Email.To.Add(new MailboxAddress("", toEmail)); 
      Email.Subject = subject; 
      Email.Body = new TextPart("Plain") { Text = content }; 

      // SMTP Mail Client 
      using (var client = new SmtpClient()) 
      { 
       // Accept all SSL certificates (in case the server supports STARTTLS) 
       client.ServerCertificateValidationCallback = (s, c, h, e) => true; 

       client.Connect(
        "smtp.gmail.com", 
        587, MailKit.Security.SecureSocketOptions.StartTlsWhenAvailable); 

       // Since we don't have an OAuth2 token, disable the XOAUTH2 authentication mechanism. 
       client.AuthenticationMechanisms.Remove("XOAUTH2"); 

       // Only needed if the SMTP server requires authentication 
       client.Authenticate("[email protected]", "password"); 
       client.Send(Email); 
       client.Disconnect(true); 
       return "Success"; 
      } 
     } 
     catch (Exception) 
     { 
      return "Failed"; 
     } 
    } 
} 

これをコントローラで次のように使用してください。

public class HomeController : Controller 
{ 
    private EmailService emailService; 
    public HomeController() 
    { 
     this.emailService = new EmailService(); 
    } 

    [HttpPost] 
    [ValidateAntiForgeryToken] 
    public IActionResult SubmitInput() 
    { 
     string fromEmail = Email, 
       fromName = Name, 
       toEmail = "[email protected]", 
       subject = "ASP.NET Core with MailKit" 
       content = Message 
       site =  Website, 
       company = CompanyName; 

     var emailSentStatus = this.emailService.SendEmail(fromMail, fromName, toEmail, subject, content); 

     if(emailSentStatus == "success") 
     { 
      //Logic of email sent successfully. 
     } 
     else 
     { 
      //Logic of email not sent successfully. 
     } 
     return View(); 
    } 
} 

これは、依存性注入とIoCコンテナを使用してさらに改善することができます。簡単にするために、私はこの答えにそれを含めていません。

関連する問題