Я вызываю метод JsonResult SendEmail () в моем контроллере для управления процессом почтовой рассылки. Я хотел бы получить значения, возвращенные этим методом в моей функции Ajax, чтобы показать сообщения об успехе / ошибке, но это не работает. Response.message и Response.success кажутся пустыми. Что я делаю неправильно. Кажется, что контроллер не получил возвращенные значения от метода SendEmail ().
public class ContactController : Controller
{
// GET: Contact
[HttpGet]
public ActionResult Index()
{
ViewBag.Title = "Contact us";
ViewBag.MetaDescription = "";
ViewBag.MetaKeywords = "";
ViewBag.SiteName = "";
ViewBag.CanonicalURL = "";
ViewBag.Robots = "index, follow";
return View();
}
[HttpPost]
public ActionResult Index(ContactModel contact)
{
if (ModelState.IsValid)
{
//Email settings
var recipient = "johndoe@outlook.com";
var sender = contact.Email.ToString();
var senderName = contact.Firstname + " " + contact.Lastname;
var subject = "A new message from " + contact.Firstname + " " + contact.Lastname;
var message = new StringBuilder();
message.Append("Name: " + contact.Firstname + " " + contact.Lastname + "<br />");
message.Append("Title: " + contact.Title + "<br />");
message.Append("Company: " + contact.Company + "<br />");
message.Append("Email: " + contact.Email + "<br />");
message.Append("Telephone: " + contact.Phone + "<br /><br />");
message.Append(contact.Message);
//start email Thread
var Email = new Thread(() =>
SendEmail(recipient, sender, senderName, subject, message));
Email.Start();
}
return View();
}
public JsonResult SendEmail(string recipient, string sender, string senderName, string subject, StringBuilder message)
{
try
{
using (var mail = new MailMessage())
{
mail.From = new MailAddress(sender, senderName);
mail.To.Add(new MailAddress(recipient));
mail.Subject = subject;
mail.Body = message.ToString();
mail.IsBodyHtml = true;
try
{
using (var smtpClient = new SmtpClient("smtp.office365.com", 587))
{
smtpClient.EnableSsl = true;
smtpClient.UseDefaultCredentials = false;
smtpClient.Credentials = new System.Net.NetworkCredential("johndoe@outlook.com", "password");
smtpClient.Send(mail);
}
}
finally
{
// Dispose the client
mail.Dispose();
}
}
return Json(new ContactModelResponse { Success = "alert-success", Message = "Success" });
}
catch (SmtpFailedRecipientsException ex)
{
for (int i = 0; i < ex.InnerExceptions.Length; i++)
{
SmtpStatusCode status = ex.InnerExceptions[i].StatusCode;
if (status == SmtpStatusCode.MailboxBusy ||
status == SmtpStatusCode.MailboxUnavailable)
{
Console.WriteLine("Delivery failed - retrying in 5 seconds.");
//Retry
//System.Threading.Thread.Sleep(5000);
//smtpClient.Send(mail);
}
else
{
Console.WriteLine("Failed to deliver message to {0}", ex.InnerExceptions[i].FailedRecipient);
}
}
return Json(new ContactModelResponse { Success = "alert-danger", Message = "Error" });
}
catch (SmtpException Se)
{
// Handle exception
Console.WriteLine(Se.ToString());
return Json(new ContactModelResponse { Success = "alert-danger", Message = "Error" });
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
return Json(new ContactModelResponse { Success = "alert-danger", Message = "Error" });
}
}
}
JS
$('.contact-form').each(function () {
$(this).validate({
errorPlacement: function (error, element) {
if (element.attr("name") == "department")
error.insertBefore($("fieldset").first());
else
error.insertAfter(element);
},
submitHandler: function (form) {
var $form = $(form);
// Ajax Submit
$.ajax({
type: 'POST',
url: $form.attr('action'),
data: $form.serialize()
}).done(function (response) {
$form.find('.form-control').val('').blur().parent().removeClass('has-success').removeClass('has-danger').find('label.error').remove();
$form.find('input:radio, input:checkbox').removeAttr('checked').removeAttr('selected');
$form.find('.form-control').removeClass('error');
$('#contactResult').html(response.Message);
$('#contactResult').addClass(response.Success);
$('#contactResult').removeClass('d-none');
});
}
});
});