2016-09-07 8 views
0

Auf einem Web-Projekt, das ich in MVC mache, habe ich ein Ajax-E-Mail-Formular auf meiner Homepage. Ich möchte, dass das Formular den Benutzer vor dem Senden der Nachricht auffordert, und dann entweder nichts tut oder das Formular löscht und den Benutzer über die erfolgreiche Zustellung der Nachricht informiert. Stattdessen sendet mich das Senden des Formulars immer an eine "Seite", die die fehlgeschlagene Nachricht enthält, die ich zurückschicke, und nichts anderes.Ajax E-Mail-Formular in MVC-Homepage schlägt fehl

Dies ist der Formularbereich der Ansicht.

@using (Ajax.BeginForm("SendEmailJson", new AjaxOptions 
    { 
     Confirm = "Send email?", 
     OnSuccess = "MessageSent", 
     OnFailure = "MessageSent" 
    })) 
    { 
     <div class="form-group"> 
      @Html.Label("Name") 
      @Html.TextBox("FromName") 
     </div> 
     <div class="form-group"> 
      @Html.Label("Address") 
      @Html.TextBox("FromEmail") 
     </div> 
     <div class="form-group"> 
      @Html.Label("Message") 
      @Html.TextArea("Message", "", 5, 15, new { }) 
     </div> 
     <div class="form-group"> 
      <input type="submit" value="Send" class="btn btn-default" /> 
     </div> 
    } 

Diese ruft dann die E-Mail-Funktion in der Heimsteuerung:

[HttpPost] 
    public JsonResult SendEmailJson(EMailViewModel model) 
    { 
     string msg; 
     if (ModelState.IsValid) 
     { 
      bool suc = SendEmailMessage(model); 
      msg = suc ? "Message sent" : "Error sending message. Please try again"; 
     } 
     else 
      msg = "An error occurred in the submission of this message. Please try again."; 
     return Json(msg); 
    } 

    private bool SendEmailMessage(EMailViewModel model) 
    { 
     try 
     { 
      var body = "Email from: {0} ({1})\n\nMessage:\n{2}"; 
      var msg = new MailMessage(); 
      msg.To.Add(new MailAddress("[email protected]")); 
      msg.From = new MailAddress(model.FromEmail); 
      msg.Subject = "Contact from " + model.FromEmail + " through MyWebSiteName"; 
      msg.Body = string.Format(body, model.FromName, model.FromEmail, model.Message); 
      using (var smtp = new SmtpClient()) 
      { 
       smtp.Send(msg); 
      } 
     } 
     catch(Exception) 
     { 
      return false; 
     } 
     return true; 
    } 

Das Modell ist ein sehr einfaches Modell:

public class EMailViewModel 
{ 
    [Required] 
    [Display(Name = "Name")] 
    public string FromName { get; set; } 
    [Required] 
    [Display(Name = "Address")] 
    public string FromEmail { get; set; } 
    [Required] 
    [Display(Name = "Message")] 
    [DataType(DataType.MultilineText)] 
    public string Message { get; set; } 
} 

Ich weiß nicht, warum das Programm fehlschlägt Aber ich habe ein paar Leute warten lassen, und das ist das letzte Puzzleteil. Bitte helfen Sie.

EDIT: über SMTP-Einstellungen, ich habe dies in der Datei Web.config:

<system.net> 
    <mailSettings> 
     <smtp from="[email protected]"> 
     <network host="smtp.gmail.com" 
       port="587" 
       userName="[email protected]" 
       password="dummyPW" 
       enableSsl="true" /> 
     </smtp> 
    </mailSettings> 
    </system.net> 

Als ich herauszufinden, wie E-Mails senden ich diese gleichen Konfigurationsdaten in ein kleines Testprojekt setzen und E-Mails waren ohne Problem gesendet. In meinem eigentlichen Projekt haben diese Einstellungen jedoch keinen Einfluss darauf, dass die Funktion immer die Nachricht nicht senden kann. Sie senden mir auch eine neue Seite mit der Nachricht, anstatt mir ein Popup mit der Fehlermeldung zu geben.

Antwort

0

Ich fand, dass Sie einige wichtige Einstellungen innerhalb SendEmailMessage Methode in Bezug auf SmtpClient Initialisierung verpasst haben, als E-Mail zu senden, war hier einige Verbesserungen:

private bool SendEmailMessage(EMailViewModel model) 
{ 
    try 
    { 
     var body = "Email from: {0} ({1})\n\nMessage:\n{2}"; 
     var msg = new MailMessage(); 
     msg.To.Add(new MailAddress("[email protected]")); 
     msg.From = new MailAddress(model.FromEmail); 
     msg.Subject = "Contact from " + model.FromEmail + " through MyWebSiteName"; 
     msg.Body = string.Format(body, model.FromName, model.FromEmail, model.Message); 
     using (var smtp = new SmtpClient()) 
     { 
      //--- add these lines to define your e-mail provider 
      smtp.DeliveryMethod = SmtpDeliveryMethod.Network; 

      // set your SMTP server address here 
      smtp.Host = "smtp.server.net"; 

      // use port number depending on your server SMTP port, e.g. 25, 465, 587, 2525 
      smtp.Port = 587; 

      // provide username & password for email access 
      smtp.Credentials = new NetworkCredential("serverusername", "serverpassword"); 

      // additionally, enable SSL if your email server supports secure connection 
      smtp.EnableSsl = true; 
      //--- end of added lines 

      smtp.Send(msg); 
     } 
    } 
    catch(Exception) 
    { 
     return false; 
    } 
    return true; 
} 

Wenn Sie Pickup-Verzeichnis-Konfiguration auf lokalen Server haben, SmtpDeliveryMethod.Network-SmtpDeliveryMethod.PickupDirectoryFromIis ändern .

Alle Vorschläge willkommen.

+0

Ich hatte dieses Zeug in der Datei Web.config. Alle außer der Liefermethode. Ich hatte ein anderes Projekt mit den gleichen Einstellungen in der Konfigurationsdatei und E-Mails wurden gut gesendet. – MVCNovice