2012-03-30 4 views
0

Ich habe eine ASP.NET 4.0-Webanwendung, mit der das HR-Team Umfragen an Mitarbeiter versendet. Da wir Google Apps verwenden, versuche ich diese Umfrage-E-Mails über das Google Apps-Konto zu senden.E-Mail mit System.Net.Mail über Google Apps Zeitüberschreitung

Ich habe die folgenden Einstellungen verwendet, um E-Mails zu versenden.

Host - smtp.gmail.com 
Port - 587 
EnableSsl=true 

zusammen mit meinem Benutzernamen und Passwort.

Dies ist der Code zum Versenden von E-Mails.

using (SmtpClient smtp = new SmtpClient()) 
       { 
        smtp.Timeout = 0; 
        smtp.Send(message); 
       } 

Die Einstellungen sind in der web.config und werden von dort gelesen.

Nun meine Frage ..

Das hr-Team mehrere Benutzer wählt, um die Umfrage zu senden. Sie konnten einfach 1 oder bis zu 100 gleichzeitig auswählen, um Umfragen zu versenden. Da jeder Umfrage-Link anders sein muss, wiederhole ich die Liste der Benutzer und maile sie.

Jetzt nach der Anwendung senden Sie maximal 12 E-Mails, es hört auf, mehr zu senden. Die nächste E-Mail, die es zu senden versucht, löst einen Fehler aus.

Message = The operation has timed out. 
Status Code =GeneralFailure 
Stack Trace = at System.Net.Mail.SmtpClient.Send(MailMessage message) 
    at ABC.Business.Mail.SendMail(MailMessage message, String& errorMessage) 

dann ab, wenn ich wieder versuchen ein Fehler wirft

Message = Failure sending mail. 
Status Code =GeneralFailure 
Stack Trace = at System.Net.Mail.SmtpClient.Send(MailMessage message) 
    at ABC.Business.Mail.SendMail(MailMessage message, String& errorMessage) 

Wenn seine zu diesem Zustand kommen, der einzige Ausweg ist IIS retart. Wenn ich IIS neu starte, funktioniert es wieder gut für die nächsten 12 ungeraden.

Was könnte das Problem sein? Bitte helfen Sie.

Antwort

1

Sie sollten das Timeout nicht auf Null setzen.

Sein Standardwert ist 100.000mS (100 Sekunden), versuchen Sie es mindestens zu lassen.

+0

Ich dachte, ein Timeout = 0 bedeutet, unendlich zu warten? Liege ich falsch? –

0

Chris, TimeOut lässt ASP.NET-Anwendung warten, bis die Anforderung ausgeführt wird, bevor es automatisch heruntergefahren wird. Wenn Sie also timeOut als Null angeben, wartet ASP.NET nicht auf die Ausführung der Anforderung, und es wird ein Fehler ausgegeben, da die Operation abgelaufen ist.

TimeOut sollte mindestens 180 Sekunden betragen.

Danke.

1

System.Net.Mail unterstützt nur "Explizite SSL".

Explicit SSL

System.Net.Mail unterstützt nur "Explicit SSL". Explizites SSL wird unverschlüsselt an Port 25 gestartet, gibt dann ein STARTDLS aus und wechselt zu einer verschlüsselten Verbindung. Siehe RFC 2228.

Explicit SLL wäre so etwas wie gehen: Verbinden Sie auf 25 -> StartTLS (beginnt zu verschlüsseln) -> authenticate -> Daten senden

Wenn der SMTP-Server direkt SSL/TLS-Verbindung erwartet von Anfang an dann wird das nicht funktionieren.

Implicit SSL

Es gibt keine Möglichkeit Implizite Verwendung von SSL (SMTPS) mit System.Net.Mail. Bei implizitem SSL wäre die gesamte Verbindung in eine SSL-Schicht eingebettet. Ein bestimmter Port würde verwendet werden (Port 465 ist üblich). Es gibt keinen formellen RFC, der Implizites SSL abdeckt.

Implizite SLL etwas gehen würde wie: SSL starten (Start-Verschlüsselung) -> Verbinden -> Authentifizieren -> Daten senden

Dies ist kein Fehler betrachtet wird, ist es ein Feature-Request. Es gibt zwei Arten von SSL-Authentifizierung für SMTP, und wir unterstützen nur eine (von Design) - Explizite SSL.

Demo-Code:

*

protected void Btn_SendMail_Click(object sender, EventArgs e) 
{ 
     try 
     { 
      var fromAddress = "[email protected]"; 
      var toAddress = "[email protected]"; 
      const string fromPassword = "xxxxxxxx"; 
      string subject = "Sending Demonstration"; 
      string body = "From: " + txtFrom.Text + "\n";    
      var smtp = new System.Net.Mail.SmtpClient(); 
      { 
       smtp.Host = "smtp.gmail.com"; 
       smtp.Port = 25; 
       smtp.EnableSsl = true; 
       smtp.Credentials = new NetworkCredential(fromAddress, fromPassword); 
      } 
      smtp.Send(fromAddress, toAddress, subject, body); 
      Response.Write("<script language=javascript> alert('send')</script>"); 
     } 
     catch (Exception ex) 
     {    
      txtBody.Text = ex.Message; 
     } 
    } 

*

Dieser Kodex ohne Fehler Arbeitet !!!!

Verwandte Themen