singlepost

Помогите разобраться с SMTP протоколом << На главную или назад  

Итак дано:
Два почтовых ящика, один из которых находится на mail.ru.
Необходимо:
С ящика на мейл.ру отправить простенькое письмо (без всяких аттачей) на второй ящик, который может находится на любом другом почтовом сервисе.
При этом не подходит использование классов MFC, VCL и прочих библиотек. Необходимо всё это реализовать на WinAPI и Сокетах.

С работой с сокетами знаком. Изучая сэмлы, несоставило труда составить код:
<…>
while (MailMess[iMsg])
{
send(sock, MailMess[iMsg], lstrlen(MailMess[iMsg]), 0);
iLength = recv(sock, sBuff, sizeof(sBuff), 0);
sBuff[iLength] = '\0';
iMsg++;
}
<…>

Единственное что осталось, правильно построить запрос. Итак:
"HELO 94.100.177.1"
Ответ от сервера: "220 mail.ru ESMTP Thu, 04 Feb 2010 10:20:16 +0300"
Отправляем следущюю строчку: "MAIL FROM:<mail@mail.ru>"
И …всё. Ответ мэйловский сервер не присылает. Молчит порядка 30 секунд после чего ответ всё таки приходит :
"421 mx27.mail.ru: SMTP command timeout – closing connection"

Помогите правильно построить запрос?

8 ответов в теме “Помогите разобраться с SMTP протоколом”

  1. 8
    Никита Пестин ответил:

    Ещё один вопрос:
    Как должно выглядеть само тело сообщения, чтобы он не было блокировано антиспамом?

  2. 7
    Никита Пестин ответил:

    Ну откуда такие деньги у бедных студентов.:))

    Могу дать только сердечную благодарность. Цель задания достигнута.

  3. 6
    Игорь Маранчак ответил:

    авторизация, вроде, идет точно так же, как и для приема сообщений
    те же поля

  4. 5
    Влад Темный ответил:

    <b>S:</b> 220 novicemachine Microsoft ESMTP MAIL Service, Version: 6.0.3790.1830 ready at
    Mon, 14 Jul 2008 12:10:19 +0400<br/>
    <b>C:</b> EHLO<br/>
    <b>S:</b> 250-novicemachine Hello [127.0.0.1]<br/>
    <b>S:</b> 250-AUTH=LOGIN<br/>
    <b>S:</b> 250-AUTH LOGIN<br/>
    <b>S:</b> 250-TURN<br/>
    <b>S:</b> 250-SIZE 2097152<br/>
    <b>S:</b> 250-ETRN<br/>
    <b>S:</b> 250-PIPELINING<br/>
    <b>S:</b> 250-DSN<br/>
    <b>S:</b> 250-ENHANCEDSTATUSCODES<br/>
    <b>S:</b> 250-8bitmime<br/>
    <b>S:</b> 250-BINARYMIME<br/>
    <b>S:</b> 250-CHUNKING<br/>
    <b>S:</b> 250-VRFY<br/>
    <b>S:</b> 250 OK<br/>
    <b>C:</b> AUTH LOGIN<br/>
    <b>S:</b> 334 VXNlcm5hbWU6<br/>
    <b>C:</b> Y3Jhc2g=<br/>
    <b>S:</b> 334 UGFzc3dvcmQ6<br/>
    <b>C:</b> Y3Jhc2g=<br/>
    <b>S:</b> 235 2.7.0 Authentication successful<br/>
    <b>C:</b> MAIL FROM:&lt;novice@localhost.ru&gt;<br/>
    <b>S:</b> 250 2.1.0 novice@localhost.ru….Sender OK<br/>
    <b>C:</b> RCPT TO:&lt;novice@localhost.ru&gt;<br/>
    <b>S:</b> 250 2.1.5 novice@localhost.ru<br/>
    <b>C:</b> D?4??4??1?<br/>
    <b>S:</b> 354 Start mail input; end with &lt;CRLF&gt;.&lt;CRLF&gt;<br/>
    <b>C:</b> Message text<br/>
    <b>C:</b> .<br/>
    <b>S:</b> 250 2.6.0 &lt;NOVICEMACHINEILH4ekA00000004@novicemachine&gt; Queued mail for delivery<br/>
    <b>C:</b> QUIT<br/>
    <b>S:</b> 221 2.0.0 novicemachine Service closing transmission channel

  5. 4
    Влад Темный ответил:

    мы в обоих случаях сначала приветствуем SMTP-сервера.

    В первом случае это делается командой HELO. Во втором – EHLO. Команда EHLO говорит серверу о том, что нужно вывести список всех доступных расширений (в том числе AUTH, если в сервере поддерживается аутентификация, что мы и видим).

    В случае без авторизации все просто: приветствуем сервера, говорим адрес отправителя, получателя, пишем сообщение и отсоединяемся.

    При авторизации процесс немного сложнее: приветствуем сервера, авторизуемся (говорим логин и пароль), говорим адрес отправителя, получателя, пишем сообщение и отсоединяемся.

    Чтобы начать авторизацию, нужно задать команду AUTH LOGIN, хотя это не всегда именно LOGIN. В некоторых случаях может быть PLAIN и т.д., т.е. тут задается механизм авторизации, который зависит от сервера. В нашем случае это LOGIN (и в случае mail.ru кстати тоже).

    Далее сервер нам ответил закодированным (алгоритмом base64) сообщением VXNlcm5hbWU6 с кодом 334 (коды, начинающиеся на 2 или 3, говорят об успешности предыдущего запроса клиента). Это сообщение, если его раскодировать: «Username:».

    Дальше мы ему сказали: Y3Jhc2g=, т.е. это логин «novice», закодированный base64. После этого он спросил пароль: 334 UGFzc3dvcmQ6. Мы ему ответили тем же: Y3Jhc2g=.

    Дальше сервер нас обрадовал: 235 2.7.0 Authentication successful – аутентификация прошла успешно. Ну а потом уже процесс аналогичен отправке письма без аутентификации.

  6. 3
    Влад Темный ответил:

    с тебя 15$ за услуги гугла.

  7. 2
    Влад Темный ответил:

    а логин и пароль не надо отправлять? сорри если не то.. сам сейчас развлекаюсь но зато все легально и без такого минимализма….

    плюс видел исходник на делфи.

  8. 1
    Никита Пестин ответил:

    Так вот я и думаю, что сейчас надо отправлять авторизационные данные, но как они должны выглядеть? Так и ненашёл подходящий пример.

Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.