Dépannage “Le serveur a commis une violation de protocole” lors de l'envoi de mail avec SmtpClient
Je veux envoyer un message électronique avec le SmtpClient
classe.
Voici le code que j'utilise:
SmtpClient smtpClient = new SmtpClient("Host",25);
NetworkCredential basicCredential =
new NetworkCredential("UserName", "Password");
MailMessage message = new MailMessage();
MailAddress fromAddress = new MailAddress("[email protected]");
smtpClient.UseDefaultCredentials = false;
smtpClient.Credentials = basicCredential;
message.From = fromAddress;
message.Subject = "test send";
message.IsBodyHtml = true;
message.Body = "<h1>hello</h1>";
message.To.Add("[email protected]");
smtpClient.Send(message);
Mais il jette toujours une exception:
Le serveur commis une violation de protocole de La réponse du serveur est: UGFzc3dvcmQ6
Je ne trouve pas la raison. S'il vous plaît, si quelqu'un a été confronté à quelque chose comme cela, dites-moi quoi faire.
Vous devez vous connecter pour publier un commentaire.
Cela me semble SmtpClient d'authentification est en quelque sorte de sortir de l'étape.
Certains mécanismes d'authentification sont "Client: demande d'authentification avec nom d'utilisateur et le mot de passe, Serveur: succès/échec" autres "Client: demande d'authentification avec nom d'utilisateur, Serveur: demande de mot de passe, le Client: répondre avec un mot de passe, Serveur: succès/échec".
Il ressemble SmtpClient attend l'ancien, tandis que votre serveur s'attend à ce dernier.
Comme dave wenta suggéré, un journal d'une session vous dira ce auth mécanisme SmtpClient est d'essayer de les utiliser, mais aussi de dire ce que l'auth mécanismes le serveur prend en charge.
Ce qui se passe habituellement, c'est que le serveur propose un certain nombre de authetication options, et le client choisit lequel il va utiliser. Le comportement de il devrait être déterminé par le protocole choisi. J'espère que la classe SmtpClient a pris soin de cela pour vous, mais je crains que je n'ai jamais utilisé cette classe particulière.
Aussi rappelez - vous, Si vous allez poster un journal d'ici, de modifier un mot de passe jetable avant de vous connecter à la session, en base64 texte simple mot de passe peut être trivialement modifié lisible par l'homme de la plaine de texte mot de passe.
J'ai eu le même problème, pour mon cas c'était pour le réglage de l'utilisateur@domaine à la place de l'utilisateur, je veux dire
Ancien code
Nouveau code
UGFzc3dvcmQ6 est "Mot de passe:" encodé en base 64 (sans les guillemets), c'est le mot de passe est probablement mal ou de ne pas envoyer de codage. Essayez de codage en base 64 le mot de passe:
Activer la journalisation pour le Système.Net.Mail. Puis afficher le fichier journal. Cela va vous montrer exactement ce qui se passe au cours de la couche SMTP.
Voici un lien avec plus d'infos:
http://systemnetmail.com/faq/4.10.aspx
des milliers de frapper sur google pour UGFzc3dvcmQ6
il semble que le serveur s'attendre à cryptés(base64) nom d'utilisateur/mot de passe
Eu le même problème. Résolu en suivant les étapes suivantes:
1) trouver, ce que le serveur propose pour l'Authentification SMTP par la connexion au Serveur SMTP à l'aide de Telnet ou de mastic ou de tout autre terminal:
(xxx.yyy.zzz.aaa = adresse IP du Serveur SMTP 587 = numéro de port)
< Serveur réponses avec "220 protocole + version + temps"
< Serveur affiche la liste des fonctionnalités par exemple
Le client SMTP essaie de prendre le plus de protocole sécurisé en premier. Dans mon cas:
Il semble que si le client SMTP essaie NTLM alors que le serveur tente d'exécuter la CONNEXION.
Avec un hack (cf. https://blogs.msdn.microsoft.com/knom/2008/04/16/hacking-system-net-mail-smtpclient/), tous les protocoles peut être désactivé à l'exception de celui du serveur suppose (LOGIN dans ce cas):
Cela peut aussi arriver que vous ne sont tout simplement pas fournir le mot de passe. Dans mon cas, j'ai été en utilisant les informations d'identification à partir d'un site web.config smtp bloc et sur mon serveur de déploiement (à l'aide de poulpe déployer) avait oublié de remplir l'attribut de mot de passe.
Pour quelqu'un d'autre de venir à travers cette sur google.. j'ai corrigé cela en fournissant mon nom d'utilisateur dans le "nom d'utilisateur" format au lieu de "DOMAINE\nom d'utilisateur"