У меня проблема с контактной формой. Работает на локальном хостинге. При развертывании выдает ошибку при попытке опубликовать ее с помощью кнопки отправки

#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; }
    }
}