Aprendiendo a programar SMTP

Iniciado por x64core, 5 Septiembre 2012, 04:27 AM

0 Miembros y 2 Visitantes están viendo este tema.

x64core

Buenas alguien podria ayudarme con esto XD
Siempre me tome poco interes en network programming ( Sockets, TCP, etc ) pero siempre he querido enviar un email usando SMTP,
segun tengo entendido con SMTP se puede enviar a cualquier tipo de cuenta no? ( gmail, hotmail , yahoo , etc )
y encontre este codigo en la red, pero creo que no tengo algunas librerias... pero no se supone que SMTP es "portable" ?
bueno honestamente sé nada sobre ello, y por ahora no estoy del todo interesado al aprendizaje profundo sobre ello, así que me gustaria
saber quien puede decirme donde debo leer, o que buscar solamente para aprender a programar un SMTP XD y enviar un email


Código (cpp) [Seleccionar]
    #include<iostream>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <netdb.h>
    #include <stdio.h>
    using namespace std;
    #define HELO "HELO 192.168.1.1\r\n"
    #define DATA "DATA\r\n"
    #define QUIT "QUIT\r\n"

   //#define h_addr h_addr_list[0]
   //FILE *fin;
   int sock;
   struct sockaddr_in server;
   struct hostent *hp, *gethostbyname();
   char buf[BUFSIZ+1];
   int len;
   char *host_id="192.168.1.10";
   char *from_id="rameshgoli@domain.com";
   char *to_id="rameshgoli@domain.com";
   char *sub="testmail\r\n";
   char wkstr[100]="hello how r u\r\n";

   /*=====Send a string to the socket=====*/

   void send_socket(char *s)
   {
       write(sock,s,strlen(s));
       write(1,s,strlen(s));
       //printf("Client:%s\n",s);
   }

   //=====Read a string from the socket=====*/

   void read_socket()
   {
       len = read(sock,buf,BUFSIZ);
       write(1,buf,len);
     //printf("Server:%s\n",buf);
   }

   /*=====MAIN=====*/
   int main(int argc, char* argv[])
   {

   /*=====Create Socket=====*/
   sock = socket(AF_INET, SOCK_STREAM, 0);
   if (sock==-1)
   {
    perror("opening stream socket");
    exit(1);
   }
   else
     cout << "socket created\n";
   /*=====Verify host=====*/
   server.sin_family = AF_INET;
   hp = gethostbyname(host_id);
   if (hp==(struct hostent *) 0)
   {
    fprintf(stderr, "%s: unknown host\n", host_id);
    exit(2);
   }

   /*=====Connect to port 25 on remote host=====*/
   memcpy((char *) &server.sin_addr, (char *) hp->h_addr, hp->h_length);
   server.sin_port=htons(25); /* SMTP PORT */
   if (connect(sock, (struct sockaddr *) &server, sizeof server)==-1)
   {
    perror("connecting stream socket");
    exit(1);
   }
   else
     cout << "Connected\n";
   /*=====Write some data then read some =====*/
   read_socket(); /* SMTP Server logon string */
   send_socket(HELO); /* introduce ourselves */
   read_socket(); /*Read reply */
   send_socket("MAIL FROM: ");
   send_socket(from_id);
   send_socket("\r\n");
   read_socket(); /* Sender OK */
   send_socket("VRFY ");
   send_socket(from_id);
   send_socket("\r\n");
   read_socket(); // Sender OK */
   send_socket("RCPT TO: "); /*Mail to*/
   send_socket(to_id);
   send_socket("\r\n");
   read_socket(); // Recipient OK*/
   send_socket(DATA);// body to follow*/
   send_socket("Subject: ");
   send_socket(sub);
   read_socket(); // Recipient OK*/
   send_socket(wkstr);
   send_socket(".\r\n");
   read_socket();
   send_socket(QUIT); /* quit */
   read_socket(); // log off */

   //=====Close socket and finish=====*/
   close(sock);
   exit(0);
 }



BlackZeroX

The Dark Shadow is my passion.

x64core

Cita de: BlackZeroX (Astaroth) en  5 Septiembre 2012, 05:26 AM
Yo ya te envie por PM la url del formato SMTP no hace mucho...

Dulces Lunas!¡.

Cierto XD solo lei lo principio y lueg no lo continue :P es que honestamente no me llama nada la atencion pero es tan indispensable XD
ahora que lo veo bien esto trata sobre el SMTP pero creo que no lo aplica a C/C++ verdad? y es que estoy buscando algo introductorio
así como que librerias debo usar, funciones, etc

BlackZeroX

#3
Lo que te deje es el Standart del SMTP te guste o no así vas a estar encontrando información VERÍDICA y puede ser procesada esa información de diversas maneras, los diversos servidores SMTP, sus programadores tuvieron que ver este tipo de documentos que no están orientados a ningún lenguaje mas que para que quien lo lea lo comprenda y lo aplique tal cual pasa con la MATEMÁTICA.

Habitualmente estos documentos te dan un ejemplo(s) pero no orientados a la programación si no a tu compresión; Las librerías a incluir y las funciones de DEBES CREAR por ti mismo o copiar algunas ya realizadas es otra cosa muy ajena a un formato, en este caso el formato del protocolo del SMTP...

Sera mejor que practiques con Sockets antes de meterte con algo así o no sabrás ni que estas haciendo.

Aquí están unos escenarios (ejemplos) donde la S: significa lo que arroja el servidor y C: lo que arroja el cliente...

http://tools.ietf.org/html/rfc2821#appendix-D.1

Dulces Lunas!¡.

EI: juntando mensajes.

Busca aquí el formato documento que necesites...

http://tools.ietf.org/rfc/index

Este es del año (2012).
RFC6710 Simple Mail Transfer Protocol Extension for Message Transfer
Priorities. A. Melnikov, K. Carlberg. August 2012. (Format: TXT=59966 bytes) (Status: PROPOSED STANDARD)

Dulces Lunas!¡.
The Dark Shadow is my passion.

x64core