Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Сети > не получается отправить почту через smtp.mail.ru


Автор: tim91 19.5.2011, 19:33
Код

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)
    {
        printf("error in wsaStartup\n");
        return 1;
    }
    p = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if(p == INVALID_SOCKET)
    {
        printf("Invalid socket\n");
    }
    d_addr = gethostbyname("pop.mail.ru");
    if(d_addr == NULL)
    {
        printf("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))))
    {
        printf("Error in connect\n");
        return 1;
    } else
    {
        printf("соединились с pop.mail.ru\n");
    }

    //создаем 2й сокет для smtp
    s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if(s == INVALID_SOCKET)
    {
        printf("Invalid socket\n");
    }
    d_addr = gethostbyname("smtp.mail.ru");
    if(d_addr == NULL)
    {
        printf("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))))
    {
        printf("Error in connect\n");
        return 1;
    } else
    {
        printf("соединились c smtp.mail.ru\n");
    }
    recv(p, rec, sizeof(rec), 0);
    printf("%s\n",rec);
    memset(rec, 0, sizeof(rec));
    //авторизуемся на pop
    strcpy(rec,"USER [email protected]\r\n");
    send(p, rec, strlen(rec),0);
    printf("%s\n",rec);;
    recv(p, rec, sizeof(rec), 0);
    printf("%s\n",rec);

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

    strcpy(rec, "MAIL FROM:[email protected]\r\n");
    send(s, rec, strlen(rec), 0);
    printf("%s\n",rec);
    recv(s, rec, sizeof(rec), 0);
    printf("%s\n",rec);
    memset(rec, 0, sizeof(rec));

    strcpy(rec, "RCPT TO:[email protected]\r\n");
    send(s, rec, strlen(rec), 0);
    printf("%s\n",rec);
    recv(s, rec, sizeof(rec), 0);
    printf("%s\n",rec);
    memset(rec, 0, sizeof(rec));

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

    strcpy(rec, "from:[email protected]\r\nto:[email protected]\r\nsubject:Hello\r\nHello !!\r\n.\r\n");
    send(s, rec, strlen(rec), 0);
    printf("%s\n",rec);
    recv(s, rec, sizeof(rec), 0);
    printf("%s\n",rec);
    memset(rec, 0, sizeof(rec));

    strcpy(rec, "QUIT\r\n");
    send(s, rec, strlen(rec), 0);
    printf("%s\n",rec);
    recv(s, rec, sizeof(rec), 0);
    printf("%s\n",rec);
    closesocket(p);
    closesocket(s);
    WSACleanup();

Собственно, никаких ошибок не выходит, но письма на почте нет.

Автор: GrayCardinal 20.5.2011, 15:28
"HELO" по идее первым шлется smile Вообще - лог в студию smile

Автор: Alca 20.5.2011, 16:55
попробуй для начала с телнета отправить

Автор: tim91 21.5.2011, 20:16
пробую, не получается, варианты из интернета не работают

Автор: tim91 21.5.2011, 22:28
можно отправить не используя smtp  вручную? есть какие-нибудь свободные библиотеки?

Автор: scroollocker 14.7.2011, 15:03
ты забыл про AUTH LOGIN. На smtp.mail.ru без авторизации нельзя же отправлять почту

HELO => AUTH LOGIN => твой логин в base64 => пасс в base64



Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)