255 votes

Envoyer des e-mails via le serveur SMTP de Gmail avec C#

Pour une raison quelconque, ni la réponse acceptée ni aucune autre ne fonctionne pour moi pour " Envoyer des e-mails en .NET via Gmail ". Pourquoi ne fonctionneraient-ils pas ?

MISE À JOUR : J'ai essayé toutes les réponses (acceptées et autres) dans l'autre question, mais aucune ne fonctionne.

Je voudrais juste savoir si cela fonctionne pour quelqu'un d'autre, sinon Google a peut-être changé quelque chose (ce qui est déjà arrivé).

Quand j'essaie le morceau de code qui utilise SmtpDeliveryMethod.Network je reçois rapidement une SmtpException sur Send(message). Le message est

Le serveur SMTP exige une connexion sécurisée ou le client n'a pas été authentifié.

La réponse du serveur était :

5.5.1 Authentification requise. En savoir plus à" <-- sérieusement, ça s'arrête là.

UPDATE :

C'est une question que j'ai posée il y a longtemps, et la réponse acceptée est un code que j'ai utilisé de très nombreuses fois sur différents projets.

J'ai repris certaines des idées de cet article et d'autres projets EmailSender pour créer un système de gestion de l'information. Projet EmailSender chez Codeplex . Il est conçu pour être testé et prend en charge mes services SMTP préférés tels que GoDaddy et Gmail.

0 votes

J'ai essayé de le faire en utilisant des méthodes similaires dans une autre langue. J'ai rencontré le même type de problème : les anciennes méthodes documentées qui fonctionnaient auparavant n'ont pas fonctionné pour moi. Vous vous demandez donc si Google a changé quelque chose, ou si vous avez fait quelque chose de mal.

3 votes

@aaronls le seul changement récent semble être lié au port 465. J'ai essayé en cherchant une solution (je travaillais justement sur la même chose), et le port 465 dépasse tout le temps. Si c'est votre cas, essayez avec le port 587.

2 votes

Ce problème est dû à la "vérification des mots" (captcha). Si vous vous connectez manuellement via l'interface web et que vous remplissez le captcha, votre SMTP commencera à fonctionner.

305voto

eglasius Points 26221

CVertex, assurez-vous de revoir votre code, et, si cela ne révèle rien, postez-le. Je viens d'activer cette fonction sur un site ASP.NET de test sur lequel je travaille, et cela fonctionne.

En fait, à un moment donné, j'ai eu un problème avec mon code. Je ne l'ai pas repéré avant d'avoir une version plus simple dans un programme console et j'ai vu qu'il fonctionnait (pas de changement du côté de Gmail comme vous le craigniez). Le code ci-dessous fonctionne exactement comme les échantillons auxquels vous faites référence :

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Mail;
using System.Net;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            var client = new SmtpClient("smtp.gmail.com", 587)
            {
                Credentials = new NetworkCredential("myusername@gmail.com", "mypwd"),
                EnableSsl = true
            };
            client.Send("myusername@gmail.com", "myusername@gmail.com", "test", "testbody");
            Console.WriteLine("Sent");
            Console.ReadLine();
        }
    }
}

J'ai également réussi à le faire fonctionner en utilisant une combinaison de web.config, http://msdn.microsoft.com/en-us/library/w355a94k.aspx et le code (parce qu'il n'y a pas de correspondance EnableSsl dans le fichier de configuration :( ).

Mise à jour de 2021

Par défaut, vous devez également activer l'accès aux "applications moins sécurisées" dans votre page de paramètres gmail : google.com/settings/security/lesssecureapps. Ceci est nécessaire si vous obtenez l'exception "``La réponse du serveur était : 5.5.1 Authentification requise. - Merci à @Ravendarksky

1 votes

Cela a fonctionné brillamment pour moi dans une application winforms en C#. Merci, Freddy.

14 votes

Rappelez-vous que ce genre de code transmet effectivement vos informations d'identification gmail en texte clair à l'utilisateur...

3 votes

Il y a en fait un paramètre correspondant pour enableSsl dans le web.config, voir la réponse ci-dessous

75voto

Erx_VB.NExT.Coder Points 2299

LES ÉLÉMENTS SUIVANTS EST PRESQUE CERTAINEMENT LA RÉPONSE À VOTRE QUESTION SI TOUT LE RESTE A ÉCHOUÉ :

J'ai eu exactement la même erreur, il s'avère que le nouvel algorithme de mesure de la force des mots de passe de Google a changé, considérant mon mot de passe actuel comme trop faible, et ne me disant rien à ce sujet (pas même un message ou un avertissement)... Comment ai-je découvert cela ? Eh bien, j'ai choisi de changer mon mot de passe pour voir si cela pouvait m'aider (j'ai tout essayé en vain) et lorsque j'ai changé mon mot de passe, cela a fonctionné !

Puis, à titre expérimental, j'ai essayé de rétablir mon ancien mot de passe pour voir ce qui se passerait, et Gmail ne m'a pas autorisé à le faire, invoquant la raison suivante : "Désolé, nous ne pouvons pas vous permettre d'enregistrer cette modification car le mot de passe que vous avez choisi est trop faible" et ne m'a pas laissé revenir à mon ancien mot de passe. J'en ai déduit qu'il y avait une erreur parce que soit a) vous devez changer votre mot de passe une fois tous les x mois, soit b). Comme je l'ai déjà dit, leurs algorithmes de résistance des mots de passe ont changé et, par conséquent, le mot de passe faible que j'avais n'a pas été accepté, même s'ils n'ont rien dit à ce sujet lorsque j'ai essayé de me connecter N'IMPORTE OÙ ! Ce scénario (numéro 2) est le plus probable, car mon mot de passe faible datait d'environ 4 mois, et j'ai pu l'utiliser dans Gmail.

C'est dommage qu'ils n'aient rien dit à ce sujet, mais c'est logique. Parce que la plupart des emails détournés sont connectés à l'aide d'un logiciel en dehors de Gmail, et je suppose que vous devez avoir un mot de passe plus fort si vous voulez utiliser Gmail en dehors de l'environnement Gmail.

3 votes

Merci, comme vous le dites, changez le mot de passe pour qu'il soit fort et tout fonctionnera bien.

2 votes

C'était exactement mon problème - toutes les autres suggestions concernaient la configuration, mais ma configuration était correcte depuis le début, mais je continuais à obtenir l'erreur. Le changement de mot de passe a fait toute la différence,

1 votes

Merci, j'ai finalement pu résoudre ce problème, Mon cas était en fait encore plus compliqué, j'étais capable d'envoyer des emails depuis ma machine de développement (qui est en Géorgie, Caucase), mais les emails échouaient depuis les serveurs de production (Royaume-Uni) Après avoir changé le mot de passe pour un mot de passe complexe tout fonctionne maintenant :)

72voto

John Rasch Points 28874

En plus des autres étapes de dépannage ci-dessus, je voudrais également ajouter que si vous avez activé l'authentification à deux facteurs (également connue sous le nom de vérification en deux étapes ) sur votre compte GMail, vous doit générer un mot de passe spécifique à l'application et utiliser ce mot de passe nouvellement généré pour s'authentifier via SMTP. .

Pour en créer un, rendez-vous sur le site : https://www.google.com/settings/ et choisissez Autoriser les applications et les sites pour générer le mot de passe.

2 votes

Je n'avais pas activé la vérification en deux étapes et j'avais beau sécuriser le mot de passe, c'était la seule façon de résoudre mon problème. J'ai pu utiliser d'autres comptes gmail sans vérification en deux étapes et avec des mots de passe plus faibles sans problème... pour utiliser le compte que je voulais vraiment utiliser, j'ai dû activer la vérification en deux étapes et utiliser un mot de passe spécifique à l'application.

1 votes

Exactement ce que je fais, mais toujours la même erreur :-/ Il agit comme si mon mot de passe n'était pas assez fort, mais j'utilise le mot de passe de l'application que Gmail m'a donné ! !!

0 votes

Je ne vois pas d'option de ce type. Vous pouvez peut-être partager le lien vers cette option ?

32voto

Sebas Points 121

J'ai également eu quelques problèmes pour envoyer des e-mails à partir de mon compte gmail, qui étaient dus à plusieurs des situations susmentionnées. Voici un résumé de la façon dont j'ai réussi à le faire fonctionner, tout en le gardant flexible :

  • Tout d'abord, configurez votre compte GMail :
    • Activez IMAP et affirmez le bon nombre maximum de messages. (vous pouvez le faire ici)
    • Assurez-vous que votre mot de passe comporte au moins 7 caractères et qu'il est fort (selon Google).
    • Assurez-vous que vous n'avez pas à entrer un code captcha au préalable. Vous pouvez le faire en envoyant un courriel de test à partir de votre navigateur.
  • Faites des changements dans web.config (ou app.config, je n'ai pas encore essayé mais je suppose qu'il est tout aussi facile de le faire fonctionner dans une application Windows) :

    <configuration> <appSettings> <add key="EnableSSLOnMail" value="True"/>
    </appSettings>

    <!-- other settings --> 
    
    ...
    
    <!-- system.net settings -->
    <system.net>
        <mailSettings>
            <smtp from="yourusername@gmail.com" deliveryMethod="Network">
                <network 
                    defaultCredentials="false" 
                    host="smtp.gmail.com" 
                    port="587" 
                    password="stR0ngPassW0rd" 
                    userName="yourusername@gmail.com"
                    />
                <!-- When using .Net 4.0 (or later) add attribute: enableSsl="true" and you're all set-->
            </smtp>
        </mailSettings>
    </system.net>

    </configuration>

    Add a Class to your project:

    Imports System.Net.Mail

    Public Class SSLMail

    Public Shared Sub SendMail(ByVal e As System.Web.UI.WebControls.MailMessageEventArgs)
    
        GetSmtpClient.Send(e.Message)
    
        'Since the message is sent here, set cancel=true so the original SmtpClient will not try to send the message too:
        e.Cancel = True
    
    End Sub
    
    Public Shared Sub SendMail(ByVal Msg As MailMessage)
        GetSmtpClient.Send(Msg)
    End Sub
    
    Public Shared Function GetSmtpClient() As SmtpClient
    
        Dim smtp As New Net.Mail.SmtpClient
        'Read EnableSSL setting from web.config
        smtp.EnableSsl = CBool(ConfigurationManager.AppSettings("EnableSSLOnMail"))
        Return smtp
    End Function

    End Class

Et maintenant, chaque fois que vous voulez envoyer des e-mails, il suffit d'appeler SSLMail.SendMail :

par exemple, dans une page avec un contrôle PasswordRecovery :

Partial Class RecoverPassword
Inherits System.Web.UI.Page

Protected Sub RecoverPwd_SendingMail(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.MailMessageEventArgs) Handles RecoverPwd.SendingMail
    e.Message.Bcc.Add("webmaster@example.com")
    SSLMail.SendMail(e)
End Sub

End Class

Ou n'importe où dans votre code que vous pouvez appeler :

SSLMail.SendMail(New system.Net.Mail.MailMessage("from@from.com","to@to.com", "Subject", "Body"})

J'espère que cela aidera toute personne qui rencontrera ce message ! (J'ai utilisé VB.NET mais je pense qu'il est trivial de le convertir en n'importe quel langage .NET).

0 votes

+1 "enableSsl="true" - cela fonctionne pour une ancienne application qui ne définit pas spécifiquement la propriété Smtp.enableSsl sans recompiler les assemblages. Excellente astuce !

0 votes

Et n'oubliez pas le pare-feu. Le port 587 n'est pas un port habituel à ouvrir.

13voto

Terry Chng Points 41
Dim SMTPClientObj As New Net.Mail.SmtpClient
SMTPClientObj.UseDefaultCredentials = False
SMTPClientObj.Credentials = New System.Net.NetworkCredential("myusername@gmail.com", "mypwd")
SMTPClientObj.Host = "smtp.gmail.com"
SMTPClientObj.Port = 587
SMTPClientObj.EnableSsl = True
SMTPClientObj.Send("myusername@gmail.com","yourusername@gmail.com","test","testbody")

Si vous obtenez une erreur du type "Le serveur SMTP nécessite une connexion sécurisée ou le client n'a pas été authentifié. La réponse du serveur était : 5.5.1 Authentification requise. Learn more at", comme c'est le cas ici, vérifiez que la ligne SMTPClientObj.UseDefaultCredentials = False inclus et cette ligne doit précéder le SMTPClientObj.Credentials .

J'ai essayé de commuter ces 2 lignes dans le sens inverse et la 5.5.1 Erreur d'authentification requise retourné.

0 votes

C'est exactement ce qui m'est arrivé. Qui aurait cru que l'ordre de définition des propriétés pouvait arranger ou briser des choses !

0 votes

C'était le problème pour moi aussi, j'ai changé l'ordre comme suggéré et ça marche bien - les maux de tête, ugh !

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