Как я могу отправить сообщение SMTP на конкретный IP и порт? - PullRequest
0 голосов
/ 15 марта 2011

Я хочу протестировать доморощенный сервис, который прослушивает определенный порт, такой как 12345, и анализирует части сообщения smtp, такие как from, to, body ...

Я хочу создать тестовый комплект для моего слушателя.и у меня возникают проблемы при создании somethign, который будет генерировать сообщения smtp по определенному номеру порта на конкретный ip (ip / порт, на котором работает мой слушатель)

Я пытался отправить через консольное приложение .netпотому что я вынужден указать SMTP-сервер для отправки моих сообщений и тот, который у меня не будет работать для этого из-за безопасности.

если я правильно помню, я должен быть в состоянии telnet или так или иначе использоватькомандная строка для отправки писем на ip и порт.По сути, мне все равно, как это делается, если я могу каким-либо образом отправлять почтовые сообщения моему слушателю.

мое приложение отправки:

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

    MailMessage message = new MailMessage("sender@ml.com", "recep@ml.com");
    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();

1 Ответ

0 голосов
/ 15 марта 2011

SMTP-адрес и порт, которые вы должны указать, - это адрес и порт приложения, которое вы хотите протестировать.

Электронные письма через SMTP в большинстве случаев передаются с сервера на сервер без каких-либо изменений и с использованием одного и того же транспортного протокола.То, что вы доставляете данные прямо в свое приложение или на сервер ретрансляции (например, почтовый сервер ISP), для отправителя не имеет большого значения.Он не видит разницы.

Разница в том, что сервер вашего интернет-провайдера, вероятно, не может ретранслировать электронную почту в ваше приложение, так как ему требуется MX-запись в DNS и правильная межсетевая защита / перенаправление портов в ваше приложение.

Вы даже можете настроить профиль SMTP в Outlook для прямой доставки в ваше приложение.Просто укажите ip и порт приложения в качестве SMTP-сервера.

Чтобы использовать telnet:

telnet ip port
helo me
mail from: <some@domain.com>
rcpt to: <some@domain.com>
data
Subject: Ho Ho Ho
From: Santa 

Hello!
.

Сервер будет подтверждать каждую введенную вами строку, обычно с текстом на английском языке.

Обратите внимание на пустую строку между заголовком и телом и одну точку в последней строке для завершения сообщения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...