我想测试一个家庭服务,收听像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();
一个很好的开源程序,用于通过命令行建立TCP连接,被称为“Netcat” – 2011-03-15 20:23:44