web-dev-qa-db-fra.com

Envoyer un e-mail SMTP pour tester Microsoft Office 365 au format .net

j'ai un compte de messagerie sur le service Exchange Online. Maintenant, j'essaie de vérifier si je peux envoyer des mails à des clients (sur des domaines variés et sur Microsoft Office 365) via l'application c #

J'ai essayé d'implémenter le code ci-dessous mais j'obtiens l'erreur 

"Le certificat distant est invalide selon la procédure de validation "

MailMessage mail = null;                
mail = new MailMessage();

string[] strToList = "[email protected]"              
foreach (string strID in strToList)
{
    if (strID != null)
    {
        mail.To.Add(new MailAddress(strID));
    }
}

mail.From = "[email protected]";
mail.Subject = "testing"
mail.IsBodyHtml = true;
mail.Body = "mail body";

SmtpClient client = new SmtpClient("smtp.Outlook.office365.com");
client.Port = 587;
client.EnableSsl = true;
client.UseDefaultCredentials = false;
NetworkCredential cred = new System.Net.NetworkCredential("[email protected]", "mypassword");
client.Credentials = cred;
client.Send(mail);

S'il vous plaît des conseils si je fais quelque chose de mal ... Merci beaucoup d'avance.

11
user166013

cela fonctionne pour moi (édité à partir de source )


   ThreadPool.QueueUserWorkItem(t =>
            {
                SmtpClient client = new SmtpClient("smtp.office365.com",587);
                client.EnableSsl = true;
                client.Credentials = new System.Net.NetworkCredential("[email protected]", "password");
                MailAddress from = new MailAddress("[email protected]", String.Empty, System.Text.Encoding.UTF8);
                MailAddress to = new MailAddress("[email protected]");
                MailMessage message = new MailMessage(from, to);
                message.Body = "The message I want to send.";
                message.BodyEncoding = System.Text.Encoding.UTF8;
                message.Subject = "The subject of the email";
                message.SubjectEncoding = System.Text.Encoding.UTF8;
                // Set the method that is called back when the send operation ends.
                client.SendCompleted += new SendCompletedEventHandler(SendCompletedCallback);
                // The userState can be any object that allows your callback 
                // method to identify this send operation.
                // For this example, I am passing the message itself
                client.SendAsync(message, message);
            });

        private static void SendCompletedCallback(object sender, AsyncCompletedEventArgs e)
        {
            // Get the message we sent
            MailMessage msg = (MailMessage)e.UserState;

            if (e.Cancelled)
            {
                // Prompt user with "send cancelled" message 
            }
            if (e.Error != null)
            {
                // Prompt user with error message 
            }
            else
            {
                // Prompt user with message sent!
                // as we have the message object we can also display who the message
                // was sent to etc 
            }

            // finally dispose of the message
            if (msg != null)
                msg.Dispose();
        }
12
Zakos

C'est aussi le meilleur moyen d'envoyer un courrier. Je l'ai essayé dans mon projet et j'ai bien fonctionné.

 SmtpClient client = new SmtpClient("smtp.office365.com", 587);
        client.EnableSsl = true;
        client.Credentials = new System.Net.NetworkCredential("[email protected]", "sdsd@12345");
        MailAddress from = new MailAddress("From Address Ex [email protected]", String.Empty, System.Text.Encoding.UTF8);
        MailAddress to = new MailAddress("From Address Ex [email protected]");
        MailMessage message = new MailMessage(from, to);
        message.Body = "This is your body message";
        message.BodyEncoding = System.Text.Encoding.UTF8;
        message.Subject = "Subject";
        message.SubjectEncoding = System.Text.Encoding.UTF8;

        client.Send(message);
4
Shashi Keshar

Dans certains cas, l'authentification TLS peut entraîner des problèmes lors de l'utilisation de smtp.office365.com en tant que SMTP à partir de c #. Essayez la ligne suivante avant l'instruction Send (msg) (en remplaçant .TargetName):

client.TargetName = "STARTTLS/smtp.office365.com";

Celui-ci fonctionne pour moi

3
Joe Frank

Essayez smtp.office365.com au lieu de smtp.Outlook.office365.com

2
Benjamin Talmard

L'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.7.1 Le client n'était pas authentifié

cela arrive souvent lorsque le mot de passe du compte utilisateur associé a expiré ou que le compte est verrouillé. Essayez de définir "Ne jamais expirer le mot de passe de l'utilisateur" dans Active Directory, s'il n'enfreint pas la stratégie de mot de passe de votre société :) Cela m'est arrivé lors du test avec o365 Exchange Online A/c.

1
hiFI

Essayez d'utiliser:

ServicePointManager.ServerCertificateValidationCallback = 
    (sender, certificate, chain, sslPolicyErrors) => true;

Ce code vous permettra d'accepter des certificats non valides.

Comme Ori Nachum le mentionne dans le commentaire: il s’agit d’une pratique très MAUVAISE qui ne devrait être utilisée que pour des tests. C'est un risque de sécurité!

1
Piotr Stapp

Essayez de régler:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls;

Il s'assurera que le SecurityPoint du service est TLS.
Veuillez noter une réponse proposée ici 

ServicePointManager.ServerCertificateValidationCallback = 
    (sender, certificate, chain, sslPolicyErrors) => true;

Peut être utile à des fins de test - mais c'est un risque de sécurité majeur !
Ne pas utiliser avec un compte prod ou dans un environnement prod.

0
Ori Nachum