#c# #asp.net-core-2.0 #contact-form #system.net.mail
#c# #asp.net-core-2.0 #контактная форма #system.net.mail
Вопрос:
У меня есть простая контактная форма на моем хостинге Godaddy Asp.net веб-сайт core 2.0 Razor pages. На локальном хосте все работает нормально. Когда веб-сайт развернут, если я нажимаю кнопку отправки, я получаю сообщение об ошибке 500 «не удается обработать запрос». Ниже приведен код для страницы:
<form method="post">
<div class="row gtr-uniform gtr-50">
<div class="col-6 col-12-mobilep">
<input asp-for="Sendmail.FName" placeholder="First Name"/>
<span asp-validation-for="Sendmail.FName" style="color:red;"></span>
</div>
<div class="col-6 col-12-mobilep">
<input asp-for="Sendmail.LName" placeholder="Last Name" />
<span asp-validation-for="Sendmail.LName" style="color:red;"></span>
</div>
<div class="col-6 col-12-mobilep">
<input asp-for="Sendmail.PhoneNumber" placeholder="Phone Number" />
<span asp-validation-for="Sendmail.PhoneNumber" style="color:red;"></span>
</div>
<div class="col-12">
<select asp-for="Sendmail.BestTimeToCall">
<option value="">- Best Time To Call-</option>
<option value="Morning">Morning</option>
<option value="Afternoon">Afternoon</option>
<option value="Evening">Evening</option>
</select>
<span asp-validation-for="Sendmail.BestTimeToCall" style="color:red;"></span>
</div>
<div class="col-6 col-12-mobilep">
<input asp-for="Sendmail.EmailAddress" placeholder="Email" />
<span asp-validation-for="Sendmail.EmailAddress" style="color:red;"></span>
</div>
<div class="col-12">
<select asp-for="Sendmail.PreferredContactMethod">
<option value="">- Preferred Contact Method -</option>
<option value="Email">Email</option>
<option value="Phone">Phone Call</option>
</select>
<span asp-validation-for="Sendmail.PreferredContactMethod" style="color:red;"></span>
</div>
<div class="col-12">
<textarea asp-for="Sendmail.MessageBody" placeholder="Enter your message" rows="6"></textarea>
<span asp-validation-for="Sendmail.MessageBody" style="color:red;"></span>
</div>
<div class="col-12">
<ul class="actions">
<li><button asp-page-handler="ContactUs" class="primary" id="contactsubmitbutton">Submit</button></li>
<li>@ViewBag.Message</li>
</ul>
</div>
</div>
</form>
Ниже приведен контроллер для страницы контактов (адрес электронной почты и пароль удалены):
public Email Sendmail { get; set; }
public async Task OnPost()
{
try
{
if (ModelState.IsValid)
{
//this is the email address you want the contact form to be sent to. example contactrequestform@thevillagementalhealthgroup.com
string To = "email@gmail.com";
//this is what the subject line of the email will say. use a subject line that will be easy to identify
string Subject = "New Contact Request From The Village Mental Health Group's Contact Us Form";
//this is the body of the email
string Body = Sendmail.Body;
MailMessage mm = new MailMessage();
//this is the to section of the email
mm.To.Add(To);
//this is the subject section of the email
mm.Subject = Subject;
//this is what the body of the email message will contain. Currently it has the input values from the contact form in a readable format
mm.Body = "You have a new message from your contact us form on TheVillageMentalHealthgroup.com. Their information is as follows: First Name: " Sendmail.FName " Last Name: " Sendmail.LName " Phone Number: " Sendmail.PhoneNumber " Best Time To Call: " Sendmail.BestTimeToCall " Email Address: " Sendmail.EmailAddress " Preferred contact Method: " Sendmail.PreferredContactMethod " Their message is as follows: " Sendmail.MessageBody;
//this signifies if the email body is html format. if you change to yes you can format the email message with html mark up
mm.IsBodyHtml = false;
//this is where the email is being sent from. this should be set to the email address specific to the contact form so you will always automatically know it is a contact request from said website
mm.From = new MailAddress("email@gmail.com");
//this is the email providers smtp address
SmtpClient smtp = new SmtpClient("smtp.gmail.com");
smtp.Port = 587;
smtp.UseDefaultCredentials = true;
smtp.EnableSsl = true;
//these are user names and password for the email provider
smtp.Credentials = new System.Net.NetworkCredential("email@gmail.com", "password");
await smtp.SendMailAsync(mm);
//this is the message displayed next to the submit button showing successful submission of of contact request
ViewData["Message"] = "Thank You. Your has been sent successfully.We will be in contact with as soon as we are available.";
}
else
{
//this is the message displayed if there is an issue submitting the form
ViewData["Message"] = "There is an issue with the Contact Form. Please contact us by phone or email.";
}
}
catch (Exception ex)
{
ViewData["Message"] = ex;
Response.Redirect("ContactFormError");
}
}
Он отлично работает на локальном хосте, но не будет отправлять электронную почту после публикации на сервере. Буду признателен за любую помощь или совет. Я искал, искал и пытался разобраться в этом уже несколько дней.
Комментарии:
1. Находится ли сервер в корпоративной сети? В корпоративной сети с сервером Outlook весь порт 587 перенаправляется на прокси-сервер и не проходит через брандмауэр к gmail.com .
2. Это сервер, размещенный на godaddy.
3. Вы должны связаться с godaddy и посмотреть, разрешают ли они вашему серверу подключаться к gmail. Не уверен, разрешит ли их брандмауэр подключения к другим почтовым серверам. Смотрите : godaddy.com/help /. …
4. Спасибо. Я просто изменил его на электронное письмо godaddy, и оно выдает мне ту же ошибку. Это ооочень расстраивает.
5. Измените на false. True использует настройки из учетной записи POP, вы используете имя пользователя и пароль. : smtp. UseDefaultCredentials = true;
Ответ №1:
Хорошо, я понял это. Во-первых, GoDaddy не разрешает использовать внешние серверы в своем плане общего хостинга. Поэтому после изменения использования их relay-hosting.secureserver.net smtp-сервер, на который я все еще получал ошибки. В итоге я отправил ошибку исключения на рабочую страницу путем передачи данных представления, захваченных в catch (Exception ex), на страницу «Свяжитесь с нами», чтобы у меня могли возникнуть проблемы. В этот момент я заметил, что он не обновил содержимое моего просмотра страницы. После некоторых других проверок я обнаружил, что во время публикации мои представления и модели не обновлялись. После многочисленных попыток принудительно изменить ее, в итоге получилось изменить конфигурацию публикации с release на debug, загрузить, а затем вернуться к release и снова загрузить. оттуда это код, который сработал обратите внимание, что учетные данные не требуются при размещении с учетной записи хостинга godaddy, связанной с электронной почтой.
public async Task OnPost()
{
try
{
if (ModelState.IsValid)
{
//this is the email address you want the contact form to be sent to. example email@email.com
string To = "destination@email.com";
//this is what the subject line of the email will say. use a subject line that will be easy to identify
string Subject = "New Contact Request From ...";
//this is the body of the email
string Body = Sendmail.Body;
MailMessage mm = new MailMessage();
//this is the to section of the email
mm.To.Add(To);
//this is the subject section of the email
mm.Subject = Subject;
//this is what the body of the email message will contain. Currently it has the input values from the contact form in a readable format
mm.Body = "You have a new message from your contact us form on yoursite.com. </br>"
" Their information is as follows:"
" </br> First Name: " Sendmail.FName
" </br> Last Name: " Sendmail.LName
" </br> Phone Number: " Sendmail.PhoneNumber
" </br> Best Time To Call: " Sendmail.BestTimeToCall
" </br> Email Address: " Sendmail.EmailAddress
" </br> Preferred contact Method: " Sendmail.PreferredContactMethod
" </br> Their message is as follows: " Sendmail.MessageBody;
//this signifies if the email body is html format. if you change to yes you can format the email message with html mark up
mm.IsBodyHtml = true;
//this is where the email is being sent from. this should be set to the email address specific to the contact form so you will always automatically know it is a contact request from said website
mm.From = new MailAddress("godaddyhostedemail@domain.com");
//this is the email providers smtp address
SmtpClient smtp = new SmtpClient("relay-hosting.secureserver.net");
smtp.Port = 25;
smtp.UseDefaultCredentials = false;
smtp.EnableSsl = true;
await smtp.SendMailAsync(mm);
//this is the message displayed next to the submit button showing successful submission of of contact request
ViewData["Message"] = "Thank You. Your has been sent successfully. We will be in contact with as soon as we are available.";
}
else
{
//this is the message displayed if there is an issue submitting the form
ViewData["Message"] = "There is an issue with the Contact Form. Please contact us by phone or email.";
}
}
catch (Exception ex)
{
ViewData["Message"] = ex;
//Response.Redirect("ContactFormError");
}
}
ниже приведена модель для электронной почты. он называется Email.cs
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Threading.Tasks;
namespace YourNamespaceHere.Models
{
public class Email
{
public string To { get; set; }
public string From { get; set; }
public string Subject { get; set; }
public string Body { get; set; }
[Required(ErrorMessage ="Your first name is required."), MinLength(2), MaxLength(50), Display(Name = "First Name")]
public string FName { get; set; }
[Required(ErrorMessage = "Your last name is required."), MinLength(2), MaxLength(50), Display(Name = "Last Name")]
public string LName { get; set; }
[Required(ErrorMessage ="Your phone number is required")]
[DataType(DataType.PhoneNumber)]
[Display(Name = "Phone Number")]
[RegularExpression(@"^(?([0-9]{3}))?[-. ]?([0-9]{3})[-. ]?([0-9]{4})$", ErrorMessage = "Please enter a valid phone number. Must be all numbers no spaces or other characters.")]
public string PhoneNumber { get; set; }
[Required(ErrorMessage ="Please let us know the best time to contact you."), Display(Name = "Select the best time frame for us to contact you.")]
public string BestTimeToCall { get; set; }
[DataType(DataType.EmailAddress), Required(ErrorMessage ="A valid email address is required"), Display(Name = "Email Address")]
public string EmailAddress { get; set; }
[ Required(ErrorMessage ="Please let us know your required contact method"), Display(Name = "Select your preferred method for us to contact you.")]
public string PreferredContactMethod { get; set; }
[ Required(ErrorMessage ="Please check the box to prove you are human"), Display(Name = "Check to box to prove you are human")]
public bool Human { get; set; }
[Required(ErrorMessage ="Please let us know how we can assist you."), MinLength(4), MaxLength(500), Display(Name = "Enter your message here.")]
public string MessageBody { get; set; }
}
}