Je veux tester un service développé à la maison qui écoute un port spécifique comme 12345 et analyse les parties de message smtp comme de, à, le corps ...Comment puis-je envoyer un message smtp à une adresse IP et à un port partiels?
Je veux faire un harnais de test pour mon auditeur et j'ai Problème lors de la création de quelque chose qui génèrera des messages smtp sur un numéro de port spécifique vers une adresse IP spécifique (l'ip/port où mon écouteur s'exécute)
J'ai essayé d'envoyer via une application console .net et cela échoue parce que je suis obligé de spécifiez un serveur smtp pour envoyer mes messages et celui que je n'ai pas pour cela pour des raisons de sécurité. Si je me souviens bien, je devrais être capable de telnet ou d'une manière ou d'une autre utiliser la ligne de commande pour envoyer des emails à un ip et un port. Fondamentalement, je ne m'inquiète pas comment cela se fait aussi longtemps que je suis capable d'envoyer en quelque sorte des messages à mon auditeur.
mon application envoyer:
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!");
mon application auditeur:
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();
Un bon programme open source pour faire des connexions TCP à partir de la ligne de commande est appelé "Netcat" –