Lo primero que deberemos hacer, en una función que reciba una dirección de internet, es resolverla mediante la función gethostbyname (Aunque nos hayan introducido una dirección IP), pues de esa manera, hacemos mucho más independiente el programa. Ya hay escrito un articulo al respecto.
El siguiente paso a ralizar, es crear un socket, con la función socket, que nos devolverá un entero; Este entero será el canal de comunicaciones que emplearemos. A esta función se le pasan tres parametros, el primero es en tipo de dirección (En nuestro caso AF_INET), el segundo es si será una conexión UDP o TCP (SOCK_STREAM en nuestro caso, que es una conexión TCP), y el tercer parámetro es el protocolo que se empleará en la conexión (Depende del primer parametro, en nuestro caso 0), de manera que nos quedaría:
sockfd = socket(AF_INET, SOCK_STREAM, 0);
Si nos devuelve un valor menor que 0, entonces no se ha podido abrir el canal de comunicaciones..
El siguiente paso es rellenar la estructura sockaddr_in, en la que pondremos los datos de la máquina a la que nos conectamos (Ponderemos el puerto, la dirección resuelta obtenida de gethostbyname, que nos conectamos a traves de la red Ip, e inicializaremos el resto a 0). Consultar el ejemplo al final de el artículo.
Y el último paso es la comunicación en si misma. Esta depende del protocolo utilizado. En caso del protocolo SMTP, El cliente manda una línea (Acabada en el caracter de salto de línea), y el servidor responde con otra, salvo qu el cliente haya enviado la instrucción data.
Una vez terminada la comunicación, es MUY importante cerrar las comunicaciones, para lo que emplearemos la función shutdown, en la que le especificaremos el socket a cerrar, y lo que queremos que cierre (En nuestro caso, 2, que es que cierre totalmente el canal)
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#ifndef WIN32
#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#else
#include <windows.h>
#include <winsock.h>
#endif
#define DEST_PORT 25
#define MAXDATASIZE 255
//A�adir en el proyecto la librer�a wsock32.lib
void MandaMail(char * ServidorSMTP);
#ifdef WIN32
int WINAPI WinMain( HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow )
{
MandaMail("smtp.servidor.es");
return 1;
}
#else
int main(int argc, char *argv[])
{
MandaMail("smtp.sevidor.es");
return 1;
}
#endif
void MandaMail(char * ServidorSMTP)
{
int sockfd;
struct sockaddr_in dest_addr; // Guardar� la direcci�n de destino
struct hostent *hServSMTP;
char buf[MAXDATASIZE];
int numbytes;
/*/////////////////////////////////////////////////////
//// Inicio de la Conexi�n ////
/////////////////////////////////////////////////////*/
#ifdef WIN32
WSADATA wsaData;
if (WSAStartup(MAKEWORD(1, 1), &wsaData) != 0) {
//cerr << "WSAStartup fallo";
exit(1);
}
#endif
if ((hServSMTP=gethostbyname(ServidorSMTP)) == NULL) { // Obtener informaci�n del host
perror ("No se ha podido usar el DNS");
exit(1);
}
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0)
{
perror ("No se ha podido conseguir un socket");
}
dest_addr.sin_family = AF_INET; // Ordenaci�n de m�quina
dest_addr.sin_port = htons(DEST_PORT); // short, Ordenaci�n de la red
dest_addr.sin_addr=*((struct in_addr *)hServSMTP->h_addr);
memset(&(dest_addr.sin_zero), '', 8); // Poner a cero el resto de la estructura
if (connect(sockfd, (struct sockaddr *)&dest_addr, sizeof(struct sockaddr)) == -1) {
perror("connect");
exit(1);
}
/*/////////////////////////////////////////////////////
//// Envio en si mismo ////
/////////////////////////////////////////////////////*/
if ((numbytes=recv(sockfd, buf, MAXDATASIZE-1, 0)) == -1) {
perror("recv");
exit(1);
}
buf[numbytes] = '';
if (send(sockfd, "helo servidor.esn", 15, 0) == -1)
perror("send");
numbytes=recv(sockfd, buf, MAXDATASIZE-1, 0);
buf[numbytes] = '';
send(sockfd, "mail from: direccionorigen@servidor.esn", 29, 0);
numbytes=recv(sockfd, buf, MAXDATASIZE-1, 0);
buf[numbytes] = '';
send(sockfd, "rcpt to: direcciondestino@servidor.esn", 31, 0);
numbytes=recv(sockfd, buf, MAXDATASIZE-1, 0);
buf[numbytes] = '';
send(sockfd, "datan", 5, 0);
numbytes=recv(sockfd, buf, MAXDATASIZE-1, 0);
buf[numbytes] = '';
send(sockfd, "mail from: direccionorigen@servidor.esn.n", 31, 0);
numbytes=recv(sockfd, buf, MAXDATASIZE-1, 0);
buf[numbytes] = '';
/*/////////////////////////////////////////////////////
//// Fin de la Conexion ////
/////////////////////////////////////////////////////*/
shutdown(sockfd,2);
#ifdef WIN32
closesocket(sockfd);
WSACleanup() ;
#endif
}