2009-04-29 7 views
0

Lorsque je tente d'envoyer en utilisant C# E-mail avec le serveur smtp de gmail, je reçois cette erreur ..Problème d'envoi par e-mail en utilisant C#

« Le certificat à distance est invalide selon la procédure de validation ».

SSL est activé

Port utilisé est 587

nom du serveur utilisé est "Smtp.gmail.com".

nom d'utilisateur et mot de passe est correct

outlook express fonctionne très bien sur le même PC avec les mêmes paramètres

Le programme C# fonctionne aussi bien dans d'autres endroits ... nous obtenons cette erreur concernant uniquement les clients lieu .

apprécierait toute aide ..

Merci

Edit: @ Andomar, Où puis-je trouver les certificats racine du client? Comment puis-je réparer ça?

@ Alnitak, Comment puis-je lancer des starttls en utilisant la bibliothèque System.Net.Mail?

@ David, Qu'est-ce que je passe en tant que paramètre pour "(expéditeur d'objet, certificat X509Certificate, chaîne X509Chain, SslPolicyErrors sslPolicyErrors)"

Merci David. J'ai ajouté ces lignes. Mais, je suis toujours confus au sujet de ce qui se passe puisque ce code n'a pas de connexion directe avec System.Net.Mail autant que je comprends. Espérons que le problème disparaîtra.

Répondre

2

Vérifiez également que les certificats racine se trouvent dans le magasin Autorité de confiance du client. Si cela provient d'un service, l'ajout des certificats racine au magasin Local Machine peut également aider. Pour obtenir une meilleure compréhension de la raison pour laquelle j'ai trouvé la politique utile ...

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

Pour ajouter la politique, utilisez ce qui suit, ce ne doit être fait une fois pour le domaine d'application.

using System.Net; 
... 
ServicePointManager.ServerCertificateValidationCallback = 
new Security.RemoteCertificateValidationCallback(ValidateServerCertificate); 

Vous pouvez également utiliser la politique pour éliminer l'erreur tout à fait, mais il serait préférable de résoudre le problème que faire.

+0

Vous n'avez besoin de rien passer dans les paramètres comme c'est un gestionnaire d'événement. Le framewrok sous-jacent le fera pour vous. Si vous lisez après le premier bloc de code, vous verrez l'appel pour le câbler. –

+0

J'ai ajouté ceci. Mais, je suis encore à tester pratiquement sur le site où le problème existe. Tout ce que je dois faire est d'ajouter ces lignes? Ou y a-t-il autre chose à faire? – Josh

+0

Vous souhaiterez peut-être le modifier pour vous connecter au journal des événements. Mais oui, j'ai développé cet extrait lors du diagnostic à distance d'un problème de certificat pour un client. Bien sûr, le problème était que le CA racine n'était pas dans le bon magasin comme l'a déclaré @Andomar, mais ce script a aidé à les convaincre. –

1

Vérifiez que les certificats racine appropriés se trouvent dans le magasin du client. Et la date du système du client est correcte.

+0

Où vérifier les certificats, etc? Je n'utilise aucun certificat en fonction de mon code C#. J'ai utilisé les classes dans System.Net.Mail – Josh

+0

SSL = certificats –

+0

Puisqu'il fonctionne ailleurs et pas le client, je parierais un dollar américain que le client ne sait pas au sujet de votre CA, ainsi vous devez installer le certificat/CA au client –

1

Utilisez-vous STARTTLS ou en supposant que la connexion sur le port 587 est cryptée SSL dès le départ?

Les serveurs de Google sur smtp.gmail.com nécessitent STARTTLS.

+0

J'utilise System.Net.Mail. Existe-t-il un moyen d'émettre STARTTLS à l'aide de System.Net.Mail? – Josh

+0

http://msdn.microsoft.com/en-us/library/system.net.mail.smtpclient.enablessl.aspx suggère que STARTTLS est la valeur par défaut si SmtpClient.EnableSsl == true – Alnitak

0

Avez-vous mis

client.EnableSsl = true; 

parce que gmail a besoin