Я пытаюсь создать 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");
}