Comment puis-je envoyer des e-mails via le protocole SSL SMTP avec le .NET Framework?
Est-il un moyen avec l' .NET Framework pour envoyer des emails à travers un SSL serveur SMTP sur le port 465?
La manière habituelle:
System.Net.Mail.SmtpClient _SmtpServer = new System.Net.Mail.SmtpClient("tempurl.org");
_SmtpServer.Port = 465;
_SmtpServer.EnableSsl = true;
_SmtpServer.Credentials = new System.Net.NetworkCredential("username", "password");
_SmtpServer.Timeout = 5000;
_SmtpServer.UseDefaultCredentials = false;
MailMessage mail = new MailMessage();
mail.From = new MailAddress(from);
mail.To.Add(to);
mail.CC.Add(cc);
mail.Subject = subject;
mail.Body = content;
mail.IsBodyHtml = useHtml;
_SmtpServer.Send(mail);
fois sur:
System.Net Verbose: 0 : [1024] SmtpClient::.ctor(host=ssl0.ovh.net, port=465)
System.Net Information: 0 : [1024] Associating SmtpClient#64923656 with SmtpTransport#44624228
System.Net Verbose: 0 : [1024] Exiting SmtpClient::.ctor() -> SmtpClient#64923656
System.Net Information: 0 : [1024] Associating MailMessage#17654054 with Message#52727599
System.Net Verbose: 0 : [1024] SmtpClient#64923656::Send(MailMessage#17654054)
System.Net Information: 0 : [1024] SmtpClient#64923656::Send(DeliveryMethod=Network)
System.Net Information: 0 : [1024] Associating SmtpClient#64923656 with MailMessage#17654054
System.Net Information: 0 : [1024] Associating SmtpTransport#44624228 with SmtpConnection#14347911
System.Net Information: 0 : [1024] Associating SmtpConnection#14347911 with ServicePoint#51393439
System.Net.Sockets Verbose: 0 : [1024] Socket#26756241::Socket(InterNetwork#2)
System.Net.Sockets Verbose: 0 : [1024] Exiting Socket#26756241::Socket()
System.Net.Sockets Verbose: 0 : [1024] Socket#23264094::Socket(InterNetworkV6#23)
System.Net.Sockets Verbose: 0 : [1024] Exiting Socket#23264094::Socket()
System.Net.Sockets Verbose: 0 : [1024] Socket#26756241::Connect(20:465#337754884)
System.Net.Sockets Verbose: 0 : [1024] Exiting Socket#26756241::Connect()
System.Net.Sockets Verbose: 0 : [1024] Socket#23264094::Close()
System.Net.Sockets Verbose: 0 : [1024] Socket#23264094::Dispose()
System.Net.Sockets Verbose: 0 : [1024] Exiting Socket#23264094::Close()
System.Net Information: 0 : [1024] Associating SmtpConnection#14347911 with SmtpPooledStream#14303791
System.Net.Sockets Verbose: 0 : [1024] Socket#26756241::Receive()
System.Net.Sockets Verbose: 0 : [2404] Socket#26756241::Dispose()
System.Net.Sockets Error: 0 : [1024] Exception in the Socket#26756241::Receive - A blocking operation was interrupted by a call to WSACancelBlockingCall
System.Net.Sockets Verbose: 0 : [1024] Exiting Socket#26756241::Receive() -> 0#0
System.Net Error: 0 : [1024] Exception in the SmtpClient#64923656::Send - Unable to read data from the transport connection: A blocking operation was interrupted by a call to WSACancelBlockingCall.
System.Net Error: 0 : [1024] at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size)
at System.Net.DelegatedStream.Read(Byte[] buffer, Int32 offset, Int32 count)
at System.Net.BufferedReadStream.Read(Byte[] buffer, Int32 offset, Int32 count)
at System.Net.Mail.SmtpReplyReaderFactory.ReadLines(SmtpReplyReader caller, Boolean oneLine)
at System.Net.Mail.SmtpReplyReaderFactory.ReadLine(SmtpReplyReader caller)
at System.Net.Mail.SmtpConnection.GetConnection(String host, Int32 port)
at System.Net.Mail.SmtpTransport.GetConnection(String host, Int32 port)
at System.Net.Mail.SmtpClient.GetConnection()
at System.Net.Mail.SmtpClient.Send(MailMessage message)
System.Net Verbose: 0 : [1024] Exiting SmtpClient#64923656::Send()
System.Net Information: 0 : [1024] Associating MailMessage#49584532 with Message#19699911
J'ai googlé autour et a trouvé que Système.Net.De messagerie prend en charge les connexions sur le port 587 (port par défaut pour le SSL Explicite qui commence non chiffrés ensuite une STARTDLS passe ensuite à une connexion Chiffrée: RFC 2228), mais ne prend pas en charge SSL Implicite (l'ensemble de la connexion est enveloppé dans une couche SSL)...
- SmtpClient.EnableSsl Propriété "Une autre méthode de connexion est l'endroit où une session SSL est établie avant tout protocole commandes sont envoyées. Cette méthode de connexion est parfois appelé SMTP/SSL, SMTP sur SSL, ou SMTPS et utilise par défaut le port 465. Cette autre méthode de connexion à l'aide de SSL n'est pas actuellement pris en charge." FWIW
Vous devez vous connecter pour publier un commentaire.
Voici un exemple de comment envoyer des emails via GMail qui utilise également le protocole SSL/465. Mineur optimisation du code ci-dessous devrait fonctionner!
Je suis en retard pour cette partie, mais je vais offrir mon approche pour toute les passants qui pourraient être intéressés par une alternative.
Comme indiqué dans les réponses précédentes, les
System.Net.Mail
SmtpClient
classe ne prend pas en charge SSL Implicite. Il prend en charge SSL Explicite, ce qui nécessite une insécurité connexion au serveur SMTP sur le port 25 pour négocier le transport level security (TLS). J'ai blogué à propos de mes travails avec cette subtilité ici.En bref, SMTP sur Implict SSL port 465 TLS nécessite d'être négocié avant de la connexion au serveur SMTP. Plutôt que d'écrire une .Net SMTPS mise en œuvre je me suis tourné vers un utilitaire nommé Stunnel. C'est un petit service qui va vous permettre de rediriger le trafic sur un port local vers un port distant via le protocole SSL.
Une fois l'utilitaire installé, un petit ajout dans le fichier de configuration:
...charge le Stunnel service de rediriger les demandes locales le port 465 pour mon serveur de messagerie sur le port 465. Ce qui se passe sur TLS, qui satisfait le serveur SMTP à l'autre extrémité.
À l'aide de cet utilitaire, le code suivant va réussir à transmettre sur le port 465:
Donc l'avantage ici est que vous pouvez utiliser Implict SSL et le port 465, comme le protocole de sécurité tout en utilisant d'envoi de courrier méthodes intégré dans le cadre. L'inconvénient est qu'il nécessite l'utilisation d'un service tiers qui peut ne pas être utile pour quoi que ce soit, mais cette fonction spécifique.
Il fonctionne avec le Système.Web.Mail (qui est marqué comme obsolète):
Quel est votre point de vue concernant obsolète l'utilisation de l'espace de noms?
Essayer de vérifier cette gratuit une alternative open source
https://www.nuget.org/packages/AIM
Il est libre d'utiliser et open source qui utilise exactement de la même manière que Système.Net.Le courrier est à l'aide de
Pour envoyer un courriel à ssl implicite ports, vous pouvez utiliser le code suivant
Dans VB.NET tout en essayant de se connecter à Rackspace du SSL sur le port 465, j'ai rencontré le même problème (requiert SSL implicite). J'ai fait usage de https://www.nuget.org/packages/MailKit/ afin de pouvoir vous connecter.
Ce qui suit est un exemple d'un message électronique HTML.
SmtpClient
qui ne peut pas gérer le SSL implicite. Aussi, il est beaucoup plus mature que le BUT (suggéré dans une autre réponse) et fonctionne très bien avec de l'UTF-8 (et d'autres encodages).Merci.Si elle est Implicite, SSL, on dirait qu'il ne peut être fait avec le Système.Net.Mail et n'est pas pris en charge pour l'instant.
http://blogs.msdn.com/webdav_101/archive/2008/06/02/system-net-mail-with-ssl-to-authenticate-against-port-465.aspx
Pour vérifier si il est SSL Implicite essayer c'.
Vous pouvez également vous connecter via le port 465, mais en raison de certaines limitations du Système.Net.Le courrier de l'espace de noms, vous pouvez avoir à modifier le code. C'est parce que l'espace de noms n'offre pas la possibilité de faire implicite des connexions SSL. Ce thème est abordé http://blogs.msdn.com/b/webdav_101/archive/2008/06/02/system-net-mail-with-ssl-to-authenticate-against-port-465.aspx.
Il est possible de faire des connexions implicites, sans avoir recours à maintenant, Système obsolète.Web.Le courrier de l'espace de noms, mais vous devez accéder au Microsoft CDO (Collaboration Data Object). J'ai fourni un exemple d'utilisation de la CDO dans une autre discussion (SMTP de GMail via C# .Net des erreurs sur tous les ports).
Espérons que cette aide!
Je sais que je suis de rejoindre la fin de la discussion, mais je pense que cela peut être utile à d'autres.
Je voulais éviter obsolète trucs et après beaucoup de jongler j'ai trouvé un moyen simple de les envoyer à des serveurs nécessitant SSL Implicite: utiliser NuGet et ajouter le MailKit paquet pour le projet. (J'ai utilisé VS2017 de mieux les cibler .NET 4.6.2 mais il devrait fonctionner sur la partie inférieure .NET versions...)
Alors vous aurez seulement besoin de faire quelque chose comme ceci:
Bien sûr, vous pouvez également le modifier pour utiliser SSL Explicite ou non de la sécurité des transports du tout.
Comme indiqué dans un commentaire à
http://blogs.msdn.com/webdav_101/archive/2008/06/02/system-net-mail-with-ssl-to-authenticate-against-port-465.aspx
avec le Système.Net.Mail, utiliser le port 25 au lieu de 465:
Si le moindre doute dans ce code, veuillez poser vos questions(Ici pour gmail numéro de Port 587)
Pour gmail ces paramètres travaillé pour moi, le ServicePointManager.SecurityProtocol ligne a été nécessaire. Parce que je dispose de la configuration 2 l'étape de la vérification j'ai besoin d'obtenir un Mot de passe d'Application à partir de google app générateur de mot de passe.
SmtpClient mailer = new SmtpClient();
mailer.Host = "smtp.gmail.com";
mailer.Port = 587;
mailer.EnableSsl = true;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls;