Je veux envoyer un message de courrier avec la classe Voici le code que j'utilise: p> mais il jette toujours une exception: p> Le serveur a commis une violation de protocole La réponse du serveur était: UGFZC3DVCMQ6 P>
BlockQuote> Je ne trouve pas la raison de cela. S'il vous plaît, si quelqu'un a fait face à quelque chose comme ça, dites-moi quoi faire. P> P> smtpclient code>.
8 Réponses :
mille couple sur Google pour ugfzc3dvcmq6 strong> p>
Il semble que le serveur attend de cryptage (avec base64) nom d'utilisateur / mot de passe p>
Notez que la base64 est un codage juste. Bien qu'un mot de passe de base64 n'est pas évident, il n'est pas crypté non plus. Alimentez "TXLQYSRZDZBYZA ==" dans opinionedgeek.com/dotnet/tools/base64decode et Out apparaît le «mot de passe».
UGFZC3DVCMQ6 est "Mot de passe:" Base 64 codé (sans guillemets), ce qui signifie que le mot de passe est probablement faux ou non envoyé codé. Essayez la base 64 encoder le mot de passe:
string password = Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes("Password));
Désolé les gars que l'erreur a disparu mais une nouvelle exception est lancée qui est une défaillance envoi de courrier ne savait pas quoi faire
Activer la journalisation pour system.net.mail. Ensuite, affichez le fichier journal. Cela vous montrera exactement ce qui se passe pendant la couche SMTP. P>
Voici un lien avec plus d'informations: P>
5 ans plus tard, c'était une aide énorme - trouvé que j'étais le braconnage de la connexion.
Ceci me regarde comme une authentification SmtpClient est d'une manière ou d'une autre, de sortir de l'étape. P>
Certains mécanismes d'authentification sont "Client: Demander Auth Auth avec nom d'utilisateur et mot de passe, Server: Succès / échec" D'autres "CLIENT: Demander l'authentification avec nom d'utilisateur, serveur: Demande de mot de passe, client: Répondre avec mot de passe, serveur: succès / échec" . p>
On dirait que SmtpClient attend le premier, tandis que votre serveur s'attend à ce dernier. P>
comme Dave Allaa Suggestion , un journal d'une session vous indiquerait quel mécanisme d'authentification Smtpclient tente d'utiliser, mais il dira également quels mécanismes d'authentification le serveur prend en charge. P>
Qu'est-ce qui se produit normalement, c'est que le serveur offre un certain nombre d'options d'authentification et que le client choisit lequel il va utiliser. Le comportement de là devrait être déterminé par le protocole choisi. J'espère que la classe SMTPClient s'est occupée de cela pour vous, mais je crains que je n'ai jamais utilisé cette classe particulière. P>
N'oubliez pas non plus - si vous allez poster un journal ici, passez à un mot de passe jetable avant de vous connecter la session, car un mot de passe texte codé codé de base64 peut être modifié de manière triviale sur le mot de passe de texte brut lisible humain. P>
Merci pour la réponse, je crois que c'est comme vous l'avez dit que le serveur s'attend à une info d'authentification BASE64
Cela ne fonctionne pas non plus, j'ai également vérifié dans le journal, mais cela ne montre aucune réponse de serveur. Peux-tu aider s'il te plait?
J'ai eu le même problème, car mon cas était pour définir l'utilisateur @ domain au lieu de l'utilisateur, je veux dire
code ancien p> nouveau code P > new NetworkCredential("UserName", "Password");
Cela peut également arriver lorsque vous ne fournissez simplement pas le mot de passe. Dans mon cas, j'utilisais des informations d'identification à partir d'un bloc web.config SMTP et sur mon serveur de déploiement (à l'aide de Octopus Deploy) avait oublié de remplir l'attribut mot de passe. P>
avait le même problème. Résolu dans les étapes suivantes:
1) Découvrez, quel serveur offre l'authentification SMTP en se connectant au serveur SMTP à l'aide de Telnet ou de mastic ou de tout autre terminal: (xxx.yyy.zzz.aaa = adresse IP de Le serveur SMTP, 587 = Numéro de port) P> FieldInfo transport = smtpClient.GetType().GetField("transport", BindingFlags.NonPublic | BindingFlags.Instance);
FieldInfo authModules = transport.GetValue(smtpClient).GetType().GetField("authenticationModules",BindingFlags.NonPublic | BindingFlags.Instance);
Array modulesArray = authModules.GetValue(transport.GetValue(smtpClient)) as Array;
foreach (var module in modulesArray)
{
Console.WriteLine(module.ToString());
}
// System.Net.Mail.SmtpNegotiateAuthenticationModule
// System.Net.Mail.SmtpNtlmAuthenticationModule
// System.Net.Mail.SmtpDigestAuthenticationModule
// System.Net.Mail.SmtpLoginAuthenticationModule
// overwrite the protocols that you don't want
modulesArray.SetValue(modulesArray.GetValue(3), 0);
modulesArray.SetValue(modulesArray.GetValue(3), 1);
modulesArray.SetValue(modulesArray.GetValue(3), 2);
Il y a quelques problèmes avec ce qui précède (certainement à partir de .netcore 2.1, les champs ont un soulignement qui les a précédé. Donc, les besoins ci-dessus ont besoin de "_transport" et de "_AuthenticationModules" autrement plus ou moins de travail.
Pour quelqu'un d'autre qui survolez celui-ci sur Google..â J'ai corrigé cela en fournissant mon nom d'utilisateur dans le format "Nom d'utilisateur" au lieu de "Domaine \ Nom d'utilisateur"
$Credential = Get-Credential Send-MailMessage -SmtpServer exchange.contoso.com -Credential $Credential -From 'user@contoso.com' -To 'recipient@domain.com' -Subject 'Test email' -Port 587 -UseSsl