8

SmtpClientクラスでメールメッセージを送信したい。

私が使用するコードは次のとおりです。

SmtpClient smtpClient = new SmtpClient("Host",25);
NetworkCredential basicCredential =
new NetworkCredential("UserName", "Password");
MailMessage message = new MailMessage();
MailAddress fromAddress = new MailAddress("me@domain.com");
smtpClient.UseDefaultCredentials = false;
smtpClient.Credentials = basicCredential;
message.From = fromAddress;
message.Subject = "test send";
message.IsBodyHtml = true;
message.Body = "<h1>hello</h1>";
message.To.Add("mail@domain.com");
smtpClient.Send(message);

ただし、常に例外がスローされます。

サーバーがプロトコル違反を犯しました サーバーの応答は次のとおりです: UGFzc3dvcmQ6

その理由がわかりません。誰かがこのようなことに直面した場合は、どうすればよいか教えてください。

4

8 に答える 8

8

私は同じ問題を抱えていました.私の場合は、ユーザーの代わりにuser@domainを設定するためでした.

古いコード

new NetworkCredential("UserName@domain.com", "Password");

新しいコード

new NetworkCredential("UserName", "Password");
于 2014-03-09T10:49:58.440 に答える
5

これは、SmtpClient 認証が何らかの形で脱調しているように見えます。

一部の認証メカニズムは、「クライアント: ユーザー名とパスワードで認証を要求、サーバー: 成功/失敗」、その他は「クライアント: ユーザー名で認証を要求、サーバー: パスワードを要求、クライアント: パスワードで応答、サーバー: 成功/失敗」です。

サーバーが後者を期待しているのに対し、SmtpClient は前者を期待しているようです。

dave goinga が示唆したように、セッションのログは、SmtpClient が使用しようとしている認証メカニズムを示しますが、サーバーがサポートする認証メカニズムも示します。

通常、サーバーは多くの認証オプションを提供し、クライアントはどれを使用するかを選択します。そこからの動作は、選択したプロトコルによって決定されます。SmtpClient クラスがそれを処理してくれることを願っていますが、残念ながら私はその特定のクラスを使用したことがありません。

また、覚えておいてください-ここにログを投稿する場合は、セッションを記録する前に使い捨てのパスワードに変更してください.base64でエンコードされたプレーンテキストのパスワードは、簡単に人間が読めるプレーンテキストのパスワードに戻すことができます.

于 2010-11-11T16:21:56.617 に答える
4

UGFzc3dvcmQ6 は "Password:" base 64 エンコード (引用符なし) です。つまり、パスワードが間違っているか、エンコードされていない可能性があります。パスワードの base 64 エンコードを試します。

string password = Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes("Password));
于 2010-03-04T15:52:22.263 に答える
2

System.Net.Mail のログを有効にします。次に、ログ ファイルを表示します。これにより、SMTP 層で何が起こっているかが正確にわかります。

詳細情報へのリンクは次のとおりです。

http://systemnetmail.com/faq/4.10.aspx

于 2010-03-05T13:35:05.857 に答える
1

同じ問題がありました。次の手順で解決しました:1)Telnetまたはパテまたはその他の端末を使用してSMTPサーバーに接続することにより、サーバーがSMTP認証に提供するものを見つけます:

telnet xxx.yyy.zzz.aaa 587 

(xxx.yyy.zzz.aaa = SMTP サーバーの IP アドレス、587 = ポート番号)

< サーバーは「220 プロトコル + バージョン + 時間」で応答します

ehlo testing

< サーバーは機能のリストを表示します。

250-AUTH NTLM CRAM-MD5 LOGIN

SMTP クライアントは、最も安全なプロトコルを最初に採用しようとします。私の場合:

1. System.Net.Mail.SmtpNegotiateAuthenticationModule
2. System.Net.Mail.SmtpNtlmAuthenticationModule
3. System.Net.Mail.SmtpDigestAuthenticationModule
4. System.Net.Mail.SmtpLoginAuthenticationModule

サーバーが LOGIN を実行しようとしている間に、SMTP クライアントが NTLM を試行しているように見えます。

ハッキング ( https://blogs.msdn.microsoft.com/knom/2008/04/16/hacking-system-net-mail-smtpclient/を参照) を使用すると、サーバー以外のすべてのプロトコルを無効にすることができます。仮定します(この場合はログイン):

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);
于 2016-06-15T17:28:46.207 に答える
1

UGFzc3dvcmQ6の Google での数千のヒット

サーバーは暗号化された(base64で)ユーザー名/パスワードを期待しているようです

于 2010-03-04T15:42:40.227 に答える
0

Googleでこれに遭遇した他の人のために..「ドメイン\ユーザー名」の代わりに「ユーザー名」形式でユーザー名を指定することでこれを修正しました

$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
于 2018-07-27T10:15:03.533 に答える