web-dev-qa-db-fra.com

Exception utilisant les informations d'identification SMTP par défaut sur Office365 - Le client n'était pas authentifié pour envoyer un courrier anonyme pendant MAIL FROM

J'utilise NLog pour envoyer les journaux sous forme de courrier électronique avec une cible de messagerie personnalisée. J'envoie depuis mon compte office365 configuré comme compte par défaut dans mon web.config (de mon projet principal) comme suit:

  <system.net>
    <mailSettings>
      <smtp deliveryMethod="Network" from="[email protected]">
        <network defaultCredentials="false" Host="smtp.office365.com" port="587" userName="[email protected]" password="mypassword" enableSsl="true" />
      </smtp>
    </mailSettings>
  </system.net>

Je remplace la méthode Write avec ma cible de journal (dans mon package d'implémentation NLog) comme suit:

    protected override void Write(LogEventInfo logEvent) 
    { 
        try
        {
            using (var mail = new MailMessage())
            {
                this.SetupMailMessage(mail, logEvent, this.Layout.Render(logEvent));

                using (SmtpClient smtpClient = new SmtpClient())
                {
                    smtpClient.UseDefaultCredentials = true;
                    smtpClient.Send(mail);
                }
            }
        }
        catch (Exception exception)
        {
            throw new NLogRuntimeException("An error occurred when sending a log mail message.", exception);
        }
    }

Lorsque le système tente d'envoyer un courrier à partir de ce compte, le System.Net.Mail.SmtpException suivant est renvoyé:

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

J'ai quadruple vérifié les informations d'identification et elles sont correctes. Est-ce que quelqu'un sait ce qui pourrait causer cette exception?

UPDATE: Il s'avère que la propriété CredentialCache.DefaultCredentials est pleine de chaînes vides. Cependant, lorsque j'extrais manuellement les paramètres à l'aide du code ci-dessous, je peux les obtenir à partir du fichier web.config. 

SmtpSection settings = (SmtpSection)ConfigurationManager.GetSection("system.net/mailSettings/smtp");
smtpClient.Credentials = new NetworkCredential(settings.Network.UserName, settings.Network.Password);
smtpClient.Host = settings.Network.Host;
smtpClient.Port = settings.Network.Port;
smtpClient.EnableSsl = settings.Network.EnableSsl;

var creds = CredentialCache.DefaultCredentials;  // Is empty

Je peux utiliser cela comme solution de contournement. Mais qu'est-ce qui donne? Pourquoi les informations d'identification par défaut sont-elles vides?

11
Ivan

Bien que la solution de contournement que j'ai mentionnée dans la mise à jour de la réponse fonctionne, je ne suis pas content de récupérer manuellement ces valeurs. La solution pour moi était de supprimer la ligne

smtpClient.UseDefaultCredentials = true;

du code original que j'ai posté. Il s'avère que smtpClient est initialisé avec les informations d'identification par défaut que j'ai définies dans le fichier web.config et que la ligne supprimée ci-dessus les remplaçait par des chaînes vides de CredentialCache.DefaultCredentials. Je ne sais toujours pas pourquoi CredentialCache.DefaultCredentials est vide ou quand cela est censé être rempli à partir de web.config, mais c'était la source de mon problème.

Si quelqu'un a une idée plus précise de la situation, postez une meilleure réponse!

7
Ivan

Grâce à ce post, j'ai pu résoudre nos problèmes. Nous avons migré les boîtes aux lettres vers O365 depuis une configuration hybride chez Rackspace. La boîte aux lettres utilisée pour l'envoi n'était pas auparavant un compte Exchange, mais en est devenu un après la migration. 

mySmtpClient = New SmtpClient("smtp.office365.com")
mySmtpClient.Port = 587
mySmtpClient.EnableSsl = True
mySmtpClient.Credentials = New System.Net.NetworkCredential("[email protected]", "password", "domain.com")
mySmtpClient.Send(Msg)

La configuration précédente ne nous obligeait pas à fournir un port ou à activer SSL, ni même à définir le domaine dans les paramètres de référence. J'espère que cela aidera les personnes qui doivent travailler avec des scripts VB pour automatiser leurs e-mails via SMTP avec Office 365.

10
Pawr

Lorsque vous effectuez cette intégration sur un fournisseur d'hébergement tiers, vous devez également fournir le nom de domaine.

SmtpClient client = new SmtpClient(SMTPSettings.Url, SMTPSettings.Port);
client.Credentials = new System.Net.NetworkCredential(SMTPSettings.UserName, SMTPSettings.Password, SMTPSettings.Domain);
1
ozkary

J'ai eu le même problème, ce qui a fonctionné pour moi a été d'utiliser System.Security.SecureString pour mettre le mot de passe au lieu de chaîne, exemple:

        System.Security.SecureString psw = new System.Security.SecureString();

        string PasswordGmail = "XXXXXX";

        foreach (char item in PasswordGmail.ToCharArray())
        {
            psw.AppendChar(item);
        }

        client.Credentials = new System.Net.NetworkCredential("[email protected]", psw); 
0
Luis Adrian