2009-04-29 9 views
0

Wenn ich versuche, E-Mail unter Verwendung von C# mit gmail der SMTP-Server zu senden, erhalte ich diesen Fehler ..Problem Senden von E-Mail mit C#

"Das Remote-Zertifikat ungültig ist nach den Validierungsverfahren".

SSL

Port aktiviert verwendet 587

Servername verwendet wird, ist "Smtp.gmail.com" ist.

Benutzername und das Passwort korrekt ist

Outlook Express funktioniert auf dem gleichen PC mit den gleichen Einstellungen

Das C# Programm auch in anderen Orten funktioniert gut ... wir diese Fehler nur an dem Ort Kunden .

jede Hilfe zu schätzen wissen ..

Dank

Edit: @ Andomar, Wo finde ich die Root-Zertifikate auf dem Client? Wie behebe ich das?

@ Alnitak, Wie gebe ich stuttls mit System.Net.Mail-Bibliothek obwohl?

@ David, Was gebe ich als Parameter für "(object sender, X509Certificate Zertifikat, X509Chain Kette, SslPolicyErrors sslPolicyErrors)"

Dank David. Ich habe diese Zeilen hinzugefügt. Aber, ich bin immer noch verwirrt darüber, was los ist, da dieser Code keine direkte Verbindung mit System.Net.Mail soweit mein Verständnis hat.Hoffe das Problem verschwindet.

Antwort

2

Überprüfen Sie auch, ob sich die Stammzertifikate im vertrauenswürdigen Stammdatenspeicher des Clients befinden. Wenn dies von einem Dienst stammt, kann das Hinzufügen der Stammzertifikate zum lokalen Computerspeicher ebenfalls hilfreich sein. Um ein besseres Verständnis des Grundes zu erhalten dann habe ich die folgende Richtlinie hilfreich ...

public bool ValidateServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) 
{ 
// No errors so continue… 
if (sslPolicyErrors == SslPolicyErrors.None) 
     return true; 

// I’m just logging it to a label on the page, 
// this should be stored or logged to the event log at this time. 
lblStuff.Text += string.Format("Certificate error: {0} <BR/>", sslPolicyErrors); 

// If the error is a Certificate Chain error then the problem is 
// with the certificate chain so we need to investigate the chain 
// status for further info. Further debug capturing could be done if 
// required using the other attributes of the chain. 
     if (sslPolicyErrors == SslPolicyErrors.RemoteCertificateChainErrors) 
     { 
     foreach (X509ChainStatus status in chain.ChainStatus) 
     { 
      lblStuff.Text += string.Format("Chain error: {0}: {1} <BR/>", status.Status, status.StatusInformation); 
    } 
} 

// Do not allow this client to communicate 
//with unauthenticated servers. 
     return false; 
} 

Um die Richtlinie in hinzuzufügen, verwenden Sie die folgenden, dies muss nur getan werden, wenn für die Anwendungsdomäne.

Sie können die Richtlinie auch verwenden, um den Fehler vollständig zu entfernen, aber es wäre besser, das Problem als das zu beheben.

+0

Sie müssen nichts übergeben in den Parametern, da es ein Event-Handler ist. Der zugrunde liegende Framewrok wird das für Sie tun. Wenn Sie über den ersten Codeblock hinauslesen, sehen Sie den Anruf für die Verkabelung. –

+0

Ich habe dies hinzugefügt. Aber ich muss es noch praktisch an der Stelle testen, an der das Problem besteht. Alles, was ich tun muss, ist nur diese Zeilen hinzufügen? oder Gibt es noch etwas zu tun? – Josh

+0

Möglicherweise möchten Sie es ändern, um im Ereignisprotokoll zu protokollieren. Aber ja, ich habe dieses Snippet entwickelt, als ich ein Zertifikat für einen Kunden remote diagnostizierte. Natürlich war das Problem, dass das Root CA-Zertifikat im falschen Laden war, wie @Andomar sagte, aber dieses Skript half ihnen zu überzeugen. –

1

Überprüfen Sie, ob sich die richtigen Stammzertifikate im Speicher des Clients befinden. Und das Systemdatum des Kunden ist korrekt.

+0

Wo Zertifikate usw. zu überprüfen? Ich verwende keine Zertifikate nach meinem C# -Code. Ich habe die Klassen in System verwendet.Net.Mail – Josh

+0

SSL = Zertifikate –

+0

Da es anderswo arbeitet und nicht der Client, würde ich einen US-Dollar setzen, dass der Client nicht über Ihre CA wissen, so müssen Sie das Zertifikat/CA auf dem Client installieren –

1

Verwenden Sie STARTTLS oder gehen Sie davon aus, dass die Verbindung auf Port 587 von Anfang an SSL-verschlüsselt ist?

Googles Server unter smtp.gmail.com erfordern STARTTLS.

+0

Ich benutze System.Net.Mail. Gibt es eine Möglichkeit, STARTTLS mit System.Net.Mail auszugeben? – Josh

+0

http://msdn.microsoft.com/en-us/library/system.net.mail.smtpclient.enablessl.aspx schlägt vor, dass STARTTLS der Standardwert ist, wenn SmtpClient.EnableSsl == true – Alnitak

0

Haben Sie setzen

client.EnableSsl = true; 

weil gmail braucht es