Авторизация на SMTP сервере
И всё то было ничего, до тех пор пока не возникла необходимость использования другого SMTP сервера, который зараза требует авторизации.
---------------------------------
1. Вообщем теперь после HELO, я отправляю серверу AUTH LOGIN
На что сервер мне отвечает: 334 VXNlcm5hbWU6
Если я серверу просто логин свой отправляю - он его не принимает.
Я так понимаю вот из этого VXNlcm5hbWU6 и своего логина мне надо
как-то сформировать ответ серверу. Как?
2. Когда искал решение этой проблемы - накнулся на похожую
тему на форуме, где предлогалось здороваться с сервером не
HELO, а EHLO. Команды EHLO в RFC 821 я вообще не нащёл - чем она
отличается от HELO и стоит ли её использовать?
www.protocols.ru/files/RFC/RFC-2821.pdf [/COLOR]
изучаем. RFC-821 давно устарел ;)
просто логин не надо. надо адрес, ЕМНИП. просто вводить login и пароль plain текстом - не канает их надо в base64 конвертить в виде \0username\0password. например тут
http://www.webpan.com/customers/Email/base64_conversion.htm
или
[COLOR=#008000]
изучаем. RFC-821 давно устарел ;)
просто логин не надо. надо адрес, ЕМНИП. просто вводить login и пароль plain текстом - не канает их надо в base64 конвертить в виде \0username\0password. например тут
http://www.webpan.com/customers/Email/base64_conversion.htm
или
Код:
perl -MMIME::Base64 -e 'print encode_base64("\0username\0password");'
Переделал, так:
Код:
//...
send(m_smtpsocket, m_base64Login, strlen(m_base64Login), 0);
send(m_smtpsocket, "\r\n", 2, 0);
recv(m_smtpsocket, szAnswer, 255, 0);
if(!isReplay(szAnswer, "334"))
{
//...
}
send(m_smtpsocket, m_base64Pass, strlen(m_base64Pass), 0);
send(m_smtpsocket, "\r\n", 2, 0);
recv(m_smtpsocket, szAnswer, 255, 0);
if(!isReplay(szAnswer, "235"))
{
//...
}
send(m_smtpsocket, m_base64Login, strlen(m_base64Login), 0);
send(m_smtpsocket, "\r\n", 2, 0);
recv(m_smtpsocket, szAnswer, 255, 0);
if(!isReplay(szAnswer, "334"))
{
//...
}
send(m_smtpsocket, m_base64Pass, strlen(m_base64Pass), 0);
send(m_smtpsocket, "\r\n", 2, 0);
recv(m_smtpsocket, szAnswer, 255, 0);
if(!isReplay(szAnswer, "235"))
{
//...
}
Теперь работает. Сервер отвечает - 235 Authentication successful.