2011-03-15 23 views
0

12345のような特定のポートをリッスンし、from、to、bodyなどのsmtpメッセージパーサーを解析する自宅のサービスをテストしたい場合...特定のIPとポートにsmtpメッセージを送信するにはどうすればよいですか?

私はリスナー用のテストハーネスを作りたい特定のポート番号(特定のIP(リスナーが実行されているIP /ポート)にsmtpメッセージを生成する)を作成するときに問題が発生する。ネットコンソールアプリケーション経由で送信しようとしたが、強制的に失敗する。私のメッセージを送信するためにsmtpサーバを指定してください、そして、私はセキュリティのためにこれのために働かないでしょう。

正しいことを覚えていれば、私はtelnetや他の方法でコマンドラインを使ってipとportにメールを送ることができるはずです。基本的に私は何とか私のリスナーにメールメッセージを送ることができる限り、これがどのように行われるか気にしません。

私送信アプリ:

int count = 3; 
for (int i = 1; i <= count; i++) 
{ 

    MailMessage message = new MailMessage("[email protected]", "[email protected]"); 
    SmtpClient client = new SmtpClient(IPAddress.Loopback.ToString(), 8000); 
    message.Body = "test mail #" + i.ToString(); 
    client.Send(message); 

    Console.WriteLine("mail " + i.ToString() + " Sent"); 
    Console.ReadLine(); 
} 
Console.WriteLine("DONE!"); 

私のリスナーアプリ:

TcpListener listener = new TcpListener(IPAddress.Loopback, 8000); 
TcpClient client; 
NetworkStream ns; 

listener.Start(); 

Console.WriteLine("Awaiting connection..."); 
client = listener.AcceptTcpClient(); 
Console.WriteLine("Connection accepted!"); 

ns = client.GetStream(); 

using (StreamWriter writer = new StreamWriter(ns)) 
{ 
writer.WriteLine("220 localhost SMTP server ready."); 
writer.Flush(); 

using (StreamReader reader = new StreamReader(ns)) 
{ 
    string response = reader.ReadLine(); 

    if (!response.StartsWith("HELO") && !response.StartsWith("EHLO")) 
    { 
    writer.WriteLine("500 UNKNOWN COMMAND"); 
    writer.Flush(); 
    ns.Close(); 
    return; 
    } 

    string remote = response.Replace("HELO", string.Empty).Replace("EHLO", string.Empty).Trim(); 

    writer.WriteLine("250 localhost Hello " + remote); 
    writer.Flush(); 

    response = reader.ReadLine(); 

    if (!response.StartsWith("MAIL FROM:")) 
    { 
    writer.WriteLine("500 UNKNOWN COMMAND"); 
    writer.Flush(); 
    ns.Close(); 
    return; 
    } 

    remote = response.Replace("RCPT TO:", string.Empty).Trim(); 
    writer.WriteLine("250 " + remote + " I like that guy too!"); 
    writer.Flush(); 

    response = reader.ReadLine(); 

    if (!response.StartsWith("RCPT TO:")) 
    { 
    writer.WriteLine("500 UNKNOWN COMMAND"); 
    writer.Flush(); 
    ns.Close(); 
    return; 
    } 

    remote = response.Replace("MAIL FROM:", string.Empty).Trim(); 
    writer.WriteLine("250 " + remote + " I like that guy!"); 
    writer.Flush(); 

    response = reader.ReadLine(); 

    if (response.Trim() != "DATA") 
    { 
    writer.WriteLine("500 UNKNOWN COMMAND"); 
    writer.Flush(); 
    ns.Close(); 
    return; 
    } 

    writer.WriteLine("354 Enter message. When finished, enter \".\" on a line by itself"); 
    writer.Flush(); 

    int counter = 0; 
    StringBuilder message = new StringBuilder(); 

    while ((response = reader.ReadLine().Trim()) != ".") 
    { 
    message.AppendLine(response); 
    counter++; 

    if (counter == 1000000) 
    { 
     ns.Close(); 
     return; // Seriously? 1 million lines in a message? 
    } 
    } 

    writer.WriteLine("250 OK"); 
    writer.Flush(); 
    ns.Close(); 
    // Insert "message" into DB 
    Console.WriteLine("Received message:"); 
    Console.WriteLine(message.ToString()); 
} 
} 

Console.ReadKey(); 
+0

コマンドラインからTCP接続を行うための素晴らしいオープンソースプログラムは "Netcat"と呼ばれます –

答えて

0

あなたが指定することを余儀なくされているSMTPアドレスとポートを使用して、テストするアプリケーションのアドレスとポートです。

SMTP経由のメールは、ほとんどの場合、変更せずに同じ転送プロトコルを使用して、サーバー間で中継されます。したがって、アプリケーションやリレーサーバー(ISPの電子メールサーバーなど)に直接配信することは、送信者にとって本当に重要なことではありません。違いは見えません。

違いは、あなたのISPのサーバーは、おそらくDNSにMXレコードが必要で、アプリケーションへのファイアウォール/ポート転送が正しく行われているため、電子メールをアプリケーションに中継できないことです。

Outlookでアプリケーションに直接配信するようにSMTPプロファイルを構成することもできます。 SMTPサーバーとしてapp ipとportを指定するだけです。

のtelnet使用するには:サーバーは通常、英語のテキストで、あなたが入力した各ラインを確認します

 
telnet ip port 
helo me 
mail from: <[email protected]> 
rcpt to: <[email protected]> 
data 
Subject: Ho Ho Ho 
From: Santa 

Hello! 
. 

を。

ヘッダーと本文の間の空白行と、最後の行の単一ドットがメッセージを終了することに注意してください。

+0

これは動作しません。私は "ホストへの接続を開くことができませんでした..."エラー – kacalapy

+0

あなたはポートでリッスンしていません。 'netstat -anb'を試して、プログラムが実際にポートでリッスンしているかどうか確認してください。ファイアウォールの設定を確認するTelnetは確実に機能します。構文: 'telnet mail.messaging.microsoft.com 25'。お役に立てれば。 :) –

関連する問題