私は、指定されたSMTPサーバーを検証する必要があるプロジェクト、つまりテキストボックスユーザーで詳細を提供してから、テストボタンをクリックするプロジェクトを進めています。私は、ユーザーが入力したサーバーがSMTPサーバーかどうかを確認したいのですか?SMTPサーバーを検証する方法
任意のアイデア??
私は、指定されたSMTPサーバーを検証する必要があるプロジェクト、つまりテキストボックスユーザーで詳細を提供してから、テストボタンをクリックするプロジェクトを進めています。私は、ユーザーが入力したサーバーがSMTPサーバーかどうかを確認したいのですか?SMTPサーバーを検証する方法
任意のアイデア??
SMTPポートに接続し、 "220"で始まり "SMTP"という文字が含まれている行を返すようにしてください。典型的な例応答は次のようになります。
220 prod.monadic.cynic.net ESMTP Postfix (2.5.5)
そして、礼儀正しくするとハングアップするために、「Rの\ nを\ QUIT
」を送信します。
ユーザーがメッセージを配信する可能性があることをテストするなど、必要に応じてさらにテストを行うことができます。このためには、ホスト名(または実際の文字列)でHELOコマンドを送信し、ユーザーの電子メールアドレスを使用するMAIL FROM
コマンドとRCPT TO:<[email protected]>
を送信します。その時点でほとんどのサーバーは、中継が許可されていないかどうかを通知します。 (後でメールを送信するコンピュータからこれをやっていると仮定しています)。QUIT
の後に、DATA
コマンドを発行し、メッセージデータを に送信するのではなく、何も送信されません。
「netcat」コマンドを使用してシェルから実行されたセッションの例です。私のサーバーは存在していますが、ランダムなIPアドレスの人のメールは中継されません。
$ nc prod.monadic.cynic.net. 25 220 prod.monadic.cynic.net ESMTP Postfix (2.5.5) HELO cynic.net 250 prod.monadic.cynic.net MAIL FROM:<[email protected]> 250 2.1.0 Ok RCPT TO:<[email protected]> 554 5.7.1 <[email protected]>: Relay access denied QUIT 221 2.0.0 Bye $
あなたは適切な例外処理と、おそらくもタイムアウトを設定すると、この迅速なコードを改善することができます - それは接続できない場合に失敗するのに約15秒かかりますが、それは/ TCPの限界かもしれませんIPハンドシェイク。
そして、Curt提案としてQUIT
コマンドを送信するといいでしょう。
private bool ValidSMTP(string hostName)
{
bool valid = false;
try
{
TcpClient smtpTest = new TcpClient();
smtpTest.Connect(hostName, 25);
if (smtpTest.Connected)
{
NetworkStream ns = smtpTest.GetStream();
StreamReader sr = new StreamReader(ns);
if (sr.ReadLine().Contains("220"))
{
valid = true;
}
smtpTest.Close();
}
}
catch
{
}
return valid;
}
これ以上待ちたくない場合は、smtpTest.ReceiveTimeout = 500と設定します。 – ulrichb
ありがとうございます - これはPOPでも同様にちょうどポートと220の代わりに、私は+ OKを探します。 –
Curtがすでに述べたように、接続を試みてポートを開くことができるかどうかを確認します。あなたが応答を持っているかどうか見てください、しかし、設定されている場合、サーバーはあなたに最初に何かを送信しません。ですから、最初に 'HELO'または 'EHLO'コマンドで始まり、その応答を確認してください。確認のために試すことができるコマンドは、RFC 821,2821、および5321にリストされています。 – Oliver
サーバは実際に接続するとすぐに最初に220行を送ります。これをより明確にするために、上記の例を追加しました。 –
こんにちはCurtこんにちは、これは本当に最初の部分を正しく追うことができますが、私はsynatx RCPTを理解することができません。<[email protected]> C#でコードをいくつか与えることができますか? –