2011-03-15 167 views
0

我想测试一个家庭服务,收听像12345这样的特定端口,并解析出来自身体的smtp消息部分...如何将smtp消息发送到特定的IP和端口?

我想为我的听众制作一个测试工具,麻烦创建somethign,将生成smtp消息通过特定的端口号到特定的ip(我的侦听器正在运行的ip /端口)

我试图通过.net控制台应用程序发送,它失败,因为我被迫指定一个smtp服务器来发送我的消息通过和我不会为此工作,因为安全。

如果我记得没错,我应该可以通过telnet或其他方式使用命令行将电子邮件发送到IP和端口。基本上我不在乎如何做到这一点,只要我能够以某种方式发送邮件给我的听众。

我发送的应用程序:

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” – 2011-03-15 20:23:44

回答

0

的SMTP地址,你不得不指定端口是要测试的应用程序的地址和端口。

通过SMTP的电子邮件在大多数情况下从服务器转发到服务器,无需任何修改并使用相同的传输协议。因此,您直接发送到您的应用程序或中继服务器(如ISP的电子邮件服务器)对于发件人无关紧要。它没有区别。

不同的是,因为它需要MX记录在DNS中,正确的防火墙/ portforwarding到您的应用程序您的ISP的服务器可能无法中继电子邮件到您的应用程序。

您甚至可以在Outlook中配置SMTP配置文件以直接传送到您的应用程序。只需指定应用程序的IP和端口为SMTP服务器。

使用Telnet:

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

Hello! 
. 

服务器将确认每次输入,通常与英文文本行。

注意标题和正文之间的空行,以及最后一行结束消息的单个点。

+0

,这是行不通的。我得到一个“无法打开连接到主机...”的错误 – kacalapy 2011-03-15 21:09:38

+0

然后你不在端口上监听。尝试'netstat -anb'并查看程序是否实际在端口上侦听。检查防火墙设置。 Telnet确实有效。语法:'telnet mail.messaging.microsoft.com 25'。希望这可以帮助。 :) – 2011-03-16 06:54:49

相关问题