Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   smtp отправка почты - AUTH LOGIN - ошибка 500 (( (https://forum.antichat.xyz/showthread.php?t=171542)

isqad88 17.01.2010 18:12

smtp отправка почты - AUTH LOGIN - ошибка 500 ((
 
Здравствуйте вот написал на Visual C++ 6.0 пример отправки почты на mail.ru:
Код:

#include <iostream>
#include <winsock2.h>

using namespace std;

int main()
{
        int err;
       
        WSADATA wsaData;
        SOCKET s;
        hostent *d_addr;
        struct sockaddr_in addr;
        char text[1024];//áóôåð äàííûõ
       
        err = WSAStartup(MAKEWORD(1, 1), &wsaData);
        if(err != 0)
        {
                cout<<"Error: "<<err<<"\n";
                return 1;
        }
       

        cout<<"Ha4aJIo Pa6oTIb c coketamu\n";
        //Ñîçäàíèå ñîêåòà
        s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
        if(s == INVALID_SOCKET)
        {
                cout<<"Invalid socket\n";
                return 1;
        }
        //ïîëó÷åíèå àäðåñà ñåðâåðà
        d_addr = gethostbyname("smtp.mail.ru");
        if(d_addr == NULL)
        {
                cout<<"Error gethostbyname\n";
                return 1;
        };
        //ñîåäèíÿåìñÿ
       
        addr.sin_family = AF_INET;//òèï TCP/IP
        addr.sin_addr.s_addr = *((unsigned long *) d_addr->h_addr);
        addr.sin_port = htons (25);
        //connect
        if(SOCKET_ERROR == (connect(s, (sockaddr *) &addr, sizeof (addr))))
        {
                cout<<"Error in connect\n";
                return 1;
        } else
        {
                cout<<"YsneLIIHoe coegunenue\n";
        }
        //ïîëó÷àåì äàííûå îò ñåðâåðà
        recv(s, text, sizeof(text), 0);
        cout<<"Recive - "<<text<<"\n";
        //Ïðèâåòñòâóåì ñåðâåð
       
        strcpy(text, "EHLO smtp.mail.ru\r\n");
        send(s, text, sizeof(text), 0);
        cout<<"Send - "<<text<<"\n";

        recv(s, text, sizeof(text), 0);
        cout<<"Recive - "<<text<<"\n";
        //àâòîðèçàöèÿ íà ñåðâåðå
        //memset(text, 0, sizeof(text));
        strcpy(text, "AUTH LOGIN\r\n");
        send(s, text, sizeof(text), 0);
        cout<<sizeof(text)<<"\n";
        cout<<"Send - "<<text<<"\n";
        recv(s, text, sizeof(text), 0);
        cout<<"Recive - "<<text<<"\n";


        closesocket(s);
        WSACleanup();



       
       
        return 0;
}

проблема в том что дойдя до строки AUTH LOGIN - сервак ругается на не правильную команду ((( подскажите как решить эту проблему???

Spy2ex 17.01.2010 18:28

У тебя буффер один под запрос и ответ. text[]
либо обнуляй после каждого запроса -ответа, либо введи дополнительный.

isqad88 17.01.2010 19:23

Цитата:

Сообщение от Spy2ex
У тебя буффер один под запрос и ответ. text[]
либо обнуляй после каждого запроса -ответа, либо введи дополнительный.

Код:

#include <iostream>
#include <winsock2.h>

using namespace std;

int main()
{
        int err;
       
        WSADATA wsaData;
        SOCKET s;
        hostent *d_addr;
        struct sockaddr_in addr;
        char rec[1024];//áóôåð âõîäíûõ ñîîáùåíèé
        char sen[1024];//áóôåð èñõ ñîîáùåíèé
       
        err = WSAStartup(MAKEWORD(1, 1), &wsaData);
        if(err != 0)
        {
                cout<<"Error: "<<err<<"\n";
                return 1;
        }
       

        cout<<"Ha4aJIo Pa6oTIb c coketamu\n";
        //Ñîçäàíèå ñîêåòà
        s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
        if(s == INVALID_SOCKET)
        {
                cout<<"Invalid socket\n";
                return 1;
        }
        //ïîëó÷åíèå àäðåñà ñåðâåðà
        d_addr = gethostbyname("smtp.mail.ru");
        if(d_addr == NULL)
        {
                cout<<"Error gethostbyname\n";
                return 1;
        };
        //ñîåäèíÿåìñÿ
       
        addr.sin_family = AF_INET;//òèï TCP/IP
        addr.sin_addr.s_addr = *((unsigned long *) d_addr->h_addr);
        addr.sin_port = htons (25);
        //connect
        if(SOCKET_ERROR == (connect(s, (sockaddr *) &addr, sizeof (addr))))
        {
                cout<<"Error in connect\n";
                return 1;
        } else
        {
                cout<<"YsneLIIHoe coegunenue\n";
        }
        memset(rec, 0, sizeof(rec));
        memset(sen, 0, sizeof(sen));
        //ïîëó÷àåì äàííûå îò ñåðâåðà
        recv(s, rec, sizeof(rec), 0);
        cout<<rec<<"\n";
        //î÷èñòêà
        memset(rec, 0, sizeof(rec));
        //Ïðèâåòñòâóåì ñåðâåð
       
        strcpy(sen, "HELO smtp.mail.ru\r\n");
        send(s, sen, sizeof(sen), 0);
        cout<<sen<<"\n";
        //î÷èñòêà
        memset(sen, 0, sizeof(sen));


        recv(s, rec, sizeof(rec), 0);
        cout<<rec<<"\n";
        memset(rec, 0, sizeof(rec));
        //àâòîðèçàöèÿ íà ñåðâåðå
       
        strcpy(sen, "AUTH LOGIN\r\n");
        send(s, sen, sizeof(sen), 0);
        cout<<sen<<"\n";
        //î÷èñòêà
        memset(sen, 0, sizeof(sen));
       
        recv(s, rec, sizeof(rec), 0);
        cout<<rec<<"\n";
        memset(rec, 0, sizeof(rec));


        closesocket(s);
        WSACleanup();



       
       
        return 0;
}

Вот ввел два буфера, и все равно сервак ругается на не правильную команду 500 (( дело в AUTH LOGIN

RaX 17.01.2010 20:24

У многих smtp серверов (а особенно для мэйла, рамблера, гугла) для отправки сообщения нужно авторизироваться по POP3 протоколу, иначе было бы очень легко вводить произвольный адрес отправителя. Добавь сюда соединение на порт 110 и авторизируйся на ящик, с которого отправляешь.

Spy2ex 17.01.2010 20:37

нужно подключаться, не на 25 порт а на 2525 в мейл.ру так, рабочий код.
Код:

#include <iostream>
#include <winsock2.h>

using namespace std;

int main()
{
        int err;
       
        WSADATA wsaData;
        SOCKET s;
        hostent *d_addr;
        struct sockaddr_in addr;
        char rec[1024];//áóôåð âõîäíûõ ñîîáùåíèé
        char sen[1024];//áóôåð èñõ ñîîáùåíèé
       
        err = WSAStartup(MAKEWORD(1, 1), &wsaData);
        if(err != 0)
        {
                cout<<"Error: "<<err<<"\n";
                return 1;
        }
       

        cout<<"Ha4aJIo Pa6oTIb c coketamu\n";
        //Ñîçäàíèå ñîêåòà
        s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
        if(s == INVALID_SOCKET)
        {
                cout<<"Invalid socket\n";
                return 1;
        }
        //ïîëó÷åíèå àäðåñà ñåðâåðà
        d_addr = gethostbyname("smtp.mail.ru");
        if(d_addr == NULL)
        {
                cout<<"Error gethostbyname\n";
                return 1;
        };
        //ñîåäèíÿåìñÿ
       
        addr.sin_family = AF_INET;//òèï TCP/IP
        addr.sin_addr.s_addr = *((unsigned long *) d_addr->h_addr);
        addr.sin_port = htons (2525);
        //connect
        if(SOCKET_ERROR == (connect(s, (sockaddr *) &addr, sizeof (addr))))
        {
                cout<<"Error in connect\n";
                return 1;
        } else
        {
                cout<<"YsneLIIHoe coegunenue\n";
        }
        memset(rec, 0, sizeof(rec));
        memset(sen, 0, sizeof(sen));
       
        recv( s, rec, sizeof(rec)-1, 0 ); //I отвтет сервера

    strcpy(sen,"EHLO smtp.mail.ru\r\n");
    send(s,sen,strlen(sen),0);
    recv( s, rec, sizeof(rec)-1, 0 );

    strcpy(sen,"AUTH LOGIN\r\n");
    send(s,sen,strlen(sen),0);
    recv( s, rec, sizeof(rec)-1, 0 );


    closesocket(s);
        WSACleanup();       
       
        return 0;
}


isqad88 17.01.2010 21:04

Цитата:

Сообщение от Spy2ex
нужно подключаться, не на 25 порт а на 2525 в мейл.ру так, рабочий код.
Код:

#include <iostream>
#include <winsock2.h>

using namespace std;

int main()
{
        int err;
       
        WSADATA wsaData;
        SOCKET s;
        hostent *d_addr;
        struct sockaddr_in addr;
        char rec[1024];//áóôåð âõîäíûõ ñîîáùåíèé
        char sen[1024];//áóôåð èñõ ñîîáùåíèé
       
        err = WSAStartup(MAKEWORD(1, 1), &wsaData);
        if(err != 0)
        {
                cout<<"Error: "<<err<<"\n";
                return 1;
        }
       

        cout<<"Ha4aJIo Pa6oTIb c coketamu\n";
        //Ñîçäàíèå ñîêåòà
        s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
        if(s == INVALID_SOCKET)
        {
                cout<<"Invalid socket\n";
                return 1;
        }
        //ïîëó÷åíèå àäðåñà ñåðâåðà
        d_addr = gethostbyname("smtp.mail.ru");
        if(d_addr == NULL)
        {
                cout<<"Error gethostbyname\n";
                return 1;
        };
        //ñîåäèíÿåìñÿ
       
        addr.sin_family = AF_INET;//òèï TCP/IP
        addr.sin_addr.s_addr = *((unsigned long *) d_addr->h_addr);
        addr.sin_port = htons (2525);
        //connect
        if(SOCKET_ERROR == (connect(s, (sockaddr *) &addr, sizeof (addr))))
        {
                cout<<"Error in connect\n";
                return 1;
        } else
        {
                cout<<"YsneLIIHoe coegunenue\n";
        }
        memset(rec, 0, sizeof(rec));
        memset(sen, 0, sizeof(sen));
       
        recv( s, rec, sizeof(rec)-1, 0 ); //I отвтет сервера

    strcpy(sen,"EHLO smtp.mail.ru\r\n");
    send(s,sen,strlen(sen),0);
    recv( s, rec, sizeof(rec)-1, 0 );

    strcpy(sen,"AUTH LOGIN\r\n");
    send(s,sen,strlen(sen),0);
    recv( s, rec, sizeof(rec)-1, 0 );


    closesocket(s);
        WSACleanup();       
       
        return 0;
}


Вообще ошибка 554 "Ошибка синхронизации"

Пытаюсь пройти pop3 авторизацию, пишет вообще ошибку не известная команда ""

RaX 17.01.2010 21:14

Цитата:

Сообщение от isqad88
Вообще ошибка 554 "Ошибка синхронизации"

Пытаюсь пройти pop3 авторизацию, пишет вообще ошибку не известная команда ""

я уже выкладывал исходник отправки сообщения с регистрацией, правда код на Delphi:
http://forum.antichat.ru/thread76601.html

Там нужно делать 2 сокета, один для POP3, а другой для SMTP, причем закрывать оба только в конце, чтобы при отправке сообщения соединение по поп3 было открыто.

slesh 17.01.2010 21:55

strcpy(sen, "AUTH LOGIN\r\n");
send(s, sen, sizeof(sen), 0);

схерали sizeof???? ты отправляешь строку. ПО этому strlen

isqad88 18.01.2010 09:33

Код:

#pragma comment(lib, "Ws2_32.lib")
#include <iostream>
#include <winsock2.h>


using namespace std;



int main()
{
        int err;
        WSADATA wsaData;
        SOCKET s;
        SOCKET p;
        hostent *d_addr;
        struct sockaddr_in addr;
        char rec[1024];

       

        err = WSAStartup(MAKEWORD(1,1), &wsaData);
        if(err != 0)
        {
                cout<<"Error: "<<err<<"\n";
                return 1;
        }
        p = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
        if(p == INVALID_SOCKET)
        {
                cout<<"Invalid socket\n";
        }
        d_addr = gethostbyname("pop.mail.ru");
        if(d_addr == NULL)
        {
                cout<<"Error gethostbyname\n";
                return 1;
        };
       
        addr.sin_family = AF_INET;
        addr.sin_addr.s_addr = *((unsigned long *) d_addr->h_addr);
        addr.sin_port = htons (110);
        if(SOCKET_ERROR == (connect(p, (sockaddr *) &addr, sizeof (addr))))
        {
                cout<<"Error in connect\n";
                return 1;
        } else
        {
                cout<<"YsneLIIHoe coegunenue c pop.mail.ru\n";
        }
       
        //создаем 2й сокет для smtp
        s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
        if(s == INVALID_SOCKET)
        {
                cout<<"Invalid socket\n";
        }
        d_addr = gethostbyname("smtp.mail.ru");
        if(d_addr == NULL)
        {
                cout<<"Error gethostbyname\n";
                return 1;
        };
       
        addr.sin_family = AF_INET;
        addr.sin_addr.s_addr = *((unsigned long *) d_addr->h_addr);
        addr.sin_port = htons (25);
        if(SOCKET_ERROR == (connect(s, (sockaddr *) &addr, sizeof (addr))))
        {
                cout<<"Error in connect\n";
                return 1;
        } else
        {
                cout<<"YsneLIIHoe coegunenue c smtp.mail.ru\n";
        }
        recv(p, rec, sizeof(rec), 0);
        cout<<rec<<"\n";
        memset(rec, 0, sizeof(rec));
        //авторизуемся на pop
        strcpy(rec,"USER user\r\n");
        send(p, rec, strlen(rec),0);
        cout<<rec<<"\n";
        recv(p, rec, sizeof(rec), 0);
        cout<<rec<<"\n";

        strcpy(rec,"PASS parol\r\n");
        send(p, rec, strlen(rec), 0);
        cout<<rec<<"\n";
        recv(p, rec, sizeof(rec), 0);
        cout<<rec<<"\n";
        memset(rec, 0, sizeof(rec));
        //пробуем отправить сообщение
        strcpy(rec, "HELO smtp.mail.ru\r\n");
        send(s, rec, strlen(rec), 0);
        cout<<rec<<"\n";
        recv(s, rec, sizeof(rec), 0);
        cout<<rec<<"\n";
        memset(rec, 0, sizeof(rec));

        strcpy(rec, "MAIL FROM:user@mail.ru\r\n");
        send(s, rec, strlen(rec), 0);
        cout<<rec<<"\n";
        recv(s, rec, sizeof(rec), 0);
        cout<<rec<<"\n";
        memset(rec, 0, sizeof(rec));

        strcpy(rec, "RCPT TO:user2@mail.ru\r\n");
        send(s, rec, strlen(rec), 0);
        cout<<rec<<"\n";
        recv(s, rec, sizeof(rec), 0);
        cout<<rec<<"\n";
        memset(rec, 0, sizeof(rec));

        strcpy(rec, "DATA\r\n");
        send(s, rec, strlen(rec), 0);
        cout<<rec<<"\n";
        recv(s, rec, sizeof(rec), 0);
        cout<<rec<<"\n";
        memset(rec, 0, sizeof(rec));

        strcpy(rec, "from:user@mail.ru\r\nto:user2@mail.ru\r\nsubject:Hello\r\nHello Andrew!!\r\n.\r\n");
        send(s, rec, strlen(rec), 0);
        cout<<rec<<"\n";
        recv(s, rec, sizeof(rec), 0);
        cout<<rec<<"\n";
        memset(rec, 0, sizeof(rec));

        strcpy(rec, "QUIT\r\n");
        send(s, rec, strlen(rec), 0);
        cout<<rec<<"\n";
        recv(s, rec, sizeof(rec), 0);
        cout<<rec<<"\n";
       













        closesocket(p);
        closesocket(s);
        WSACleanup();

        return 0;
}

ТЕПЕРЬ ВСЕ РАБОТАЕТ!!! СПАСИБО ВСЕМ!!!

RaX 18.01.2010 10:34

Всегда с обычных смпт серверов нужно делать авторизацию, иначе они не отправят ничего.
Тогда адрес отправителя можно было бы произвольный выбирать ;)


Время: 12:03