Comment puis-je envoyer des e-mails via SSL SMTP avec the.NET cadre?

Existe-t-il un moyen avec le Framework .NET pour envoyer des e-mails via un serveur SMTP SSL sur le port 465?

de 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);

times:

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 cherché sur Google et j'ai trouvé ce système.Net.Mail prend en charge les connexions sur le port 587 (port par défaut pour le protocole SSL explicite qui démarre en clair puis émet un STARTDLS puis passe à une connexion chiffrée: RFC 2228), mais ne prend pas en charge le protocole SSL implicite (entier la connexion est enveloppée dans une couche SSL)...

33
demandé sur Idriss 2009-06-18 11:24:42

11 réponses

voici un exemple d'envoi de courrier électronique par GMail qui utilise aussi SSL/465. Mineur optimisation du code ci-dessous devrait fonctionner!

using System.Web.Mail;
using System;
public class MailSender
{
    public static bool SendEmail(
        string pGmailEmail, 
        string pGmailPassword, 
        string pTo, 
        string pSubject,
        string pBody, 
        System.Web.Mail.MailFormat pFormat,
        string pAttachmentPath)
    {
    try
    {
        System.Web.Mail.MailMessage myMail = new System.Web.Mail.MailMessage();
        myMail.Fields.Add
            ("http://schemas.microsoft.com/cdo/configuration/smtpserver",
                          "smtp.gmail.com");
        myMail.Fields.Add
            ("http://schemas.microsoft.com/cdo/configuration/smtpserverport",
                          "465");
        myMail.Fields.Add
            ("http://schemas.microsoft.com/cdo/configuration/sendusing",
                          "2");
        //sendusing: cdoSendUsingPort, value 2, for sending the message using 
        //the network.

        //smtpauthenticate: Specifies the mechanism used when authenticating 
        //to an SMTP 
        //service over the network. Possible values are:
        //- cdoAnonymous, value 0. Do not authenticate.
        //- cdoBasic, value 1. Use basic clear-text authentication. 
        //When using this option you have to provide the user name and password 
        //through the sendusername and sendpassword fields.
        //- cdoNTLM, value 2. The current process security context is used to 
        // authenticate with the service.
        myMail.Fields.Add
        ("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate","1");
        //Use 0 for anonymous
        myMail.Fields.Add
        ("http://schemas.microsoft.com/cdo/configuration/sendusername",
            pGmailEmail);
        myMail.Fields.Add
        ("http://schemas.microsoft.com/cdo/configuration/sendpassword",
             pGmailPassword);
        myMail.Fields.Add
        ("http://schemas.microsoft.com/cdo/configuration/smtpusessl",
             "true");
        myMail.From = pGmailEmail;
        myMail.To = pTo;
        myMail.Subject = pSubject;
        myMail.BodyFormat = pFormat;
        myMail.Body = pBody;
        if (pAttachmentPath.Trim() != "")
        {
            MailAttachment MyAttachment = 
                    new MailAttachment(pAttachmentPath);
            myMail.Attachments.Add(MyAttachment);
            myMail.Priority = System.Web.Mail.MailPriority.High;
        }

        System.Web.Mail.SmtpMail.SmtpServer = "smtp.gmail.com:465";
        System.Web.Mail.SmtpMail.Send(myMail);
        return true;
    }
    catch (Exception ex)
    {
        throw;
    }
}
}
32
répondu Andrew Siemer 2009-06-18 20:01:34

je suis en retard à cette fête mais je vais proposer mon approche pour tous les passants qui pourraient être intéressés par une alternative.

comme indiqué dans les réponses précédentes, la classe System.Net.Mail SmtpClient ne supporte pas SSL implicite . Il ne supporte SSL explicite , qui nécessite une connexion non sécurisée au serveur SMTP sur le port 25 afin de négocier la sécurité de niveau de transport (TLS). J'ai blogué sur mes difficultés avec cette subtilité ici .

en résumé, SMTP sur le port SSL 465 implique que TLS doit être négocié avant se connectant au serveur SMTP. Plutôt que d'écrire une implémentation SMTPS .net, je me suis tourné vers un utilitaire nommé Stunnel . C'est un petit service qui vous permettra de rediriger le trafic sur un port local vers un port distant via SSL.

DISCLAIMER: Stunnel utilise des portions de la bibliothèque OpenSSL, qui a récemment eu un exploit de haut niveau publié dans tous les grands médias d'information tech. Je crois que la dernière version utilise le patched OpenSSL mais s'il vous plaît utilisez à vos propres risques.

une fois l'utilitaire installé un petit ajout au fichier de configuration:

; Example SSL client mode services
[my-smtps]
client = yes
accept = 127.0.0.1:465
connect = mymailserver.com:465

...charge le service Stunnel de rediriger les requêtes locales vers le port 465 vers mon serveur de messagerie sur le port 465. Cela se produit au cours de TLS, ce qui satisfait les Serveur SMTP sur l'autre extrémité.

en utilisant cet utilitaire, le code suivant sera transmis avec succès sur le port 465:

using System;
using System.Net;
using System.Net.Mail;

namespace RSS.SmtpTest
{
    class Program
    {
        static void Main( string[] args )
        {
            try {
                using( SmtpClient smtpClient = new SmtpClient( "localhost", 465 ) ) { // <-- note the use of localhost
                    NetworkCredential creds = new NetworkCredential( "username", "password" );
                    smtpClient.Credentials = creds;
                    MailMessage msg = new MailMessage( "joe@schmoe.com", "jane@schmoe.com", "Test", "This is a test" );
                    smtpClient.Send( msg );
                }
            }
            catch( Exception ex ) {
                Console.WriteLine( ex.Message );
            }
        }
    }
}

donc l'avantage ici est que vous pouvez utiliser Implict SSL et le port 465 comme protocole de sécurité tout en utilisant les méthodes d'envoi de courrier intégrées dans le framework. 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.

11
répondu Bob Mc 2015-04-10 00:48:42

il fonctionne avec le système.Web.Mail (qui est marqué comme obsolète):

private const string SMTP_SERVER        = "http://schemas.microsoft.com/cdo/configuration/smtpserver";
private const string SMTP_SERVER_PORT   = "http://schemas.microsoft.com/cdo/configuration/smtpserverport";
private const string SEND_USING         = "http://schemas.microsoft.com/cdo/configuration/sendusing";
private const string SMTP_USE_SSL       = "http://schemas.microsoft.com/cdo/configuration/smtpusessl";
private const string SMTP_AUTHENTICATE  = "http://schemas.microsoft.com/cdo/configuration/smtpauthenticate";
private const string SEND_USERNAME      = "http://schemas.microsoft.com/cdo/configuration/sendusername";
private const string SEND_PASSWORD      = "http://schemas.microsoft.com/cdo/configuration/sendpassword";

System.Web.Mail.MailMessage mail = new System.Web.Mail.MailMessage();

mail.Fields[SMTP_SERVER] = "tempurl.org";
mail.Fields[SMTP_SERVER_PORT] = 465;
mail.Fields[SEND_USING] = 2;
mail.Fields[SMTP_USE_SSL] = true;
mail.Fields[SMTP_AUTHENTICATE] = 1;
mail.Fields[SEND_USERNAME] = "username";
mail.Fields[SEND_PASSWORD] = "password";

System.Web.Mail.SmtpMail.Send(mail);

Quel Est votre point de vue concernant l'utilisation obsolète de l'espace de noms?

10
répondu Idriss 2009-06-19 06:55:12

essayer de vérifier ce libre une alternative open source https://www.nuget.org/packages/AIM Il est libre d'utiliser et open source et utilise la même manière que le système.Net.Mail utilise Pour envoyer un e-mail à des ports SSL implicites, vous pouvez utiliser le code suivant

public static void SendMail()
{    
    var mailMessage = new MimeMailMessage();
    mailMessage.Subject = "test mail";
    mailMessage.Body = "hi dude!";
    mailMessage.Sender = new MimeMailAddress("you@gmail.com", "your name");
    mailMessage.To.Add(new MimeMailAddress("yourfriend@gmail.com", "your friendd's name")); 
// You can add CC and BCC list using the same way
    mailMessage.Attachments.Add(new MimeAttachment("your file address"));

//Mail Sender (Smtp Client)

    var emailer = new SmtpSocketClient();
    emailer.Host = "your mail server address";
    emailer.Port = 465;
    emailer.SslType = SslMode.Ssl;
    emailer.User = "mail sever user name";
    emailer.Password = "mail sever password" ;
    emailer.AuthenticationMode = AuthenticationType.Base64;
    // The authentication types depends on your server, it can be plain, base 64 or none. 
//if you do not need user name and password means you are using default credentials 
// In this case, your authentication type is none            
    emailer.MailMessage = mailMessage;
    emailer.OnMailSent += new SendCompletedEventHandler(OnMailSent);
    emailer.SendMessageAsync();
}

// A simple call back function:
private void OnMailSent(object sender, AsyncCompletedEventArgs asynccompletedeventargs)
{
if (e.UserState!=null)
    Console.Out.WriteLine(e.UserState.ToString());
if (e.Error != null)
{
    MessageBox.Show(e.Error.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
else if (!e.Cancelled)
{
    MessageBox.Show("Send successfull!", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
} 
6
répondu Nil Null 2015-07-26 14:29:17

In VB.NET en essayant de me connecter au port SSL de Rackspace sur 465, j'ai rencontré le même problème (nécessite un SSL implicite). J'ai fait usage de https://www.nuget.org/packages/MailKit/ afin de pouvoir vous connecter.

voici un exemple de message de courriel HTML.

Imports MailKit.Net.Smtp
Imports MailKit
Imports MimeKit

Sub somesub()
    Dim builder As New BodyBuilder()
    Dim mail As MimeMessage
    mail = New MimeMessage()
    mail.From.Add(New MailboxAddress("", c_MailUser))
    mail.To.Add(New MailboxAddress("", c_ToUser))
    mail.Subject = "Mail Subject"
    builder.HtmlBody = "<html><body>Body Text"
    builder.HtmlBody += "</body></html>"
      mail.Body = builder.ToMessageBody()

      Using client As New SmtpClient
        client.Connect(c_MailServer, 465, True)
        client.AuthenticationMechanisms.Remove("XOAUTH2") ' Do not use OAUTH2
        client.Authenticate(c_MailUser, c_MailPassword) ' Use a username / password to authenticate.
        client.Send(mail)
        client.Disconnect(True)
    End Using 

End Sub
5
répondu Cody G. 2016-09-09 15:11:30

si C'est SSL implicite, il semble que cela ne peut pas être fait avec le système.Net.Mail et n'est pas encore pris en charge.

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 C'est un SSL implicite, essayez .

4
répondu Kinze 2017-05-23 11:47:23

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 .

il est possible de faire des connexions implicites sans avoir à utiliser le maintenant, Système obsolète.Web.Espace de noms de messagerie, mais vous devez accéder à L'objet de données collaboratives (CDO) de Microsoft. J'ai fourni un exemple d'utilisation du CDO dans une autre discussion ( GMail SMTP via des erreurs C# .Net sur tous les ports ).

Espérons que cette aide!

4
répondu Bryan Allred 2017-05-23 12:34:27

je sais que je me joins tard à la discussion, mais je pense que cela peut être utile à d'autres.

j'ai voulu éviter les choses dépréciées et après beaucoup de bricolage, j'ai trouvé un moyen simple d'envoyer aux serveurs nécessitant SSL implicite: utiliser NuGet et ajouter le paquet MailKit au projet. (J'ai utilisé VS2017 pour cibler .NET 4.6.2, mais cela devrait fonctionner sur les versions inférieures de .NET...)

alors vous n'aurez besoin de faire quelque chose comme ça:

using MailKit.Net.Smtp;
using MimeKit;

var client = new SmtpClient();
client.Connect("server.name", 465, true);

// Note: since we don't have an OAuth2 token, disable the XOAUTH2 authentication mechanism.
client.AuthenticationMechanisms.Remove ("XOAUTH2");

if (needsUserAndPwd)
{
    // Note: only needed if the SMTP server requires authentication
    client.Authenticate (user, pwd);
}

var msg = new MimeMessage();
msg.From.Add(new MailboxAddress("sender@ema.il"));
msg.To  .Add(new MailboxAddress("target@ema.il"));
msg.Subject = "This is a test subject";

msg.Body = new TextPart("plain") {
    Text = "This is a sample message body"
};

client.Send(msg);
client.Disconnect(true);

bien sûr, vous pouvez également le modifier pour utiliser explicitement SSL ou pas de sécurité de transport du tout.

1
répondu Luke 2017-09-13 17:02:45

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 système.Net.Mail, utiliser le port 25 au lieu de 465:

vous devez définir SSL=true et Port=25. Le serveur répond à votre demande à partir de non protégé 25 et lance ensuite la connexion à protégé 465.

1
répondu net_prog 2018-01-18 13:38:15

pour gmail ces réglages ont fonctionné pour moi, le Gestionnaire de service.La ligne SecurityProtocol était nécessaire. Parce que j'ai la vérification d'installation 2 pas j'ai dû obtenir un mot de passe D'application de Google App password generator . SmtpClient mailer = new SmtpClient(); mailer.Host = "smtp.gmail.com"; mailer.Port = 587; mailer.EnableSsl = true; ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls;

0
répondu user2584621 2016-06-10 14:02:40

en cas de doute sur ce code, veuillez poser vos questions(ici pour le numéro de Port gmail est 587)

// code to Send Mail 
// Add following Lines in your web.config file 
//               <system.net>
//                  <mailSettings>
//                    <smtp>
//                        <network host="smtp.gmail.com" port="587" userName="xxx@gmail.com" password="yyy"   defaultCredentials="false"/>
//                    </smtp>
//               </mailSettings>
//               </system.net>
// Add below lines in your config file inside appsetting tag <appsetting></appsetting>
//          <add key="emailFromAddress" value="xxxx@gmail.com"/>
//       <add key="emailToAddress" value="xxxxxxx@gmail.com"/>
//        <add key="EmailSsl" value="true"/>

// Namespace Used

using System.Net.Mail;
     public static bool SendingMail(string subject, string content)
    {
       // getting the values from config file through c#
        string fromEmail = ConfigurationSettings.AppSettings["emailFromAddress"];
        string mailid = ConfigurationSettings.AppSettings["emailToAddress"];
        bool useSSL;
        if (ConfigurationSettings.AppSettings["EmailSsl"] == "true")
        {
            useSSL = true;
        }
        else
        {
            useSSL = false;
        }



        SmtpClient emailClient;
        MailMessage message;
        message = new MailMessage();
        message.From = new MailAddress(fromEmail);
        message.ReplyTo = new MailAddress(fromEmail);
        if (SetMailAddressCollection(message.To, mailid))
        {
            message.Subject = subject;
            message.Body = content;
            message.IsBodyHtml = true;
            emailClient = new SmtpClient();
            emailClient.EnableSsl = useSSL;
            emailClient.Send(message);
        }
        return true;
    }
    // if you are sending mail in group

    private static bool SetMailAddressCollection(MailAddressCollection toAddresses, string    mailId)
    {
        bool successfulAddressCreation = true;
        toAddresses.Add(new MailAddress(mailId));
        return successfulAddressCreation;
    }
-1
répondu RekhaShanmugam 2014-05-15 14:09:50