Envoyer un 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 " L'envoi de courrier électronique dans .net par Gmail ". Pourquoi ne seraient-ils pas de travail?
mise à JOUR: j'ai essayé toutes les réponses (acceptée ou non) dans l'autre question, mais aucune de ces travaux.
je voudrais juste savoir si cela fonctionne pour quelqu'un d'autre, sinon Google peut avoir changé quelque chose (qui s'est produit avant).
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 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" <-- au sérieux, il s'arrête là.
Mise à 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é à plusieurs reprises sur différents projets.
j'ai pris certaines des idées dans ce post et d'autres projets EmailSender pour créer un projet EmailSender à Codeplex . Il est conçu pour tester et prend en charge mes services SMTP préférés tels que GoDaddy et Gmail.
27 réponses
CVertex, assurez-vous de revoir votre code, et, si cela ne révèle rien, postez-le. J'autorisais juste ça pour un test. ASP.NET site sur lequel je travaillais, et ça marche.
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'ai eu une version plus simple sur un programme de console et j'ai vu que ça marchait (aucun changement du côté de Gmail car vous étiez inquiet). Le code ci-dessous fonctionne exactement comme les échantillons 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("myusername@gmail.com", "mypwd"),
EnableSsl = true
};
client.Send("myusername@gmail.com", "myusername@gmail.com", "test", "testbody");
Console.WriteLine("Sent");
Console.ReadLine();
}
}
}
Je l'ai aussi fait fonctionner en utilisant une combinaison de web.config, http://msdn.microsoft.com/en-us/library/w355a94k.aspx et code (parce qu'il n'y a pas de correspondance EnableSsl
dans le fichier de configuration :( ).
THE FOLLOWING WILL ALMOST CERTAINLY BE THE ANSWER TO YOUR QUESTION IF ALL ELSE HAS FAILED :
j'ai eu exactement la même erreur, il s'avère que le nouvel algorithme de mesure strenggh de mot de passe de Google a changé en considérant mon mot de passe actuel comme trop faible, et en ne me disant rien à ce sujet (même pas un message ou un avertissement)... Comment ai-je découvrir? Eh bien, j'ai choisi de changer mon mot de passe pour voir si cela peut aider (essayé tout le reste en vain) et quand j'ai changé mon mot de passe, ça a marché!
alors, pour une expérience, j'ai essayé de changer mon mot de passe de nouveau à mon mot de passe précédent pour voir ce qui se passerait, et Gmail ne m'a pas réellement permis de le faire, citant la raison "Désolé, nous ne pouvons pas vous permettre de sauvegarder ce changement que votre mot de passe choisi est trop faible" et ne me laisserait pas revenir à mon ancien mot de passe. J'ai pensé que c'était erroring arrière, soit parce que a) vous avez besoin de changer votre mot de passe une fois tous les x nombre de mois ou b). comme je l'ai déjà dit, leurs algorithmes de puissance de mot de passe ont changé et donc le mot de passe faible que j'avais n'a pas été accepté, même s'ils n'ont rien dit à ce sujet en essayant de se connecter N'importe où! Ce (numéro 2) est le scénario le plus probable, car mon mot de passe faible avait environ 4 mois, et il m'a permis de l'utiliser dans Gmail.
c'est assez mauvais qu'ils n'aient rien dit à ce sujet, mais ça a du sens. Parce que la plupart des emails détournés sont connecté en utilisant un logiciel en dehors de gmail, et je devine que vous êtes tenu d'avoir un mot de passe plus fort si vous voulez utiliser Gmail en dehors de L'environnement Gmail.
j'espère que cela aide!
en plus des autres étapes de dépannage ci-dessus, je voudrais aussi ajouter que si vous avez activé l'authentification à deux facteurs (également connu 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 nouveau mot de passe généré pour authentifier via SMTP .
pour en créer un, visitez: https://www.google.com/settings / et choisir autorisation des applications et des sites pour générer le mot de passe.
Turn On Access For Less Secure Apps and it will work for all no need to change password.
j'ai eu quelques problèmes en envoyant des e-mails de mon compte gmail aussi, qui étaient dus à plusieurs des situations mentionnées ci-dessus. Voici un résumé de la façon dont je l'ai fait fonctionner, et le garder flexible en même temps:
- tout d'abord configurer votre compte GMail:
- activer IMAP et affirmer le nombre maximum de messages (vous pouvez le faire ici)
- assurez-vous que votre mot de passe est à moins de 7 caractères et est fort (selon Google)
- assurez-vous que vous n'avez pas à entrer un code captcha en premier. Vous pouvez le faire en envoyant un e-mail de test depuis votre navigateur.
- faire des changements dans le web.config (ou de l'application.config, je n'ai pas encore essayé cela, mais je suppose que c'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 quand vous voulez envoyer des e-mails tout ce que vous devez faire est d'appeler SSLMail.SendMail
:
p.ex. 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 vous pouvez appeler:
SSLMail.SendMail(New system.Net.Mail.MailMessage("from@from.com","to@to.com", "Subject", "Body"})
j'espère que cela aide quelqu'un qui s'exécute dans ce post! (J'ai utilisé VB.NET mais je pense que c'est trivial de le convertir à n'importe quelle langue.net.)
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 comme "le serveur SMTP nécessite une connexion sécurisée ou le client n'a pas été authentifié. La réponse du serveur a été: 5.5.1 Authentification requise. En savoir plus à" comme je reçois avant cela, assurez-vous que la ligne SMTPClientObj.UseDefaultCredentials = False
inclus et cette ligne devrait avant le SMTPClientObj.Credentials
.
j'ai essayé de changer ces 2 lignes de la façon opposée et le 5.5.1 authentification requis erreur retourné.
oh ... c'est incroyable... D'abord, je ne pouvais pas envoyer d'e-mail pour n'importe quelle raison. Mais après j'ai changé la séquence de ces deux lignes comme ci-dessous, il fonctionne parfaitement.
//(1)
client.UseDefaultCredentials = true;
//(2)
client.Credentials = new System.Net.NetworkCredential("username@gmail.com", "password");
Espérons que cette aide!!! :)
le problème n'est pas un problème de capacité technique à envoyer par gmail. Qui fonctionne pour la plupart des situations. Si vous ne pouvez pas obtenir une machine à envoyer, il est généralement dû à la machine n'ayant pas été authentifié avec un humain aux commandes au moins une fois.
le problème auquel la plupart des utilisateurs sont confrontés est que Google décide de changer les limites de sortie tout le temps. Vous devez toujours ajouter du code de défense à votre solution. Si vous voyez des erreurs, descendez de votre vitesse d'envoi et de juste arrêter d'envoyer pendant un certain temps. Si vous continuez à essayer D'envoyer Google va parfois ajouter du temps 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 pendant 5 minutes et recommencez. Cela fonctionne habituellement et vous permettra d'envoyer jusqu'aux limites du compte (la dernière fois que j'ai vérifié il était de 2000 pour les connexions de premier client par jour).
j'ai eu le même problème, mais il s'est avéré être ma protection de virus bloquait" spam " e-mail sortant. Désactiver cela m'a permis d'utiliser le port 587 pour envoyer des emails SMTP via GMail
étapes Simples pour résoudre ce problème:
1)Connectez-vous à votre Gmail
2)Accédez à cette page https://www.google.com/settings/security/lesssecureapps et à "allumer"
Je ne sais pas quelle version .NET est nécessaire pour cela parce qu'eglasius a mentionné qu'il n'y a pas de paramètre enableSsl
correspondant (j'utilise .NET 4.0, mais je soupçonne qu'il fonctionne dans .NET 2.0 ou plus tard), mais cette configuration a fonctionné pour moi (et ne vous oblige pas à utiliser une configuration programmée):
<system.net>
<mailSettings>
<smtp from="myusername@gmail.com" deliveryMethod="Network">
<network defaultCredentials="false" enableSsl="true" host="smtp.gmail.com" port="587" password="password" userName="myusername@gmail.com"/>
</smtp>
</mailSettings>
</system.net>
vous pourriez avoir à activer POP ou IMAP sur votre compte Gmail en premier: https://mail.google.com/mail/?shva=1#settings/fwdandpop
je recommande de l'essayer avec un client mail normal d'abord...
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 permettre l'accès, faites ce qui suit:
- connectez-vous à votre compte gmail.
- visitez cette page https://accounts.google.com/DisplayUnlockCaptcha et cliquez sur le bouton pour autoriser l'accès.
- visitez cette page https://www.google.com/settings/security/lesssecureapps et d'activer l'accès pour les applications moins sécurisées.
cela a fonctionné pour moi espérons que cela fonctionne pour quelqu'un d'autre!
@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 faire un appel à la fonction en utilisant:
Response.Write(SendMail(recipient Address, "UserName@gmail.com", "ccList if any", "subject", "body"))
j'ai également constaté que le compte que j'ai utilisé pour me connecter a été désactivé par google pour une raison quelconque. Une fois que j'ai réinitialisé mon mot de passe (comme avant), j'ai pu envoyer des e-mails. Je recevais aussi un message de 5.5.1.
j'ai aussi essayé de nombreuses solutions mais faire quelques changements, il va fonctionner
host = smtp.gmail.com
port = 587
username = email@gmail.com
password = password
enabledssl = true
avec smtpclient les paramètres ci-dessus sont des travaux dans gmail
j'utilisais une connexion VPN d'entreprise. C'est la raison pour laquelle je n'ai pas pu envoyer de courriel à partir de ma demande. Cela fonctionne si je me déconnecte du VPN.
j'ai rencontré la 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 a été: 5.5.1 Authentification requise. Pour en savoir plus, cliquez sur" ") et j'ai découvert que j'utilisais le mauvais mot de passe. J'ai corrigé les identifiants de connexion, et ils ont été envoyés correctement.
je sais que c'est en retard, mais peut-être que ça aidera quelqu'un d'autre.
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.)
j'avais la même erreur et aucune des solutions ci-dessus 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 connecté à gmail à partir de là. Il a posé une question de sécurité pour vérifier que c'était moi puisque c'était un nouvel endroit. Après avoir fait le contrôle de sécurité j'ai été en mesure d'authentifier par le code.
encore une autre solution possible pour vous. J'avais des problèmes similaires avec gmail via IMAP. Après avoir essayé toutes les solutions que j'ai trouvé que vous pourrez lire ici et ailleurs sur (eg. activez IMAP, activez un accès moins sécurisé à votre courrier, en utilisant https://accounts.google.com/b/0/displayunlockcaptcha et ainsi de suite), j'ai en fait créé un nouveau compte gmail Une fois de plus.
dans mon test original, le premier compte gmail que j'ai eu créé, j'avais connecté à mon compte gmail principal. Cela a donné lieu à un comportement erratique où le mauvais compte était référencé par google. Par exemple, exécuter https://accounts.google.com/b/0/displayunlockcaptcha a 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 constaté que cela a fonctionné amende!
je n'ai pas encore confirmé l'existence de ce (ie. reproduit), mais elle l'a apparemment fait pour moi...espérons que cela aide.
activez des applications moins sûres pour votre compte: https://www.google.com/settings/security/lesssecureapps
- Vérifiez D'abord vos paramètres de compte gmail et activez depuis" accès pour les applications moins sécurisées"
Nous vous recommandons fortement d'utiliser un app, comme Gmail, pour accéder à votre compte. Toutes les applications créées par Google répondent à ces normes de sécurité. L'utilisation d'une application moins sûre, d'un autre côté, pourrait laisser votre compte vulnérable. En savoir plus.
-
Set
smtp.UseDefaultCredentials = false;
avant
smtp.Credentials = new NetworkCredential(fromAddress, fromPassword);
vous pouvez également vous connecter via le port 465, mais en raison de certaines limites du système.Net.Vous devrez peut-être modifier votre code. C'est parce que l'espace de noms n'offre pas la possibilité de faire des connexions SSL implicites. Ceci est discuté à 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 du CDO (Collaborative Data Object) dans un autre discussion ( GMail SMTP via des erreurs c# .Net sur tous les ports ).
j'ai eu ce problème résolu. Apparemment ce message est utilisé dans plusieurs types d'erreurs. Mon problème était que j'avais atteint mon maximum de 500 courriers envoyés.
ouvrir une session dans le compte et essayer manuellement d'envoyer un courrier. Si la limite a été atteinte, elle vous informera
une ou plusieurs raisons expliquent cette erreur.
-
connectez-vous avec votre Gmail( ou tout autre if ) dans votre système local.
-
vérifiez aussi si L'application est moins sûre et réglez-la sur" Turn On " voici le lien pour GMAIL. https://www.google.com/settings/security/lesssecureapps
-
vérifiez pour EnableSsl dans votre code E-Mail, et aussi attribuez la valeur true.
smtp.EnableSsl = true;
-
vérifiez également le port que vous utilisez actuellement. 25 est Mondial, mais vous pouvez le vérifier pour d'autres aussi comme 587. vérifiez ici. N'toutes les communications SMTP arriver plus de 25?
-
si vous êtes à distance : cochez la réponse de Vlad Tamas ci-dessus.
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;
changez votre mot de passe gmail et réessayez, cela devrait fonctionner après cela.
Je ne sais pas pourquoi, mais chaque fois que vous changez votre hébergement, vous devez changer votre mot de passe.