Итак дано:
Два почтовых ящика, один из которых находится на 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"
Помогите правильно построить запрос?
5 февраля 2010 в 13:04
Ещё один вопрос:
Как должно выглядеть само тело сообщения, чтобы он не было блокировано антиспамом?
4 февраля 2010 в 13:03
Ну откуда такие деньги у бедных студентов.:))
Могу дать только сердечную благодарность. Цель задания достигнута.
4 февраля 2010 в 10:04
авторизация, вроде, идет точно так же, как и для приема сообщений
те же поля
4 февраля 2010 в 10:04
<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:<novice@localhost.ru><br/>
<b>S:</b> 250 2.1.0 novice@localhost.ru….Sender OK<br/>
<b>C:</b> RCPT TO:<novice@localhost.ru><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 <CRLF>.<CRLF><br/>
<b>C:</b> Message text<br/>
<b>C:</b> .<br/>
<b>S:</b> 250 2.6.0 <NOVICEMACHINEILH4ekA00000004@novicemachine> Queued mail for delivery<br/>
<b>C:</b> QUIT<br/>
<b>S:</b> 221 2.0.0 novicemachine Service closing transmission channel
4 февраля 2010 в 10:04
мы в обоих случаях сначала приветствуем 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 – аутентификация прошла успешно. Ну а потом уже процесс аналогичен отправке письма без аутентификации.
4 февраля 2010 в 10:04
с тебя 15$ за услуги гугла.
4 февраля 2010 в 10:03
а логин и пароль не надо отправлять? сорри если не то.. сам сейчас развлекаюсь но зато все легально и без такого минимализма….
плюс видел исходник на делфи.
4 февраля 2010 в 10:03
Так вот я и думаю, что сейчас надо отправлять авторизационные данные, но как они должны выглядеть? Так и ненашёл подходящий пример.