отправлять почту в c с розеткой - PullRequest
0 голосов
/ 03 мая 2020

Я пытаюсь создать c программу для отправки электронных писем через сокет, но я не обладаю глубокими знаниями о протоколе smtp. Я могу успешно подключиться к серверу Google, но электронные письма на самом деле не отправляются. Что я делаю неправильно?

Код довольно прост: создается экземпляр сокета, IP-адрес разрешается, соединение устанавливается, и, наконец, отправляются команды для отправки почты.

#include <iostream>
#include <fstream>
#include <sstream>
#include <windows.h>
#include <time.h>
#include <locale.h>
#include <stdlib.h>
#include <string.h>
#include <winsock2.h>
#include <ws2tcpip.h>

using namespace std;

struct sockaddr_in my_addr;
struct sockaddr_in clientService;
int ret;
#define SA struct sockaddr
#define  SEPARATOR "\n\r"

char* hostname_to_ip(char * hostname){
     struct hostent *remoteHost = gethostbyname(hostname);   
     return inet_ntoa(*( struct in_addr*)( remoteHost->h_addr_list[0]));
}

int sendData(SOCKET socket, const char *data) {
    int result = send(socket, data, (int)strlen(data), 0);
    if(result == SOCKET_ERROR){
        cout << "ERROR";
        return 1;
    }
    return 0;
}

int main(int argc, char const *argv[])
{

    WSACleanup();

    WSADATA wsData;
    WORD ver = MAKEWORD(2, 2);

    int iresult = WSAStartup(ver, &wsData);


    if(LOBYTE(wsData.wVersion) == 2 && HIBYTE(wsData.wVersion) == 2) {
        printf("winsock.dll is found.\n");
    }
    else
    {
        printf("Can not find the required winsock.dll file.\n");
        WSACleanup();
        return 0;
    }

    int socket_desc = socket(AF_INET , SOCK_STREAM, 0);

    if (socket_desc == -1)
    {
        int g = WSAGetLastError();
        cout << "Could not create socket"+to_string(g);
    }

    char* ip = hostname_to_ip("smtp.gmail.com");

       clientService.sin_family = AF_INET;
       clientService.sin_addr.s_addr = inet_addr( ip );

        clientService.sin_port = htons(25);

        //----------------------
        // Connect to server.
        int iResult = connect( socket_desc, (SOCKADDR*) &clientService, sizeof(clientService) );


        if (iResult == SOCKET_ERROR) {
            wprintf(L"connect failed with error: %d\n", WSAGetLastError() );
            closesocket(socket_desc);
            WSACleanup();
            return 1;
      }    

    sendData( socket_desc, "HELO gmail.com" SEPARATOR);
    sendData( socket_desc, "MAIL FROM: mail@gmail.com" SEPARATOR);
    sendData( socket_desc, "RCPT TO: receiver@hotmail.it" SEPARATOR);
    sendData( socket_desc, "DATA" SEPARATOR);
    sendData( socket_desc, "This is subject of my mail" SEPARATOR SEPARATOR);
    sendData( socket_desc, "And this is text" SEPARATOR);
    sendData( socket_desc, "." SEPARATOR); // Send mail
    sendData( socket_desc, "QUIT");


    system("PAUSE");

}
...