2013-06-24 2 views
2

(POUR ALLER A FINI RESULTAT EDIT/EDIT EN BAS)ASP.net Razor - Envoi de messages électroniques à partir d'un site Web en utilisant GMail SMTP

Comme l'indique le titre, je suis en train d'envoyer un e-mail à partir d'un site Web en utilisant GMail SMTP comme décrit dans le tutoriel ASP.net ici: http://www.asp.net/web-pages/tutorials/email-and-search/11-adding-email-to-your-web-site. Après la résolution d'une erreur de mappage de gestionnaire ISAPI.dll, il n'y a plus d'erreurs dans la console d'erreur Webmatrix, mais seulement des marqueurs de succès pour les actions 'GET' et 'POST'; cependant, la page Web renvoie l'erreur d'erreur try, "l'e-mail n'a pas été envoyé ...."

Dans le Gestionnaire SQL Server j'ai essayé de voir si le serveur et le rôle administrateur sont configurés pour le courrier mais je peux ' Je vois les propriétés de l'agent, je comprends que j'ai l'édition Express de SQL Management Studio. Cela dit, s'il y avait un problème avec le rôle du serveur ou les paramètres de messagerie, un message d'erreur serait sûrement généré?

Quelqu'un peut-il s'il vous plaît être assez aimable pour jeter un coup d'oeil sur les paramètres SMTP et le code général s'il vous plaît pour des erreurs ou des suggestions?

(Soit dit en passant, j'ai changé mon adresse e-mail et mot de passe dans le code exemple. Mon adresse e-mail a été répété pour webmail.username et webmail.from)

Merci.

Voici EmailRequest.cshtml

 @{ 

    } 

    <!DOCTYPE html> 
    <html> 
    <head> 
     <title>Request for Assistance</title> 
    </head> 
    <body> 
     <h2>Submit Email Request for Assistance</h2> 
     <form method="post" action="ProcessRequest.cshtml"> 
     <div> 
      Your name: 
      <input type="text" name="customerName" /> 
     </div> 

     <div> 
      Your email address: 
      <input type="text" name="customerEmail" /> 
     </div> 

     <div> 
      Details about your problem: <br /> 
      <textarea name="customerRequest" cols="45" rows="4"></textarea> 
     </div> 

     <div> 
      <input type="submit" value="Submit" /> 
     </div> 
     </form> 
    </body> 
    </html> 

**Here is ProcessRequest.cshtml** 

     @{ 
     var customerName = Request["customerName"]; 
     var customerEmail = Request["customerEmail"]; 
     var customerRequest = Request["customerRequest"]; 
     var errorMessage = "true"; 
     var debuggingFlag = false; 
     try { 
      // Initialize WebMail helper 
      WebMail.SmtpServer = "smtp.gmail.com"; 
      WebMail.EnableSsl = true; 
      WebMail.SmtpPort = 465; 
      WebMail.UserName = "MY EMAIL ADDRESS.com"; 
      WebMail.Password = "MYPASSWORD"; 
      WebMail.From = "MY EMAIL ADDRESS.com"; 

      // Send email 
      WebMail.Send(to: customerEmail, 
       subject: "Help request from - " + customerName, 
       body: customerRequest 
      ); 
     } 
     catch (Exception ex) { 
      errorMessage = ex.Message; 
     } 
    } 
    <!DOCTYPE html> 
    <html> 
    <head> 
     <title>Request for Assistance</title> 
    </head> 
    <body> 
     <p>Sorry to hear that you are having trouble, <b>@customerName</b>.</p> 
     @if(errorMessage == ""){ 
      <p>An email message has been sent to our customer service 
      department regarding the following problem:</p> 
      <p><b>@customerRequest</b></p> 
     } 
     else{ 
      <p><b>The email was <em>not</em> sent.</b></p> 
      <p>Please check that the code in the ProcessRequest page has 
       correct settings for the SMTP server name, a user name, 
       a password, and a "from" address. 
      </p> 
      if(debuggingFlag){ 
       <p>The following error was reported:</p> 
       <p><em>@errorMessage</em></p> 
      } 
     } 
    </body> 
    </html> 
____________________________________________________ 

EDIT:

Merci pour l'aide et Mike Gokhan. Ce matin, j'ai pris un autre regard en détail. Effectivement, deux emails ont été envoyés depuis la page web hier soir; donc, à un moment donné tous les facteurs étaient corrects.

J'avais essayé les ports 25, 465 et 587, mais, je suivais le tutoriel et 'pas le code'. Le tutoriel est un peu trompeur à mon avis et a causé la confusion - je cherchais un email dans la mauvaise boîte de réception. On pourrait penser qu'il est normal qu'un rapport de problème soit envoyé à l'hôte et non à l'utilisateur signalant le problème.

En outre, les erreurs de détection d'essai étaient toujours visibles même si l'e-mail était envoyé. Sûrement le message d'erreur devrait être activé en faisant une erreur. Le message d'erreur semble apparaître uniquement si [var errorMessage = "true";] est défini sur true.

Qu'est-ce qui me manque? Quelqu'un peut-il s'il vous plaît expliquer comment fonctionne cette méthode tutoriel try try?

De toute façon, tout fonctionne - je trouve toujours les commentaires de Mike rassurants. J'ai obtenu le code à une page en utilisant un autre tutoriel et j'ai ajouté une forme de validation, puis j'ai modifié le code afin que l'e-mail soit envoyé à l'hôte et non à l'utilisateur.

Voici la nouvelle demande d'e-mail.cshtml:

@{ 

    Layout = "/_SiteLayout.cshtml"; 
    Page.Title = "Compare"; 

    Validation.RequireField("emailAddress", "customerName is required."); 
    Validation.RequireField("emailSubject", "customerEmail is required."); 
    Validation.RequireField("emailBody", "customerRequest is required."); 

     var message = ""; 
     var companyname = Request.Form["emailAddress"]; 
     var contactname = Request.Form["emailSubject"]; 
     var employeecount = Request.Form["emailBody"]; 


    try{ 
     if (IsPost && Validation.IsValid()) { 

     // Send email 
     WebMail.Send(to:"ADMIN-EMAIL-ADDRESS.COM", 
      subject: Request.Form["emailSubject"], 

      body: "Help request from - " + Request.Form["customerName"] + " - " + "Email Subject - " + Request.Form["emailSubject"] + " - " + "Customer email - " + Request.Form["emailAddress"] 
      ); 
      message = "Email sent!"; 
     } 
    } 
    catch(Exception ex){ 
     message = "Email could not be sent!"; 
    } 
} 
<!DOCTYPE html> 
<html lang="en"> 
    <head> 
    <meta charset="utf-8" /> 
    <title>Test Email</title> 

       <style type="text/css"> 
      .validation-summary-errors {font-weight:bold; color:red; font-size: 11pt;} 
      .validation-summary-valid { 
    display: none; 
} 

     </style> 

    </head> 
    <body> 
    <h1>Test Email</h1> 
    <form method="post"> 
     @Html.ValidationSummary("Errors with your submission:") 

     <p> 
     <label for="customerName">Name:</label> 
     <input type="text" name="customerName" value="@Request.Form["customerName"]" /> 


     </p> 

     <p> 
     <label for="emailAddress">Email address:</label> 
     <input type="text" name="emailAddress" value="@Request.Form["emailAddress"]" /> 


     </p> 
     <p> 
     <label for="emailSubject">Subject:</label> 
     <input type="text" name="emailSubject" value="@Request.Form["emailSubject"]" /> 

     </p> 
     <p> 
     <label for="emailBody">Text to send:</label><br/> 
     <textarea name="emailBody" rows="6"></textarea> 

     </p> 
    <p><input type="submit" value="Send!" /></p> 
    @if(IsPost){ 
     <p>@message</p> 
    } 
    </form> 
    </body> 
</html> 

Enfin, est ici le code _AppStart pour aller avec l'exemple que je n'ai pas posté hier:

@{ 
     WebSecurity.InitializeDatabaseConnection("StarterSite", "UserProfile", "UserId", "Email", true); 

     // WebMail.SmtpServer = "mailserver.example.com"; 
     // WebMail.UserName = "[email protected]"; 
     // WebMail.Password = "your-password"; 
     // WebMail.From = "[email protected]"; 
     // WebMail.EnableSsl = true; (add this if smtp is encrypted) 
     // WebMail.SmtpPort = 587; 
    } 

EDIT/EDIT

J'avais difficulté à conserver les données/valeur dans la zone textarea après soumettre ainsi que la validation de la zone textarea. Plus de recherche m'a rappelé l'attribut «requis» qui, dans ce cas, fait les deux et fournit également une astuce d'outil soignée.

Par conséquent, j'ai supprimé le code précédent qui a conservé les valeurs de zone de texte et validé le formulaire et utilisé l'attribut "required" à la place - beaucoup plus net.

En outre, le code de traitement et le message de réussite sont désormais intégrés dans la page de demande d'e-mail, de sorte que la page ProcessRequest.cshtml n'est plus requise.

Voici le code d'un formulaire de contact qui envoie une requête à une adresse e-mail statique. N'oubliez pas que vous devez utiliser le code de page _AppStart, sauf si vous ajoutez l'authentification du serveur mail dans la page. Je n'ai pas besoin des deux. Mais, sachez qu'il n'est pas sûr d'ajouter les paramètres de messagerie du serveur dans la page, car les utilisateurs pourront les voir. Je recommande d'utiliser la page _AppStart comme les fichiers qui commencent par un trait de soulignement dans Asp.net Razor ne peuvent pas être consultés en ligne.

@{ 

    Layout = "/_SiteLayout.cshtml"; 
    Page.Title = "Compare"; 

    var message = ""; 
    var companyname = Request.Form["emailAddress"]; 
    var contactname = Request.Form["emailSubject"]; 
    var employeecount = Request.Form["emailBody"]; 


    try{ 
     if (IsPost && Validation.IsValid()) { 

     // Send email 
     WebMail.Send(to:"ADMIN EMAIL.COM", 
      subject: Request.Form["emailSubject"], 

      body: "Help request from - " + Request.Form["customerName"] + " - " + "Email Subject - " + Request.Form["emailSubject"] + " - " + "Customer email - " + Request.Form["emailAddress"] 
      ); 
      message = "Email sent!"; 
     } 
    } 
    catch(Exception ex){ 
     message = "Email could not be sent!"; 
    } 
} 
<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="utf-8" /> 
    <title>Test Email</title> 


</head> 

    <body> 
    <h1>Test Email</h1> 

    <form method="post"> 

     <p> 
     <label for="customerName">Name:</label> 
     <input type="text" name="customerName" required /> 
     </p> 

     <p> 
     <label for="emailAddress">Email address:</label> 
     <input type="text" name="emailAddress" required /> 
     </p> 
     <p> 
     <label for="emailSubject">Subject:</label> 
     <input type="text" name="emailSubject" required /> 

     </p> 

     <p> 
     <label for="emailBody">Text to send:</label><br/> 
     <textarea name="emailBody" rows="6" required></textarea> 
     </p> 

    <p><input type="submit" value="Send!" /></p> 
    @if(IsPost){ 
     <p>@message</p> 
    } 
    </form> 
    </body> 
</html> 
+0

Votre code ci-dessus devrait fonctionner correctement. Il suffit de changer le port SMTP à 587. –

Répondre

2

J'ai écrit le code pour un projet longtemps auparavant. Essaye ça.

public void SendEmail(string from, string to, string subject, string body) 
{ 
    string host = "smtp.gmail.com"; 
    int port = 587; 

    MailMessage msg = new MailMessage(from, to, subject, body); 
    SmtpClient smtp = new SmtpClient(host, port); 

    string username = "[email protected]"; 
    string password = "1234567890"; 

    smtp.Credentials = new NetworkCredential(username, password); 
    smtp.EnableSsl = true; 
    smtp.UseDefaultCredentials = false; 

    try 
    {  
     smtp.Send(msg); 
    } 
    catch (Exception exp) 
    { 
     //Log if any errors occur 
    } 
} 
+0

Merci pour la réponse. Je vais essayer votre code le matin lorsque j'allumerai à nouveau mon PC et je vous ferai savoir comment je m'entends. – DaniB

0

Si vous voulez riche les corps de courrier électronique avec un rasoir, vous pouvez utiliser Mailzory. En outre, vous pouvez télécharger le package nuget à partir du here. L'utilisation est simple:

// template path 
var viewPath = Path.Combine("Views/Emails", "hello.cshtml"); 
// read the content of template and pass it to the Email constructor 
var template = File.ReadAllText(viewPath); 

var email = new Email(template); 

// set ViewBag properties 
email.ViewBag.Name = "Johnny"; 
email.ViewBag.Content = "Mailzory Is Funny"; 

// send email 
var task = email.SendAsync("[email protected]", "subject"); 
task.Wait() 
Questions connexes