2010-02-09 6 views
1

J'essaie d'envoyer un e-mail depuis mon site Web à l'aide du protocole SMTP. Je reçois une erreur quand je le fais. Je l'ai testé localement en utilisant mon serveur smtp ISPs et cela a très bien fonctionné. Maintenant que je suis sur le web, ce n'est pas le cas. Je ne suis pas sûr que l'erreur que je reçois est autre alors cela ne fonctionne pas et j'obtiens le message d'erreur que j'ai programmé dans le site. Vous pouvez voir mon code ci-dessous. J'ai essayé deux ou trois serveurs différents sans aucune chance. Je sais que le login/mot de passe est bon car je l'ai vérifié. Mon hébergeur est winhost mais mon email passe par gmail. Donc, j'ai mis en place un compte sur godaddy qui permet 250 relais.Erreur lors de l'envoi d'un e-mail via SMTP sur ASP.NET MVC

public class EmailMeController : Controller 
{ 
    // 
    // GET: /EmailMe/ 

    [AcceptVerbs(HttpVerbs.Get)] 
    public ActionResult Index() 
    { 
     return View(); 
    } 

    [AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult Index(EmailModel emailModel) 
    { 
     if (ModelState.IsValid) 
     { 
      bool isOk = false; 
      try 
      { 
       MailMessage msg = new MailMessage(); 
       msg.From = new MailAddress("[email protected]", "Website Contact Form"); 
       msg.To.Add("[email protected]"); 
       msg.Subject = emailModel.Subject; 
       string body = "Name: " + emailModel.Name + "\n" 
          + "Email: " + emailModel.EmailAddress + "\n" 
          + "Website: " + emailModel.WebSite + "\n" 
          + "Phone: " + emailModel.Phone + "\n\n" 
          + emailModel.Message; 

       msg.Body = body; 
       msg.IsBodyHtml = false; 

       SmtpClient smtp = new SmtpClient("smtp.secureserver.net", 80); 
       NetworkCredential Credentials = new NetworkCredential("[email protected]", "password"); 
       smtp.Credentials = Credentials; 

       smtp.Send(msg); 

       msg.Dispose(); 

       isOk = true; 

       MessageModel rcpt = new MessageModel(); 
       rcpt.Title = "Thank You"; 
       rcpt.Content = "Your email has been sent."; 
       return View("Message", rcpt); 
      } 
      catch (Exception ex) 
      { 
      } 

      // If we are here...something kicked us into the exception. 
      // 
      MessageModel err = new MessageModel(); 
      err.Title = "Email Error"; 
      err.Content = "The website is having an issue with sending email at this time. Sorry for the inconvenience. My email address is provided on the about page."; 
      return View("Message", err); 
     } 
     else 
     { 
      return View(); 
     } 
    } 


} 

http://pastebin.com/m400a9aa4

+3

Aucun message d'erreur probable signifie aucune réponse. Débarrassez-vous de cette "capture" vide maintenant et remplacez-la par au moins une sorte de journalisation; De cette façon, vous saurez quelle était l'erreur. – Aaronaught

+0

Je ne sais pas comment enregistrer l'erreur. Aussi, je l'ai testé encore ce matin en utilisant le même code à la fois localement sur Cassini et à distance sur le serveur live. cela fonctionne localement, mais ne fonctionne pas à distance. Rien ne change, y compris les informations SMTP. –

+0

J'ai été en mesure d'obtenir l'erreur, il était assez long (plus long alors ce qui rentrerait dans la boîte, donc je l'ai copié/collé ici: drop.io/xsvslel/asset/error-log –

Répondre

1

La solution au problème était la suivante. J'ai fini par utiliser winhosts SMTP. Mon email est hébergé sur google. Je ne pouvais pas envoyer à une adresse e-mail qui appartenait au même domaine que ma société d'hébergement, car elle recherchait d'abord l'adresse e-mail. Quand il ne l'a pas trouvé, il a erré. Au lieu de cela, j'ai dû envoyer l'e-mail à mon compte Gmail, qui a ensuite été envoyé à mon adresse openskymedia basé sur l'adresse de retour et un certain texte dans l'e-mail. C'est un peu compliqué mais ça a marché. Le code ci-dessous a été en mesure de travailler pour moi d'envoyer un e-mail à partir du formulaire et fonctionne très bien.

public ActionResult Index(EmailModel emailModel) 
     { 
      if (ModelState.IsValid) 
      { 
       bool isOk = false; 
       try 
       { 
        MailMessage msg = new MailMessage(); 
        msg.From = new MailAddress("[email protected]", "Website Contact Form"); 
        msg.To.Add("[email protected]"); 
        msg.Subject = emailModel.Subject; 
        string body = "Name: " + emailModel.Name + "\n" 
           + "Email: " + emailModel.EmailAddress + "\n" 
           + "Website: " + emailModel.WebSite + "\n" 
           + "Phone: " + emailModel.Phone + "\n\n" 
           + emailModel.Message; 

        msg.Body = body; 
        msg.IsBodyHtml = false; 

        SmtpClient smtp = new SmtpClient("your.server.com"); 
        NetworkCredential Credentials = new NetworkCredential("[email protected]", "password"); 
        smtp.Credentials = Credentials; 

        smtp.Send(msg); 

        msg.Dispose(); 

        isOk = true; 

        MessageModel rcpt = new MessageModel(); 
        rcpt.Title = "Thank You"; 
        rcpt.Content = "Your email has been sent."; 
        return View("Message", rcpt); 
       } 
       catch (Exception ex) 
       { 
        //while (ex != null) 
        //{ 
        // Response.Write("<HR>" + ex.ToString()); 
        // ex = ex.InnerException; 
        //} 

       } 

       // If we are here...something kicked us into the exception. 
       // 
       MessageModel err = new MessageModel(); 
       err.Title = "Email Error"; 
       err.Content = "The website is having an issue with sending email at this time. Sorry for the inconvenience. My email address is provided on the about page."; 
       return View("Message", err); 
      } 
      else 
      { 
       return View(); 
      } 
     } 
2

vous avalez vos exceptions. Dans ce bloc catch:

61.    catch (Exception ex) 
62.    { 
63.    } 

Il suffit d'écrire l'erreur:

Response.Write(ex.ToString()) 

Aussi, assurez-vous de boucle à travers toutes les exceptions internes comme:

while(ex != null){ 
Response.Write("<HR>" + ex.ToString()); 
ex = ex.InnerException; 
} 
+0

J'ai été en mesure d'obtenir l'erreur , il était assez long (plus long que ce qui rentrerait dans la boîte, alors je l'ai copié/collé ici: http://drop.io/xsvslel/asset/error-log –

+0

Merci à votre conseil, j'ai été en mesure d'obtenir le problème –

+0

Ok, cela aide un peu.En bout de ligne, votre application n'a pas accès à l'espace de noms System.Net.Mail.Vous devez lui donner des permissions.Je ne sais pas assez sur votre configuration , mais voici un lien google pour vous aider à démarrer: http://www.google.com/search?hl=fr&rls=GGLF%2CGGLF%3A1969-53%2CGGLF%3Afr&q=Request+pour+la+permission+ de + type + System.Net.Mail.SmtpPermission + a échoué & btnG = Recherche & aq = f & aqi = & oq = –

0

En plus de faire ce que Dave est vous dire, avez-vous essayé d'utiliser l'iis local comme serveur smtp? Vous pouvez le faire dans le fichier web.config, dans la section system.net.

<system.net> 
    <mailSettings> 
     <smtp from="[email protected]"> 
      <network host="localhost" /> 
     </smtp> 
    </mailSettings> 
</system.net> 
+0

winhost bloque que fu nctionality donc ce n'est pas une option. –