2011-03-15 3 views
0

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(); 
+0

Un bon programme open source pour faire des connexions TCP à partir de la ligne de commande est appelé "Netcat" –

Répondre

0

L'adresse SMTP et le port que vous êtes obligé de préciser est l'adresse et le port de l'application que vous souhaitez tester. Les e-mails sur SMTP sont dans la plupart des cas relayés du serveur au serveur sans aucune modification et en utilisant le même protocole de transport. Donc, que vous livriez directement à votre application ou à un serveur relais (comme le serveur de messagerie du FAI) n'a pas vraiment d'importance pour l'expéditeur. Il ne voit aucune différence. La différence est que le serveur de votre FAI n'est probablement pas en mesure de relayer l'e-mail à votre application car il nécessite un enregistrement MX dans DNS et un pare-feu/transfert de port correct vers votre application.

Vous pouvez même configurer un profil SMTP dans Outlook pour le livrer directement à votre application. Il suffit de spécifier l'application ip et le port en tant que serveur SMTP.

Pour utiliser telnet:

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

Hello! 
. 

Le serveur accusera chaque ligne que vous tapez, généralement avec le texte anglais.

Notez la ligne vide entre l'en-tête et le corps, et le point unique sur la dernière ligne pour terminer le message.

+0

cela ne fonctionne pas. Je reçois une erreur "Impossible d'ouvrir la connexion à l'hôte ..." – kacalapy

+0

Ensuite, vous n'écoutez pas sur le port. Essayez 'netstat -anb' et voyez si le programme écoute réellement sur le port. Vérifiez les paramètres du pare-feu. Telnet fonctionne à coup sûr. Syntaxe: 'telnet mail.messaging.microsoft.com 25'. J'espère que cela t'aides. :) –

Questions connexes