Fallo al enviar email a servidor

Iniciado por Kaxperday, 19 Noviembre 2015, 11:22 AM

0 Miembros y 1 Visitante están viendo este tema.

Kaxperday

Buenas, encontré un código sobre como mandar emails entre varios, y este parecía el mejor, a pesar de que daba bastantes fallos al compilar conseguí arreglarlo y ya compila, le tengo que meter el servidor smtp (de hotmail, gmail etc) que lo tengo bien, luego la cuenta de ese servidor a la que vas a enviar el archivo (en caso de hotmail, micuenta@hotmail.com), y luego la cuenta que manda el archivo que ahí es donde tengo el problema, os dejo el código a ver si me podéis ayudar, porque me dice que lo ha mandado correctamente, pero nada llega al correo, el problema está en el correo que manda el mensaje no se que poner, he probado con mi isp pero tampoco.

Código (cpp) [Seleccionar]
#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?.
Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.