Código
#include <iostream> #include <string> #include <fstream> #include <winsock2.h> #define CRLF "\r\n" #pragma comment(lib, "ws2_32.lib") using namespace std; void ShowUsage(void); void Check(int iStatus, char *szFunction); void ShowUsage(void) { cout << "Usage: SENDMAIL mailserv to_addr from_addr messagefile" << endl << "Example: SENDMAIL smtp.myisp.com rcvr@elsewhere.com my_id@mydomain.com message.txt" << endl; exit(1); } // Basic error checking for send() and recv() functions void Check(int iStatus, char *szFunction) { if ((iStatus != SOCKET_ERROR) && (iStatus)) return; cerr << "Error during call to " << szFunction << ": " << iStatus << " - " << GetLastError() << endl; } int main() { int iProtocolPort = 0; char szSmtpServerName[64] = ""; char szToAddr[64] = ""; char szFromAddr[64] = ""; char szBuffer[4096] = ""; char szLine[255] = ""; char szMsgLine[255] = ""; SOCKET hServer; WSADATA WSData; LPHOSTENT lpHostEntry; LPSERVENT lpServEntry; SOCKADDR_IN SockAddr; // Check for four command-line args //ShowUsage(); // Load command-line args strcpy(szSmtpServerName, "smtp.live.com");//smtp de hotmail strcpy(szToAddr, "mirealemail@hotmail.com");//mi email real de hotmail strcpy(szFromAddr, "micasa@noseque.com");//mi direcion ip?dominio?isp? que poner aqui // Create input stream for reading email message file //ifstream MsgFile(argv[4]); // Attempt to intialize WinSock (1.1 or later) if (WSAStartup(MAKEWORD(1, 1), &WSData)) { cout << "Cannot find Winsock v" << 1 << "." << 1 << " or later!" << endl; return 1; } // Lookup email server's IP address. lpHostEntry = (hostent*)gethostbyname(szSmtpServerName); if (!lpHostEntry) { cout << "Cannot find SMTP mail server " << szSmtpServerName << endl; return 1; } // Create a TCP/IP socket, no specific protocol hServer = socket(PF_INET, SOCK_STREAM, 0); if (hServer == INVALID_SOCKET) { cout << "Cannot open mail server socket" << endl; return 1; } // Get the mail service port lpServEntry = (servent*)getservbyname("mail", 0); // Use the SMTP default port if no other port is specified if (!lpServEntry) iProtocolPort = htons(IPPORT_SMTP); else iProtocolPort = lpServEntry->s_port; // Setup a Socket Address structure SockAddr.sin_family = AF_INET; SockAddr.sin_port = iProtocolPort; SockAddr.sin_addr = *((LPIN_ADDR)*lpHostEntry->h_addr_list); // Connect the Socket if (connect(hServer, (PSOCKADDR)&SockAddr, sizeof(SockAddr))) { cout << "Error connecting to Server socket" << endl; return 1; } // Receive initial response from SMTP server Check(recv(hServer, szBuffer, sizeof(szBuffer), 0), "recv() Reply"); // Send HELO server.com sprintf(szMsgLine, "HELO %s%s", szSmtpServerName, CRLF); Check(send(hServer, szMsgLine, strlen(szMsgLine), 0), "send() HELO"); Check(recv(hServer, szBuffer, sizeof(szBuffer), 0), "recv() HELO"); // Send MAIL FROM: <sender@mydomain.com> sprintf(szMsgLine, "MAIL FROM:<%s>%s", szFromAddr, CRLF); Check(send(hServer, szMsgLine, strlen(szMsgLine), 0), "send() MAIL FROM"); Check(recv(hServer, szBuffer, sizeof(szBuffer), 0), "recv() MAIL FROM"); // Send RCPT TO: <receiver@domain.com> sprintf(szMsgLine, "RCPT TO:<%s>%s", szToAddr, CRLF); Check(send(hServer, szMsgLine, strlen(szMsgLine), 0), "send() RCPT TO"); Check(recv(hServer, szBuffer, sizeof(szBuffer), 0), "recv() RCPT TO"); // Send DATA sprintf(szMsgLine, "DATA%s", CRLF); Check(send(hServer, szMsgLine, strlen(szMsgLine), 0), "send() DATA"); Check(recv(hServer, szBuffer, sizeof(szBuffer), 0), "recv() DATA"); sprintf(szMsgLine, "%s%s", "HOLA PROBANDO A ENVIAR UN EMAIL", CRLF); Check(send(hServer, szMsgLine, strlen(szMsgLine), 0), "send() message-line"); // Send blank line and a period sprintf(szMsgLine, "%s.%s", CRLF, CRLF); Check(send(hServer, szMsgLine, strlen(szMsgLine), 0), "send() end-message"); Check(recv(hServer, szBuffer, sizeof(szBuffer), 0), "recv() end-message"); // Send QUIT sprintf(szMsgLine, "QUIT%s", CRLF); Check(send(hServer, szMsgLine, strlen(szMsgLine), 0), "send() QUIT"); Check(recv(hServer, szBuffer, sizeof(szBuffer), 0), "recv() QUIT"); // Report message has been sent cout << "Sent " << "ARCHIVO" << " as email message to " << szToAddr << endl; // Close server socket and prepare to exit. closesocket(hServer); WSACleanup(); return 0; }
Saludos y gracias.
Edito: Bueno bueno, tras mucho leer. Parece que todo indica a que tengamos que loguearnos en una cuenta conocida que tengamos en un servidor smtp, y desde allí mandar un email a la cuenta que queramos dentro o fuera del dominio.
Esto sabía que se podía hacer, pero es lo último a lo que quería llegar, porque imaginaros una app que manda emails con notificaciones, necesitaría contener la cuenta que va a mandar el mensaje en su interior y la podrían extraer con ingeniería inversa y acceder al usuario y contraseña del correo que usa la app para mandar los emails.
Yo estoy intentando buscar otra forma de mandarlo, a través de nuestra ip y nuestro servidor de isp o algo así, o levantar nuestro propio servidor smtp y mandar mensajes con nuestra isp como dominio y nuestra ip como usuario, no sé, desconozco el tema, estoy buscando ideas.
¿Alguna alternativa a que tenga que loguearme en un server smtp(gmail, hotmail...), y mandarlo desde el tras loguearme?, estaría bien por muchos motivos.
Saludos.
Edito: De hecho entonces no entiendo este código que parecía funcionar cuando lo busqué, pues aquí no introduce la contraseña, no se loguea en la cuenta para mandar el email, aunque tampoco debería hacerlo si le estamos diciendo mande a un destinatario, y si nosotros estamos usando nuestro dominio como origen del mensaje.
Creo que el protocolo también falla, de el ejemplo, ¿no?. ¿Pero entonces necesito estrictamente autentificarme en otro correo ya conodico y enviarlo desde ahí o no?.