44 votes

La classe c# SmtpClient ne peut pas envoyer d'email avec gmail.

J'ai des difficultés à envoyer des e-mails avec mon compte Gmail. Je m'arrache les cheveux.

Les mêmes paramètres fonctionnent bien dans Thunderbird.

Voici le code. J'ai aussi essayé le port 465 sans succès.

SmtpClient ss = new SmtpClient("smtp.gmail.com", 587);
ss.Credentials = new NetworkCredential("username", "pass");
ss.EnableSsl = true;
ss.Timeout = 10000;
ss.DeliveryMethod = SmtpDeliveryMethod.Network;
ss.UseDefaultCredentials = false;

MailMessage mm = new MailMessage("donotreply@domain.com", "destination@domain.com", "subject here", "my body");
mm.BodyEncoding = UTF8Encoding.UTF8;
mm.DeliveryNotificationOptions = DeliveryNotificationOptions.OnFailure;
ss.Send(mm);

Voici l'erreur

"Le serveur SMTP requiert une connexion sécurisée ou le client n'a pas été authentifié. La réponse du serveur était : 5.5.1 Authentification requise. Pour en savoir plus, consultez le site "

Voici la trace de la pile

   at System.Net.Mail.MailCommand.CheckResponse(SmtpStatusCode statusCode, String response)
   at System.Net.Mail.MailCommand.Send(SmtpConnection conn, Byte[] command, String from)
   at System.Net.Mail.SmtpTransport.SendMail(MailAddress sender, MailAddressCollection recipients, String deliveryNotify, SmtpFailedRecipientException& exception)
   at System.Net.Mail.SmtpClient.Send(MailMessage message)
   at email_example.Program.Main(String[] args) in C:\Users\Vince\Documents\Visual Studio 2008\Projects\email example\email example\Program.cs:line 23
   at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
   at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
   at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
   at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Threading.ThreadHelper.ThreadStart()

61voto

Vince Panuccio Points 5766

Vous ne croirez pas ce qui a résolu mon problème.

La propriété Credentials

ss.Credentials = new NetworkCredential("username", "pass");

doit être déclaré après

ss.UseDefaultCredentials = false;

Le code final est donc le suivant

SmtpClient ss = new SmtpClient("smtp.gmail.com", 587);
ss.EnableSsl = true;
ss.Timeout = 10000;
ss.DeliveryMethod = SmtpDeliveryMethod.Network;
ss.UseDefaultCredentials = false;
ss.Credentials = new NetworkCredential("username", "pass");

MailMessage mm = new MailMessage("donotreply@domain.com", "destination@domain.com", "subject here", "my body");
mm.BodyEncoding = UTF8Encoding.UTF8;
mm.DeliveryNotificationOptions = DeliveryNotificationOptions.OnFailure;
ss.Send(mm);

Est-ce un bug ?

5voto

Bdiem Points 536

Stackoverflow a dit avant

Dans votre cas, cela signifie que vous devez l'envoyer avec l'adresse électronique avec laquelle vous vous êtes connecté à Google.

Stackoverflow dit aussi

Alors peut-être qu'il y a un pare-feu qui interfère avec la connexion. Je rencontre ce problème en ce moment même en testant votre code. Essayez le test TELNET suggéré.

3voto

Husein Musawa Points 31

Essayez Higlabo system.net.smtp.smtpclient http://higlabo.codeplex.com . Cela fonctionne pour moi. Je peux envoyer du courrier en utilisant smtp.gmail.com:465 en utilisant ssl. Je me demande pourquoi très peu de gens sont au courant.

2voto

karabara Points 187

Cela ne fonctionne pour moi qu'avec le port 25.

1voto

Mark Olschesky Points 51

Cette méthode fonctionne, mais elle n'est pas très performante. Consultez client.SendAsync : http://msdn.microsoft.com/en-us/library/x5x13z6h.aspx

Un exemple de cas d'utilisation :

 var message = new MailMessage("from", "to", "subject", "body");
 var client = new SmtpClient("smtp.gmail.com", 587)
            {
                Credentials = new NetworkCredential("login", "password"),
                EnableSsl = true
            };
            client.SendCompleted += (s, e) =>
            {
                client.Dispose();
                message.Dispose();
            };
            client.SendAsync(message, null);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X