web-dev-qa-db-fra.com

Erreur SMTP 5.7.57 lors de la tentative d'envoi d'un courrier électronique via Office 365

J'essaie de configurer un code pour envoyer un courrier électronique via le service SMTP authentifié d'Office 365 :

var _mailServer = new SmtpClient();
_mailServer.UseDefaultCredentials = false;
_mailServer.Credentials = new NetworkCredential("[email protected]", "password");
_mailServer.Host = "smtp.office365.com";
_mailServer.TargetName = "STARTTLS/smtp.office365.com"; // same behaviour if this lien is removed
_mailServer.Port = 587;
_mailServer.EnableSsl = true;

var eml = new MailMessage();
eml.Sender = new MailAddress("[email protected]");
eml.From = eml.Sender;
eml.to = new MailAddress("[email protected]");
eml.Subject = "Test message";
eml.Body = "Test message body";

_mailServer.Send(eml);

Cela ne semble pas fonctionner, et je vois une exception:

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.7.57 SMTP; Le client n'a pas été authentifié pour envoyer un courrier anonyme pendant MAIL FROM
sur System.Net.Mail.MailCommand.Send (connexion SmtpConnection, commande Byte [], chaîne de)
sur System.Net.Mail.SmtpTransport.SendMail (expéditeur de MailAddress, destinataires de MailAddressCollection, String deliveryNotify, SmtpFailedRecipientException & exception)
sur System.Net.Mail.SmtpClient.Send (message MailMessage)

J'ai essayé l'activation du traçage du réseau et il semble que des communications sécurisées sont établies (par exemple, une ligne apparaît dans le journal pour la commande "STARTTLS", puis une ligne dans le journal "Le certificat distant a été vérifié comme valide par l'utilisateur. "et les données Send() et Receive() suivantes ne sont pas lisibles en tant que texte brut et ne semblent pas contenir de panique TLS/SSH)

Je peux utiliser la même adresse électronique et le même mot de passe pour vous connecter à http://portal.office.com/ et utiliser le courrier électronique de messagerie Outlook pour envoyer et lire des e-mails. Par conséquent, ce qui pourrait entraîner l'échec de l'authentification lors de l'envoi de courrier électronique par programme?

Existe-t-il un moyen supplémentaire de déboguer le flux crypté?

8
Rowland Shaw

Dans mon cas, après avoir essayé toute cette suggestion sans succès, j'ai contacté le support technique de Microsoft et leur suggestion était simplement de changer le mot de passe. 

Cela a résolu mon problème. 

Notez que le mot de passe n'a pas expiré, car je me suis connecté avec succès à office365, mais la réinitialisation a résolu le problème.

Leçon apprise: ne faites pas confiance à la date d'expiration du mot de passe Office 365, dans mon cas, le mot de passe serait expiré après 1 à 2 mois, mais cela ne fonctionnait pas ... Beaucoup de temps, j'ai réalisé que le problème était dans le mot de passe Office365 qui était "corrompu" ou "expiré prématurément".

N'oubliez pas tous les 3 mois pour "actualiser" le mot de passe.

4
Matteo Conta

Pour faciliter le débogage, essayez de basculer temporairement sur MailKit et d’utiliser un extrait de code tel que celui-ci:

using System;

using MailKit.Net.Smtp;
using MailKit.Security;
using MailKit;
using MimeKit;

namespace TestClient {
    class Program
    {
        public static void Main (string[] args)
        {
            var message = new MimeMessage ();
            message.From.Add (new MailboxAddress ("", "[email protected]"));
            message.To.Add (new MailboxAddress ("", "[email protected]"));
            message.Subject = "Test message";

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

            using (var client = new SmtpClient (new ProtocolLogger ("smtp.log"))) {
                client.Connect ("smtp.office365.com", 587, SecureSocketOptions.StartTls);

                client.Authenticate ("[email protected]", "password");

                client.Send (message);
                client.Disconnect (true);
            }
        }
    }
}

Cela enregistrera la totalité de la transaction dans un fichier appelé "smtp.log", que vous pourrez ensuite lire et où les problèmes risquent de se produire.

Notez que smtp.log contiendra probablement une commande AUTH LOGIN suivie de quelques commandes codées en base64 (ce sont votre utilisateur/votre mot de passe). Par conséquent, si vous partagez le journal, assurez-vous de nettoyer ces lignes.

Je m'attendrais à ce que cela ait la même erreur que vous voyez avec System.Net.Mail, mais cela vous aidera à voir ce qui se passe.

En supposant que cela échoue (et je suppose que ce sera le cas), essayez de passer à SecureSocketOptions.None et/ou essayez de commenter la Authenticate().

Voyez comment cela change l'erreur que vous constatez.

3
jstedfast

Assurez-vous que vous utilisez l'adresse e-mail actuelle office365 pour le compte. Vous pouvez le trouver en cliquant sur le bouton de profil dans Outlook365. J'ai lutté avec l'authentification jusqu'à ce que je réalise que l'adresse e-mail que j'essayais d'utiliser pour l'authentification n'était pas le compte de messagerie de la boîte aux lettres. L'e-mail du compte réel peut avoir la forme suivante: [email protected].

3
Derek Wade

Nous avons eu la nôtre en convertissant les boîtes aux lettres (de l'adresse) de "partagé" à "normal". Avant ce changement, mon application avait cessé d'envoyer des courriels lors de la migration de Gmail vers Office 365. Aucun autre changement de code n'était requis, à part la définition de l'hôte sur smtp.office365.com.

2
Johnie Karr

Dans mon cas, mon problème n'était pas lié au code mais à quelque chose à voir avec la boîte aux lettres Exchange. Je ne sais pas pourquoi mais cela a résolu mon problème: 

  • Accédez aux paramètres d'échange pour la boîte aux lettres de cet utilisateur et accédez à la délégation de messagerie. 
  • Sous Envoyer en tant que, supprimez NT AUTHORITY\SELF, puis ajoutez le compte de l'utilisateur.

Cela donne à l'utilisateur la permission d'envoyer des courriels pour son compte. En théorie, NT AUTHORITY\SELF devrait faire la même chose mais pour une raison quelconque, cela n'a pas fonctionné.

Source: http://edudotnet.blogspot.com.mt/2014/02/smtp-Microsoft-office-365-net-smtp.html

1
Matt R

Veuillez vérifier ci-dessous le code que j'ai testé pour envoyer un courrier électronique à l'aide d'Exchange Online:

        MailMessage msg = new MailMessage();
        msg.To.Add(new MailAddress("[email protected]", "XXXX"));
        msg.From = new MailAddress("[email protected]", "XXX");
        msg.Subject = "This is a Test Mail";
        msg.Body = "This is a test message using Exchange OnLine";
        msg.IsBodyHtml = true;

        SmtpClient client = new SmtpClient();
        client.UseDefaultCredentials = false;
        client.Credentials = new System.Net.NetworkCredential("[email protected]", "YourPassword");
        client.Port = 587; // You can use Port 25 if 587 is blocked
        client.Host = "smtp.office365.com";
        client.DeliveryMethod = SmtpDeliveryMethod.Network;
        client.EnableSsl = true;
        try
        {
            client.Send(msg);

        }
        catch (Exception ex)
        {

        }

 enter image description here Le port (587) a été défini pour la soumission du message. Bien que le port 587 n'exige pas l'obligation de STARTTLS, l'utilisation du port 587 est devenue populaire à peu près au même moment où on s'est rendu compte que le cryptage SSL/TLS des communications entre clients et serveurs constituait un problème de sécurité et de confidentialité important.

1
Nan Yu

Vous devez modifier la fonction des informations d'identification. Voici la substitution que vous devez faire:

changement

-*_mailServer.Credentials = new NetworkCredential("[email protected]", "password");*

pour ça

-*_mailServer.Credentials = new NetworkCredential("[email protected]", "password", "domain");*
0
Calm