web-dev-qa-db-fra.com

Envoi d'e-mail via le serveur SMTP Gmail avec C #

Pour une raison quelconque, ni la réponse acceptée, ni aucune autre ne fonctionne pour moi pour " Envoi d'e-mails au format .NET via Gmail ". Pourquoi ne travailleraient-ils pas?

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

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

Lorsque j'essaie le morceau de code qui utilise SmtpDeliveryMethod.Network, je reçois rapidement une exception SmtpException lors de l'envoi (message). Le message est

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. En savoir plus sur "<- sérieusement, cela se termine 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é maintes et maintes fois dans différents projets.

J'ai repris certaines idées de ce billet et d'autres projets EmailSender pour créer un projet projet EmailSender chez Codeplex . Il est conçu pour la testabilité et prend en charge mes services SMTP préférés tels que GoDaddy et Gmail.

234
CVertex

CVertex, assurez-vous de revoir votre code et, si cela ne révèle rien, publiez-le. Je ne faisais que l'activer sur un site de test ASP.NET sur lequel je travaillais, et cela fonctionne.

En fait, j'ai eu un problème avec mon code à un moment donné. Je ne l'ai pas repéré avant d'avoir une version plus simple sur un programme de console et de constater que celui-ci fonctionnait (aucun changement du côté de Gmail, ce qui vous inquiétait). Le code ci-dessous fonctionne exactement comme les exemples que vous avez mentionnés:

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("[email protected]", "mypwd"),
                EnableSsl = true
            };
            client.Send("[email protected]", "[email protected]", "test", "testbody");
            Console.WriteLine("Sent");
            Console.ReadLine();
        }
    }
}

Je l'ai également obtenu en utilisant une combinaison de web.config, http://msdn.Microsoft.com/en-us/library/w355a94k.aspx et de code (car il n'y a pas de correspondance EnableSsl dans le fichier de configuration :().

286
eglasius

CE QUI SUIT SERA SOUS PRESQUE CERTAINEMENT LA REPONSE A VOTRE QUESTION SI TOUT AUTRE A ECHOUE:

J'ai eu exactement la même erreur, il s'est avéré que le nouvel algorithme de mesure de la force du mot de passe de Google a changé: je considère que mon mot de passe actuel est trop faible et ne me dit 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 aiderait (j'ai essayé tout le reste en vain) et quand j'ai changé mon mot de passe, cela a fonctionné!

Ensuite, lors d’une expérience, j’ai tenté de rétablir mon mot de passe précédent afin de voir ce qui se produirait. Gmail ne m’a pas réellement autorisé à le faire, invoquant la raison "désolé, nous ne pouvons pas vous permettre d’enregistrer ce changement sous le nom de votre choix." mot de passe est trop faible "et ne me laisserait pas revenir à mon ancien mot de passe. Je pensais à partir de cela que c'était une erreur car soit a) vous devez changer votre mot de passe une fois tous les x mois ou b). Comme je l'ai dit précédemment, leurs algorithmes de force de mot de passe ont changé et par conséquent, le mot de passe faible que j'avais n'avait pas été accepté, même s'ils ne disaient rien à ce sujet lorsqu'ils essayaient de se connecter PARTOUT! Ceci (numéro 2) est le scénario le plus probable, mon mot de passe faible datant d’environ 4 mois et il m’a permis de l’utiliser dans Gmail.

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

J'espère que ça aide!

67
Erx_VB.NExT.Coder

En plus des autres étapes de dépannage ci-dessus, j'aimerais également ajouter que si vous avez activé l'authentification à deux facteurs (également appelée 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, consultez la page suivante: https://www.google.com/settings/ et choisissez Autoriser les applications et les sites à générer le mot de passe.

65
John Rasch
Turn On Access For Less Secure Apps and it will work for all no need to change password.

Lien vers les paramètres Gmail

enter image description here

51
Suhail Mumtaz Awan

J'ai eu quelques problèmes pour envoyer des courriels à partir de mon compte gmail également, en raison de plusieurs des situations susmentionnées. Voici un résumé de la façon dont je l'ai fait fonctionner, tout en restant flexible:

  • Tout d’abord, configurez votre compte GMail:
    • Activer IMAP et affirmer le bon nombre maximum de messages (vous pouvez le faire ici)
    • Assurez-vous que votre mot de passe est d'au moins 7 caractères et qu'il est fort (selon Google).
    • Assurez-vous de ne pas avoir à saisir d'abord un code captcha. Vous pouvez le faire en envoyant un email de test depuis votre navigateur.
  • Apportez des modifications dans web.config (ou app.config, je ne l'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="[email protected]" deliveryMethod="Network">
                <network 
                    defaultCredentials="false" 
                    Host="smtp.gmail.com" 
                    port="587" 
                    password="stR0ngPassW0rd" 
                    userName="[email protected]"
                    />
                <!-- 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 emails, vous n'avez qu'à 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("[email protected]")
    SSLMail.SendMail(e)
End Sub

End Class

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

SSLMail.SendMail(New system.Net.Mail.MailMessage("[email protected]","[email protected]", "Subject", "Body"})

J'espère que cela aide tous ceux qui rencontrent ce post! (J'ai utilisé VB.NET mais je pense qu'il est trivial de le convertir en n'importe quel langage .NET.)

29
Sebas

Oh ... C'est incroyable ... D'abord, je n'ai pas pu envoyer de courrier électronique pour quelque raison que ce soit. Mais après avoir changé la séquence de ces deux lignes comme ci-dessous, cela fonctionne parfaitement.

//(1)
client.UseDefaultCredentials = true;
//(2)
client.Credentials = new System.Net.NetworkCredential("[email protected]", "password");

J'espère que cette aide !!! :)

13
Wirol
Dim SMTPClientObj As New Net.Mail.SmtpClient
SMTPClientObj.UseDefaultCredentials = False
SMTPClientObj.Credentials = New System.Net.NetworkCredential("[email protected]", "mypwd")
SMTPClientObj.Host = "smtp.gmail.com"
SMTPClientObj.Port = 587
SMTPClientObj.EnableSsl = True
SMTPClientObj.Send("[email protected]","[email protected]","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 la suivante: 5.5.1 Authentification requise. En savoir plus sur" comme je l'ai avant, assurez-vous 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 de la manière opposée et le 5.5.1 erreur d'authentification requise est retourné.

13
Terry Chng

Quelques étapes simples pour résoudre ce problème:

1) Connectez-vous à votre compte Gmail

2) Accédez à cette page https://www.google.com/settings/security/lesssecureapps & défini sur "Activer"

10
Kevin

J'avais le même problème, mais il s'est avéré que ma protection antivirus bloquait le courrier indésirable sortant. Désactiver cette option m'a permis d'utiliser le port 587 pour envoyer un courrier électronique SMTP via GMail

9
user464329

Le problème n’est pas la capacité technique d’envoyer des messages via gmail. Cela fonctionne dans la plupart des situations. Si vous ne parvenez pas à envoyer une machine, cela est généralement dû au fait que la machine n’a pas été authentifiée au moins une fois par un utilisateur.

Le problème auquel la plupart des utilisateurs sont confrontés est que Google décide de modifier les limites sortantes à tout moment. Vous devez toujours ajouter du code défensif à votre solution. Si vous commencez à voir des erreurs, quittez votre vitesse d’envoi et arrêtez simplement d’envoyer pour un moment. Si vous continuez à essayer d'envoyer, Google ajoutera parfois du temps supplémentaire à votre délai avant que vous puissiez envoyer à nouveau.

Ce que j'ai fait dans mon système actuel est d'envoyer avec un délai de 1,5 seconde entre chaque message. Ensuite, si je reçois des erreurs, arrêtez-vous pendant 5 minutes puis recommencez. Cela fonctionne généralement et vous permettra d’envoyer jusqu’à la limite du compte (la dernière fois que j’ai vérifié que c’était 2 000 connexions quotidiennes par client).

9
Jason Short

Je ne sais pas quelle version .NET est requise pour cela, car eglasius a mentionné qu'il n'y avait pas de paramètre correspondant enableSsl (j'utilise .NET 4.0, mais je pense que cela fonctionne dans .NET 2.0 ou version ultérieure), mais cette configuration a fonctionné pour moi (et ne nécessite aucune configuration programmatique):

<system.net>
  <mailSettings>
    <smtp from="[email protected]" deliveryMethod="Network">
      <network defaultCredentials="false" enableSsl="true" Host="smtp.gmail.com" port="587" password="password" userName="[email protected]"/>
    </smtp>
  </mailSettings>
</system.net>

Vous devrez peut-être d'abord activer POP ou IMAP sur votre compte Gmail: https://mail.google.com/mail/?shva=1#settings/fwdandpop

Je recommande de l'essayer d'abord avec un client de messagerie normal ...

8
Wiebe Tijsma

Si rien d’autre n’a fonctionné ici pour vous, vous devrez peut-être autoriser l’accès à votre compte gmail à partir d’applications tierces. C'était mon problème. Pour autoriser l'accès, procédez comme suit:

  1. Connectez-vous à votre compte gmail.
  2. Visitez cette page https://accounts.google.com/DisplayUnlockCaptcha et cliquez sur le bouton pour autoriser l'accès.
  3. Visitez cette page https://www.google.com/settings/security/lesssecureapps et activez l'accès aux applications moins sécurisées.

Cela a fonctionné pour moi espérons que cela fonctionne pour quelqu'un d'autre!

8
Celt

J'utilisais une connexion VPN d'entreprise. C'était la raison pour laquelle je ne pouvais pas envoyer d'email à partir de mon application. Cela fonctionne si je me déconnecte du VPN.

6
Ned

@Andres Pompiglio: Oui, vous devez changer votre mot de passe au moins une fois. Ce code fonctionne très bien:

//Satrt Send Email Function
public string SendMail(string toList, string from, string ccList,
    string subject, string body)
{

    MailMessage message = new MailMessage();
    SmtpClient smtpClient = new SmtpClient();
    string msg = string.Empty;
    try
    {
        MailAddress fromAddress = new MailAddress(from);
        message.From = fromAddress;
        message.To.Add(toList);
        if (ccList != null && ccList != string.Empty)
            message.CC.Add(ccList);
        message.Subject = subject;
        message.IsBodyHtml = true;
        message.Body = body;
        // We use gmail as our smtp client
        smtpClient.Host = "smtp.gmail.com";   
        smtpClient.Port = 587;
        smtpClient.EnableSsl = true;
        smtpClient.UseDefaultCredentials = true;
        smtpClient.Credentials = new System.Net.NetworkCredential(
            "Your Gmail User Name", "Your Gmail Password");

        smtpClient.Send(message);
        msg = "Successful<BR>";
    }
    catch (Exception ex)
    {
        msg = ex.Message;
    }
    return msg;
}
//End Send Email Function

ET vous pouvez appeler la fonction en utilisant:

Response.Write(SendMail(recipient Address, "[email protected]", "ccList if any", "subject", "body"))
6
maxcoder

J'ai eu la même erreur et aucune des solutions ci-dessus n'a aidé.

Mon problème était que j'exécutais le code à partir d'un serveur distant, qui n'avait jamais été utilisé pour se connecter au compte gmail.

J'ai ouvert un navigateur sur le serveur distant et me suis connecté à gmail à partir de là. Il a posé une question de sécurité pour vérifier que c'était bien moi puisqu'il s'agissait d'un nouvel emplacement. Après avoir effectué le contrôle de sécurité, j'ai pu m'authentifier avec un code.

5
Vlad Tamas

J'ai également constaté que le compte que j'avais l'habitude de me connecter avait été désactivé par Google pour une raison quelconque. Une fois que j'ai réinitialisé mon mot de passe (comme il l'était auparavant), j'ai pu envoyer des courriels sans problème. Je recevais un message 5.5.1 également.

5
RKL

Activez des applications moins sécurisées pour votre compte: https://www.google.com/settings/security/lesssecureapps

5
Burak Kalkan

J'avais aussi essayé plusieurs solutions mais fais quelques changements ça marchera

Host = smtp.gmail.com
port = 587
username = [email protected]
password = password
enabledssl = true

avec smtpclient les paramètres ci-dessus fonctionnent dans gmail

5
Suresh

Encore une autre solution possible pour vous. J'avais des problèmes similaires pour me connecter à gmail via IMAP. Après avoir essayé toutes les solutions que j’ai trouvées et que vous allez lire ici et ailleurs sur SO (par exemple, activez IMAP, activez un accès moins sécurisé à votre courrier en utilisant https: // comptes. google.com/b/0/displayunlockcaptcha et cetera), j’ai de nouveau créé un nouveau compte gmail.

Lors de mon test initial, le premier compte Gmail que j'avais créé, je m'étais connecté à mon compte gmail principal. Cela s'est traduit par un comportement erratique où le compte incorrect a été référencé par Google. Par exemple, l'exécution de https://accounts.google.com/b/0/displayunlockcaptcha a ouvert mon compte principal plutôt que celui que j'avais créé à cette fin.

Donc, lorsque j'ai créé un nouveau compte et que je ne l'ai pas connecté à mon compte principal, après avoir suivi toutes les étapes appropriées décrites ci-dessus, j'ai constaté que cela fonctionnait bien!

Je ne l'ai pas encore confirmé (c'est-à-dire reproduit), mais apparemment, il l'a fait pour moi ... j'espère que cela aidera.

4
sinewave440hz

J'ai rencontré cette même erreur ("Le serveur SMTP nécessite une connexion sécurisée ou le client n'était pas authentifié. La réponse du serveur était: 5.5.1 Authentification requise. En savoir plus sur") et j'ai découvert que je utilisait le mauvais mot de passe. J'ai corrigé les informations d'identification de connexion et l'envoi a été correct.

Je sais que c'est tard, mais peut-être que cela aidera quelqu'un d'autre.

4
Albert Bori
  1. Commencez par vérifier les paramètres de votre compte Gmail et activez-le dans "Accéder à des applications moins sécurisées" enter image description here

Nous vous recommandons vivement d'utiliser une application sécurisée, telle que Gmail, pour accéder à votre compte. Toutes les applications de Google répondent à ces normes de sécurité. En revanche, utiliser une application moins sécurisée pourrait rendre votre compte vulnérable. Apprendre encore plus.

  1. Ensemble

    smtp.UseDefaultCredentials = false;
    

    avant

    smtp.Credentials = new NetworkCredential(fromAddress, fromPassword);
    
4
reza.cse08

Une autre chose que j'ai trouvée est que vous devez changer votre mot de passe au moins une fois. Et essayez d'utiliser un mot de passe de niveau sécurisé (n'utilisez pas le même utilisateur que mot de passe, 123456, etc.)

4
Andres Pompiglio

J'ai eu ce problème résolu. Ce message est utilisé dans plusieurs types d'erreur. Mon problème était que j'avais atteint mon maximum de 500 courriers envoyés.

connectez-vous au compte et essayez manuellement d’envoyer un courrier. Si la limite est atteinte, il vous informera

3
Ayson Baxter

Vous pouvez également vous connecter via le port 465, mais en raison de certaines limitations de l'espace de noms System.Net.Mail, vous devrez peut-être modifier votre code. Cela est dû au fait que l'espace de noms n'offre pas la possibilité d'établir des connexions SSL implicites. Ceci est discuté à la page http://blogs.msdn.com/b/webdav_101/archive/2008/06/02/system-net-mail-with-ssl-to-authenticate-against-port-465. aspx , et j'ai fourni un exemple d'utilisation de CDO (Collaborative Data Object) dans une autre discussion ( erreurs GMail SMTP via C # .Net sur tous les ports ).

3
Bryan Allred

Une ou plusieurs raisons sont là pour ces erreurs.

  • Connectez-vous avec votre compte Gmail (ou tout autre si) dans votre système local.

  • Vérifiez également que l’application est moins sécurisée et réglez-la sur "Activer". Voici le lien pour GMAIL. https://www.google.com/settings/security/lesssecureapps

  • recherchez EnableSsl dans votre code de messagerie et définissez-le sur true.

    smtp.EnableSsl = true;
    
  • Vérifiez également quel port utilisez-vous actuellement. 25 est global, mais vous pouvez aussi le vérifier pour d'autres, comme 587. Vérifiez ici. Est-ce que toutes les communications SMTP ont lieu à plus de 25 ans?

  • SI VOUS ÊTES SUR LA TÉLÉCOMMANDE : Vérifiez la réponse de Vlad Tamas ci-dessus.

2
Bharat
smtp.Host = "smtp.gmail.com"; //Host name
smtp.Port = 587; //port number
smtp.EnableSsl = true; //whether your smtp server requires SSL
smtp.DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network;
smtp.Credentials = new NetworkCredential(fromAddress, fromPassword);
smtp.Timeout = 20000;
2
somesh

Changez votre mot de passe Gmail et réessayez. Cela devrait fonctionner par la suite.

Je ne sais pas pourquoi, mais chaque fois que vous modifiez votre hébergement, vous devez changer votre mot de passe.

1
Jo Smo

Si la vérification en deux étapes vous permet de renforcer votre compte Gmail, vous devrez générer un mot de passe pour l'application. https://support.google.com/accounts/answer/185833?p=app_passwords_sa&hl=fr&visit_id=636903322072234863-1319515789&rd=1 Sélectionnez Comment générer une option de mot de passe de l'application et suivez les étapes fournies. Copiez et collez le mot de passe de l'application généré quelque part car vous ne pourrez pas le récupérer après avoir cliqué sur DONE.

0
Faith Nassiwa