Mandar un Correo Electrónico a través del protocolo SMTP
Estudiando Redes, me puse a investigar a fondo este protocolo, por lo que decidí (para que me quede mas claro) mandarme un mail utilizando las primitivas de este protocolo, todo por consola y usando los servidores de nuestros amigos de Google.
Primero echemos un vistazo a esto SMTP Wikipedia.
Simple Mail Transfer Protocol (SMTP) Protocolo Simple de Transferencia de Correo, es un protocolo de la capa de aplicación. Protocolo de red basado en texto utilizado para el intercambio de mensajes de correo electrónico entre computadoras u otros dispositivos (PDA’s, teléfonos móviles, etc.). Está definido en el RFC 2821 y es un estándar oficial de Internet.
Manos a la obra, para esto vamos a tener que utilizar openssl ya que nos debemos autentificar con TLS y no podemos usar nuestro querido Telnet o la navaja suiza de Netcat. Por lo que se esta aplicación ya viene con Ubuntu así que no sera necesario instalarlo.
La dirección a la que nos vamos a conectar es smtp.gmail.com y como leyeron en la Wiki esta trabaja en el puerto 465/TCP
Nos conectamos desde nuestra consola con el Servidor de Correo.
chuecko@zarpele ~ $ openssl s_client -crlf -connect smtp.gmail.com:465
CONNECTED(00000003)
depth=1 /C=US/O=Google Inc/CN=Google Internet Authority
verify error:num=20:unable to get local issuer certificate
verify return:0
---
Certificate chain
0 s:/C=US/ST=California/L=Mountain View/O=Google Inc/CN=smtp.gmail.com
i:/C=US/O=Google Inc/CN=Google Internet Authority
1 s:/C=US/O=Google Inc/CN=Google Internet Authority
i:/C=US/O=Equifax/OU=Equifax Secure Certificate Authority
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIDWzCCAsSgAwIBAgIKFMs0nQADAAASjjANBgkqhkiG9w0BAQUFADBGMQswCQYD
VQQGEwJVUzETMBEGA1UEChMKR29vZ2xlIEluYzEiMCAGA1UEAxMZR29vZ2xlIElu
dGVybmV0IEF1dGhvcml0eTAeFw0xMDA0MjIyMDAyNDVaFw0xMTA0MjIyMDEyNDVa
MGgxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1N
b3VudGFpbiBWaWV3MRMwEQYDVQQKEwpHb29nbGUgSW5jMRcwFQYDVQQDEw5zbXRw
LmdtYWlsLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAz4B46NG2l4Bk
DdccddAuuOssQ4ZxCHoyj+ErdlEqZurVCoGQzAkhZTkzHrmIgYmM6roTbkF/zEaa
2ROe9s4VoL4OgUnoyB0u1KbwrG5PHBbsMdk0r6jMmhh+MORFVYgQrFxJnu8GnHiG
W4QhmKVytu0FclYE+F1gOOx5qIgTVCMCAwEAAaOCASwwggEoMB0GA1UdDgQWBBS1
+KKmwdxtkpKkJgvwhZztqe0uszAfBgNVHSMEGDAWgBS/wDDr9UMRPme6npH7/Gra
42sSJDBbBgNVHR8EVDBSMFCgTqBMhkpodHRwOi8vd3d3LmdzdGF0aWMuY29tL0dv
b2dsZUludGVybmV0QXV0aG9yaXR5L0dvb2dsZUludGVybmV0QXV0aG9yaXR5LmNy
bDBmBggrBgEFBQcBAQRaMFgwVgYIKwYBBQUHMAKGSmh0dHA6Ly93d3cuZ3N0YXRp
Yy5jb20vR29vZ2xlSW50ZXJuZXRBdXRob3JpdHkvR29vZ2xlSW50ZXJuZXRBdXRo
b3JpdHkuY3J0MCEGCSsGAQQBgjcUAgQUHhIAVwBlAGIAUwBlAHIAdgBlAHIwDQYJ
KoZIhvcNAQEFBQADgYEAUc39Y22ucA2N4mmDdPMC8DKbrRGlGMpC294mfh3yCkJa
YRWjodFQSgCtFyKhTZ9roFpSEL0D4QxAtLSwtC0bSaSVusfAW3/CFgG/Cya724ic
9UoEosoG8CK+eGoGQuEsZ0xR86J5jOs2H+4QPHFCn594V7ZySzdeQi93YV31RBE=
-----END CERTIFICATE-----
subject=/C=US/ST=California/L=Mountain View/O=Google Inc/CN=smtp.gmail.com
issuer=/C=US/O=Google Inc/CN=Google Internet Authority
---
No client certificate CA names sent
---
SSL handshake has read 1704 bytes and written 300 bytes
---
New, TLSv1/SSLv3, Cipher is RC4-MD5
Server public key is 1024 bit
Compression: NONE
Expansion: NONE
SSL-Session:
Protocol : TLSv1
Cipher : RC4-MD5
Session-ID: 4E6C0454CA6DC4823445CBCDBE29E222DA88E29964BCE79C25AC763F80DF7267
Session-ID-ctx:
Master-Key: 6290470B34D57A0A16F0BBAA08A204E396272A1DCB7E5C43003DAAC88239FE8D36DBEAD39E3C711CEBFC00A9ACE982C0
Key-Arg : None
Start Time: 1278044114
Timeout : 300 (sec)
Verify return code: 20 (unable to get local issuer certificate)
---
220 mx.google.com ESMTP 14sm2035922ant.1
Como podrán ver nos dio la bienvenida, así que abrimos sesión con HELO…
HELO mx.google.com 250 mx.google.com at your service
Ahora nos debemos autentificar con nuestro usuario y password de Gmail, para esto utilizare AUTH LOGIN donde los datos están codificados en base64, así que antes obtendremos el usuario y password codificados desde otra consola.
chuecko@zarpele ~ $ echo zarpele@gmail.com | base64 emFycGVsZUBnbWFpbC5jb20K
chuecko@zarpele ~ $ echo mipassword | base64 bWlwYXNzd29yZAo=
Listo, volviendo ahora con openssl le decimos al servidor que nos queremos autentificar (existen otros metodos ademas de login) con AUTH LOGIN
AUTH LOGIN 334 VXNlcm5hbWU6
Copiamos nuestro Username en base64 (el que realizamos en el paso anterior)
emFycGVsZUBnbWFpbC5jb20K
A continuacion nos pide el el Password
334 UGFzc3dvcmQ6 bWlwYXNzd29yZAo=
Nótese que después de 334 en cada paso nos pide Username: y Password: codificado en base64. Si todo esta bien el servidor nos devuelve…
235 2.7.0 Accepted
Ahora le indicamos el quien envía el mensaje con la primitiva MAIL FROM:
MAIL FROM: <zarpele@gmail.com> 250 2.1.0 OK
Y ahora el destinatario del mensaje con RCPT TO:
Aclaración Importante: aquí utilizaremos rcpt to: todo en minúscula ya que sino obtenemos un RENEGOTIATING, tuve altos dolores de cabezas gracias a esto, pero lo solucione gracias a este mail de Wietse Venema
rcpt to: <chuecko@zarpele.com.ar> 250 2.1.5 OK
Listo ahora podemos escribir el cuerpo del mensaje, con DATA
DATA 354 Go ahead
Esto es el cuerpo del mensaje. Mandado con SMTP y OpenSSL desde Zarpele Saludos .
Podrán ver que el cuerpo si finaliza con una línea en la que el único carácter es un punto. Listo recibimos la confirmacion y por lo que veo los bytes del mensaje (no estoy seguro)
250 2.0.0 OK 1278046411
Y listo correo enviado… salimos de openssl con un quit.
Tambien si estan inspirados pueden leerse el RFC de este protocolo el RFC 2821
Saludos gente…
Puedes seguir cualquier respuesta a esta entrada mediante el canal RSS 2.0. Puedes dejar un comentario o enviar un trackback desde tu propio sitio.















[...] Mandar un Correo Electrónico a través del protocolo SMTP http://www.zarpele.com.ar/2010/07/mandar-un-correo-electronico-a-tr… por chuecko hace 2 segundos [...]
Utilizamos un Servidor de Correo de Gmail para escribir un mail. Pero seria mejor tener nuestro propio servidor de correo y enviar un mail a traves de el. El problema es que Hotmail anula todos los mensajes de correo que vienen de servidores con una direccion IP dinamica.
@Jaime
Claro el tema de Spam y esas yerbas se merece otra entrada detallada, el filtro que realizan hotmail, gmail es bastante riguroso por este mismo tema pero bueno la idea era mostrar la utilizacion del protocolo…
Gracias por comentar…
[...] This post was mentioned on Twitter by zarpele. zarpele said: BLOG: Mandar un Correo Electrónico a través del protocolo SMTP + OpenSSL http://bit.ly/bCafHJ [...]
[...] Shared Mandar un Correo Electrónico a través del protocolo SMTP @ Zarpele! Linux and Software Libre. [...]
Muy bueno el aporte, saludos desde colombia!
Hey,
Thanks to you(and to google translate. I don’t know spanish.) The suggestion to use ‘rcpt to:’ instead of ‘RCPT TO:’ helped me. I was previously stuck.
Thank’s you for comment