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



smtp class c# (18)

  1. Commencez par vérifier les paramètres de votre compte Gmail et activez l'option "Accès aux applications moins sécurisées".

Nous vous recommandons fortement d'utiliser une application sécurisée, telle que Gmail, pour accéder à votre compte. Toutes les applications réalisées par Google répondent à ces normes de sécurité. D'un autre côté, 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);
    

https://src-bin.com

Pour une raison ou une autre, ni la réponse acceptée ni aucune autre ne fonctionne pour moi pour " Envoyer un email dans .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 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 SmtpException sur Send (message). Le message est

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. En savoir plus sur "<- sérieusement, ça s'arrête là.

METTRE À JOUR:

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

J'ai pris quelques idées dans ce post et d'autres projets EmailSender pour créer un 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.


Answer #1

@Andres Pompiglio: Oui c'est vrai, 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 faire un appel à la fonction en utilisant:

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

Answer #2

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 ça fonctionne.

En fait, à un moment donné, j'ai eu un problème avec mon code. Je ne l'ai pas repéré jusqu'à ce que j'aie une version plus simple sur un programme de console et ai vu qu'il fonctionnait (aucun changement du côté de Gmail car vous étiez inquiété au sujet de). Le code ci-dessous fonctionne exactement comme les exemples auxquels vous avez fait 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("[email protected]", "mypwd"),
                EnableSsl = true
            };
            client.Send("[email protected]", "[email protected]", "test", "testbody");
            Console.WriteLine("Sent");
            Console.ReadLine();
        }
    }
}

Je l'ai également fait fonctionner en utilisant une combinaison de web.config, http://msdn.microsoft.com/en-us/library/w355a94k.aspx et de code (parce qu'il n'y a aucun EnableSsl correspondant dans le fichier de configuration :().


Answer #3

Changez votre mot de passe Gmail et essayez à nouveau, cela devrait fonctionner après cela.

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


Answer #4

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

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


Answer #5

Encore une autre solution possible pour vous. J'avais des problèmes similaires à se connecter à Gmail via IMAP. Après avoir essayé toutes les solutions que j'ai trouvées que vous lirez ici et ailleurs sur SO (par exemple activer IMAP, activer un accès moins sécurisé à votre courrier, en utilisant https://accounts.google.com/b/0/displayunlockcaptcha et ainsi de suite), je mets en place un nouveau compte Gmail une fois de plus.

Dans mon test d'origine, le premier compte Gmail que j'avais créé, je m'étais connecté à mon compte Gmail principal. Cela a abouti à un comportement erratique où le mauvais compte a été référencé par google. Par exemple, l'exécution de https://accounts.google.com/b/0/displayunlockcaptcha ouvert mon compte principal plutôt que celui que j'avais créé à cet effet.

Donc quand 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 comme ci-dessus, j'ai trouvé que ça marchait bien!

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


Answer #6

J'ai également essayé de nombreuses solutions, mais faire des changements cela fonctionnera

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

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


Answer #7

J'ai aussi eu quelques problèmes pour envoyer des emails depuis mon compte Gmail, qui étaient dus à plusieurs des situations mentionnées ci-dessus. Voici un résumé de comment je l'ai fait fonctionner, et en le gardant flexible en même temps:

  • Tout d'abord, configurez votre compte GMail:
    • Activer IMAP et affirmer le nombre maximal de messages (vous pouvez le faire ici)
    • Assurez-vous que votre mot de passe compte au moins 7 caractères et qu'il est fort (selon Google)
    • Assurez-vous de ne pas avoir à entrer un code captcha en premier. Vous pouvez le faire en envoyant un e-mail 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, quand vous voulez envoyer des emails, tout ce que vous avez à faire est 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("[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 courent dans ce post! (J'ai utilisé VB.NET mais je pense qu'il est trivial de le convertir en n'importe quel langage .NET.)


Answer #8

J'ai eu le même problème, mais il s'est avéré que ma protection antivirus bloquait le courrier électronique «spam» sortant. La désactivation m'a permis d'utiliser le port 587 pour envoyer des emails SMTP via GMail


Answer #9

J'ai rencontré cette même erreur ( "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" ) et découvert que j'utilisais le mauvais mot de passe. J'ai corrigé les informations d'identification de connexion, et il a envoyé correctement.

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


Answer #10

Je ne suis pas sûr que la version .NET est nécessaire pour cela car eglasius a mentionné qu'il n'y a pas de paramètre enableSsl correspondant (j'utilise .NET 4.0, mais je suppose que cela fonctionne dans .NET 2.0 ou version ultérieure), mais cette configuration a fonctionné pour moi (et ne vous oblige pas à utiliser une 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 avec un client mail normal en premier ...


Answer #11

Je recevais la même erreur et aucune des solutions ci-dessus n'a aidé.

Mon problème était que je courais 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 connecté à Gmail à partir de là. Il a demandé une question de sécurité pour vérifier que c'était moi puisqu'il s'agissait d'un nouvel emplacement. Après avoir vérifié la sécurité, j'ai pu m'authentifier via le code.


Answer #12

Le problème n'est pas celui de la capacité technique à envoyer via Gmail. Cela fonctionne pour 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 avec un humain au contrôle au moins une fois.

Le problème auquel la plupart des utilisateurs sont confrontés est que Google décide de modifier les limites sortantes tout le temps. Vous devriez 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 pendant un moment. Si vous continuez à envoyer des messages, Google ajoutera parfois un délai supplémentaire à votre délai avant de pouvoir 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 j'ai 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é, il était de 2.000 pour les connexions client par jour).


Answer #13

Oh ... C'est incroyable ... D'abord je ne pouvais pas envoyer un email pour une raison quelconque. 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 !!! :)


Answer #14

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 le mot de passe, 123456, etc.)


Answer #15

Une ou plusieurs raisons sont là pour ces erreurs.

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

  • Vérifiez également pour moins sécurisé App et réglez-le sur "Allumer" ici est le lien pour GMAIL. google.com/settings/security/lesssecureapps

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

    smtp.EnableSsl = true;
    
  • Vérifiez également quel port utilisez-vous actuellement? 25 est Global, mais vous pouvez le vérifier pour d'autres comme 587. Cochez ici. Toutes les communications SMTP se produisent-elles plus de 25?

  • SI VOUS ÊTES À DISTANCE : Vérifiez la réponse de Vlad Tamas ci-dessus.


Answer #16
  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;

Answer #17
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 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 En savoir plus sur "Comme je l'ai déjà fait, assurez-vous que la ligne SMTPClientObj.UseDefaultCredentials = False inclus et cette ligne doit avant SMTPClientObj.Credentials .

J'ai essayé d'inverser ces 2 lignes dans le sens inverse et l' erreur 5.5.1 Authentication Required est retournée.





gmail