HOWTO - Cómo enviar mensajes de correo desde la terminal, usando EMail y Gmail

Enviado por siddharta el 30 Junio, 2009 - 19:45.

kterm.png mail.png

QUÉ HICE

Instalé y configuré una aplicación para enviar mensajes de correo desde la terminal usando mi cuenta de Gmail, sin la necesidad de acceder al entorno gráfico. Con dicha aplicación no se reciben ni leen mensajes de correo, sino únicamente se envían. Por ejemplo, abro una terminal y escribo una línea similar a esta:

email -V -s "factura camioneta" -a ~/factura.pdf destinatario1@dominio.org

y al presionar Enter se abre un editor de texto donde escribo el cuerpo del mensaje, al finalizar el mismo se envía el mensaje de correo con el archivo adjunto, que en este ejemplo es un documento PDF, a través de mi cuenta de correo de Gmail al destinatario que indiqué en la línea de comandos.

Lo anterior es mucho más rápido que abrir un navegador, introducir la dirección de Gmail, iniciar sesión, pulsar la creación de un nuevo mensaje, redactar el mensaje, enviarlo, cerrar la sesión, cerrar el navegador. Aunque reconozco que en circunstancias más normales quizás el navegador ya está abierto, y quizás el sistema guarda una cookie de tal manera que no pide contraseña para iniciar sesión en Gmail.


CÓMO LO HICE

a) conseguir una cuenta de correo que permita envío/recepción con clientes

Uso una cuenta de correo de Gmail ( http://www.gmail.com ), con la cual no sólo es posible acceder al correo vía webmail, sino que también es posible acceder de manera directa a sus servidores de correo, de tal manera que es posible usar clientes de correo (por ejemplo Thunderbird, Evolution, Outlook, Foxmail, y otros) para la transmisión de los mensajes.

b) descargar y extraer la aplicación cliente

La aplicación que decidí usar para conectarme a los servidores de Gmail fue desarrollada por Dean Jones y lleva por nombre email ( http://www.cleancode.org/projects/email ), y el autor de la misma indica que no se debe confundir con el significado típico de dicha palabra el cual es Electronic Mail, ya que en el caso específico de su aplicación el significado es Encrypted Mail, nombre que toma por su capacidad para trabajar de manera conjunta con GPG (GNU Privacy Guard) para la encriptación de los mensajes de correo, siendo GPG una alternativa a PGP (Pretty Good Privacy).

Desde la página de descargas de email ( http://www.cleancode.org/downloads/email/ ) obtuve la última versión disponible al día de hoy, que es la versión 3.1.2, así que guardé el archivo email-3.1.2.tar.gz en mi carpeta /home/siddharta/Descargas/email/ , para posteriormente extraer su contenido desde la terminal:

tar xzf email-3.1.2.tar.gz

y automáticamente se creó el subdirectorio email-3.1.2/ .

c) cumplir dependencias

Lo que descargué es el código fuente, por lo tanto es necesario compilar el código fuente para convertirlo a un archivo binario, es decir, convertirlo en un programa ejecutable. Así que necesité revisar (con la ayuda de varios correos que muy amablemente respondió Dean) que mi sistema tuviera listos los siguientes paquetes, o en su defecto instalarlos:

  • build-essential
  • openssl
  • libssl0.9.8
  • libssl-dev
  • zlib1g-dev

Lo más rápido para instalarlos con una sola línea de comando es:

sudo aptitude install build-essential openssl libssl0.9.8 libssl-dev zlib1g-dev

El sistema mostrará mensajes indicando que no están instalados, o que ya están instalados pero se actualizarán, o que ya están instalados y actualizados por lo que no se efectuarán cambios al sistema.

d) configurar, compilar, e instalar

Como siguiente paso entré a la carpeta que se creó automáticamente durante la extracción del archivo .tar.gz:

cd ~/Descargas/email/email-3.1.2/

y ahí dentro creé un nuevo subdirectorio llamado logs, para guardar registros de la configuración, compilación, e instalación:

mkdir logs

Hago un paréntesis rápido para comentar algo: a mí me gusta tener registros de lo que hago, para estudiar, y revisar posteriormente. Lo más fácil es redirigir la salida hacia un archivo, por ejemplo el siguiente comando:

ls > listado.log

hará que se cree un archivo que almacene la salida del comando ls, el problema es que ya no vi en la pantalla qué es lo que sucedió, así que tendría que ver el contenido del archivo creado. Para solventar el problema canalizo la salida usando el comando tee, el cual muestra en pantalla la salida del comando de la manera acostumbrada, y también crea un archivo con el contenido de dicha salida, por ejemplo:

ls | tee listado.log

Fin del paréntesis :)

Así que en los siguientes pasos redirigí la salida para crear archivos dentro del directorio logs que ya mencioné, pudiendo tener constancias de dichos pasos.

Primero hay que configurar:

./configure | tee ./logs/configure.log

dicho proceso habrá creado los siguientes directorios y archivos:

dlib/
include/
src/
config.log
config.status
email.1
email.help
Makefile

posteriormente hay que verificar que durante la configuración se haya detectado la capacidad para realizar conexiones seguras (SSL), y esto lo hice buscando la palabra SSL dentro del archivo log al que redireccioné la salida:

cat ./logs/configure.log | grep SSL

el resultado debe ser:

checking for SSL_library_init in -lssl... yes
checking for SSL_library_init in -lssl... yes

Si al final de las líneas dice NO entonces significa que no todas las dependencias están instaladas, y por lo tanto no se debe continuar ya que Gmail requiere el uso de SSL para enviar correos usando clientes. Así que antes de continuar hay que limpiar la configuración recién hecha:

make clean

y volver al inciso c) cumplir dependencias .

Si lo anterior es correcto entonces el siguiente paso es compilar, redirigiendo la salida como ya mencioné:

make | tee ./logs/make.log

y por último instalar (como root):

sudo make install | tee ./logs/sudo-make-install.log

Para comprobar que la aplicación ya está instalada:

which email

y el resultado es:

/usr/local/bin/email

e) configurar email con los datos de la cuenta de Gmail

En la página oficial de Gmail ( http://mail.google.com/support/bin/answer.py?answer=13287 ) se proporcionan los datos necesarios para configurar un cliente que enviará mensajes a través de SMTP:

Servidor saliente (SMTP): smtp.gmail.com
Requiere TLS: sí
Usar autenticación (AUTH): sí
Usar STARTTLS: sí (algunos clientes le llaman SSL)
Puertos: 465 ó 587
Nombre de la cuenta: dirección de correo-e completa (usuario@gmail.com)
Dirección de correo-e: dirección de correo-e completa (usuario@gmail.com)
Contraseña: la contraseña de la cuenta de Gmail

La aplicación email tiene sus propio archivos de configuración los cuales están /usr/local/etc/email/. Dichos archivos, y sus propósitos, son:

email.address.template <--- libreta de direcciones
email.conf <--- archivo de configuración
email.help <--- documento de ayuda
email.sig <--- archivo de firma (signature), que aparecerá al final del cuerpo del mensaje
mime.types <--- listado de los tipos de archivo adjuntos

Para agregar la información de Gmail es necesario abrir (como root) el archivo email.conf, y buscar estas líneas, agregando la información de Gmail:

SMTP_SERVER = 'smtp.gmail.com'
SMTP_PORT = '587'
MY_NAME  = 'Nombre Apellido'
MY_EMAIL = 'nombre.apellido@gmail.com'
USE_TLS = 'true'
SMTP_AUTH = 'LOGIN'
SMTP_AUTH_USER = 'nombre.apellido@gmail.com'

Observar que en la segunda línea, indiqué que el puerto será el 587, ya que el puerto 465 no funciona para el caso de la aplicación email. En la página oficial de email hay una explicación de Dean al respecto.

En las 2 líneas que menciono a continuación hay que asegurarse de poner el signo numeral (#) al principio para invalidarlas:

# SMTP_AUTH_PASS =
# VCARD = "~/dean.ldif"

La primer línea es para hacer que email pida la contraseña de Gmail cada vez que se envíe un mensaje de correo. ¡NO ES RECOMENDABLE quitar el signo numeral (#) y escribir la contraseña ya que el archivo de configuración es de texto simple, y puede ser visto por cualquier usuario!.

La segunda línea es para indicar que se envíe una tarjeta de presentación virtual (Virtual Card), y en este caso hay que agregar el signo numeral (#) al principio ya que apunta hacia un archivo que originalmente es de Dean Jones y que en nuestro sistema no existe, por lo tanto email mostrará un mensaje de error si no se pone el signo #. O es posible crear un archivo .ldif y agregar los datos personales, y después indicar la ruta hacia el mismo.

Si por alguna razón el archivo se desconfigura se puede eliminar (como root), ya que el original están dentro de la misma carpeta donde se extrajo el archivo .tar.gz descargado, así que sólo se debe copiar (como root) a la ruta /usr/local/etc/email/ y volver a configura su contenido.

También es posible hacer que email compruebe si el archivo de configuración no tiene anomalías mediante el parámetro -t (test):

email -t

el resultado debe ser:

-- Opened config /usr/local/etc/email/email.conf
Configuration file is proper.

pero si aparece algo similar a:

-- Opened config /usr/local/etc/email/email.conf
email: FATAL: Variable: 'd' is not valid
email: FATAL: Line: 10 of email.conf is improperly formatted.

entonces se podrá observar que se señala un error en la línea 10 del archivo de configuración, por lo que es fácil identificar posibles problemas.

Para encontrar rápidamente la línea mencionada yo uso una función del editor nano llamada Go To Line (ir a la línea): abro el documento con nano, y presiono ALT+G, luego el número de línea al que quiero ir, y presiono ENTER.

f) otros parámetros dentro del mismo archivo, que son opcionales:

SIGNATURE_FILE = '&/email.sig'

Esa línea indica que al final del cuerpo del mensaje de correo se agregue el contenido del archivo email.sig, que contiene una firma. El archivo de firma puede ser modificado a antojo. Si no se modifica dicho archivo, y tampoco se antepone el signo # a la línea mencionada entonces al final de cada mensaje de correo aparecerá lo siguiente:


--
Sent using Email 3.1.2
http://www.cleancode.org/projects/email

Sent on: Mon, 22 Jun 2009 19:14:54 -0500
On System: Linux 2.6.24-23-generic i686

# SAVE_SENT_MAIL = '~'

La línea anterior es útil para que en nuestro sistema se guarde un registro de cada correo-e enviado. En mi caso particular yo creé el siguiente directorio:

mkdir ~/email

y modifiqué la línea mencionada así, sin el signo numeral (#) y con la ruta recién creada:

SAVE_SENT_MAIL = '~/email/'

esto hará que dentro de ese directorio se cree un sólo archivo llamado email.sent el cual contendrá un registro de cada mensaje de correo enviado, mostrándose en primer lugar el mensaje más antiguo, y al final del archivo el mensaje más reciente.

# ADDRESS_BOOK = '&/email.address.template'

La línea anterior permite indicar (si se quita el signo #) que se usará una libreta de contactos, evitando de esta manera tener que recordar cada dirección de correo-e, y en su lugar se podrá usar un alias. Cada contacto se debe agregar con la siguiente sintaxis:

single: alias = usuario@dominio.com # comentario opcional

Ejemplos:

single: papa = papa@dominio.com # es posible agregar comentarios así
single: mama = mama@dominio.com # este es otro comentario
single: esposa = esposa@dominio.com # ejemplo de más comentarios
single: "nombre del director" = director@trabajo.com # un alias largo
single: "nombre del gerente" = gerente@trabajo.com # otro alias largo
single: "nombre del auditor" = auditor@trabajo.com # uno más

Posteriormente es posible crear listas de distribución con la siguiente sintaxis:

grupo: alias = alias-1, alias-2, alias-3

Ejemplo:

group: familia = papa, mama, esposa # un comentario
group: trabajo = 'nombre del director', 'nombre del gerente'

g) establecer un editor de texto predeterminado

En el sistema hay varios editores de texto para la terminal, como emacs, nano o vim. Aunque es posible especificar un editor de texto gráfico como Kate, Kwrite, o GEdit no es recomendable usar estos últimos sino los primeros por la sencilla razón de que el envío de correo se está haciendo desde la terminal, y si por alguna razón no está disponible el entorno gráfico entonces no será posible usar un editor de texto gráfico.

El editor elegido esta ocasión es nano. Su uso es muy sencillo: simplemente se escribe el texto deseado, al finalizar se pulsa CTRL+X para salir del editor (eXit), posteriormente la tecla Y (Yes) o S () para indicar que sí se guarden los cambios, y finalmente la tecla ENTER para aceptar el nombre del archivo).

Para establecer nano como editor predeterminado se debe modificar el archivo ~/.bashrc y agregar la siguiente línea, por ejemplo al final:

export EDITOR=nano

y después se hace que el sistema vuelva a leer el archivo modificado, para aplicar la nueva configuración:

source ~/.bashrc

o simplemente el siguiente comando, para no cargar todo el archivo ~/.bashrc :

export EDITOR=nano

Si no se establece un editor predeterminado entonces email mostrará el siguiente mensaje y usará vi / vim para la redacción del mensaje:

email: WARNING: Environment variable EDITOR not set: Defaulting to "vi"

h) hacer pruebas de correo

Finalmente hice varias pruebas con los siguientes parámetros:

-V (mayúscula) significa verbose y hará que en la pantalla se muestren todos los mensajes
-s significa subject y seguidamente se debe escribir entre comillas dobles el asunto
-a significa attachment y seguidamente se indica la ruta y nombre del archivo adjunto

Ejemplos:

email -V -s "hola mundo 1" destinatario-1@dominio.com
email -V -s "hola mundo 2" destinatario-2@dominio.com,destinatario-3@dominio.com
email -V -s "archivo adjunto" -a ~/kubuntu.pdf destinatario-5@dominio.com,destinatario-6@dominio.com
email -V -s "facturas" -a ~/factura-1.png -a ~/factura-2.png destinatario-7@dominio.com

Ejemplos con los alias de la libreta de direcciones:

email -V -s "hola familia" familia
email -V -s "fotos de navidad" -a ~/Documentos/fotos.zip familia
email -V -s "presupuestos" -a ~/presupuesto-1.pdf -a ~/presupuesto-2.pdf trabajo

Por supuesto, después de cada línea se presiona ENTER y de inmediato se abrirá el editor de texto nano, en donde se escribe el cuerpo del mensaje y al finalizar CTRL+X, Y, ENTER. Cuando se cierra el editor de texto el sistema pedirá la contraseña de la cuenta de Gmail y posteriormente aparecerán mensajes similares a estos:

Enter your SMTP Password:
Connecting to server smtp.gmail.com on port 587
Greeting the SMTP server...
Sending  "hola mundo"  |*****************************| 100% of 218 Bytes
Sending QUIT...

Si en vez de lo anterior aparecen los siguientes mensajes entonces Gmail no aceptó la conexión porque no se hizo de manera segura, por lo tanto quiere decir que email no se compiló correctamente con las librerías mencionadas desde el principio de este tutorial:

email: WARNING: No SSL support compiled in. Disabling TLS.
email: FATAL: Smtp error: 530 5.7.0 Must issue a STARTTLS command first. j31sm312569waf.33

i) cómo desinstalar email

Ir a la carpeta donde está el contenido del archivo .tar.gz:

cd ~/Descargas/email/email-3.1.2/

y ejecutar como root esta línea:

sudo make uninstall

el sistema eliminará todo y preguntará si se desean eliminar los archivos de configuración:

Removing Binary...
Removing /usr/local/etc/email...
Removing /usr/local/share/doc//email-3.1.2...
Removing /usr/local/share/man/man1/email.1...
Would you like to remove users personal ~/.email.conf files? y
Finished!

y si faltaban dependencias y por esa razón se desinstaló temporalmente, entonces es necesario limpiar los archivos de configuración de la compilación anterior, de lo contrario la nueva compilación no será exitosa si se utiliza la configuración previa pues no incluye las dependencias faltantes que se pretenden instalar. Para eliminar los archivos de configuración de la compilación previa, dentro de la misma carpeta donde está el código fuente:

make clean

a partir de este punto ya es posible repetir desde el inciso c) cumplir dependencias.

Algunas notas adicionales

Cabe hacer mención que el equipo se estará conectando de manera directa al servidor de Gmail, por lo tanto Gmail estampará el nombre del equipo y la dirección IP pública en los encabezados del correo, lo cual es un proceso normal de la comunicación durante la transmisión de correos, no es una vulnerabilidad. Observar la segunda línea (suprimí mi dirección IP pública):

Return-Path: <usuario@gmail.com>
Received: from vbox-kubuntu804 ([148.---.---.---])
        by mx.google.com with SMTP id j28sm823237waf.32.2009.06.23.17.26.22
        (version=TLSv1/SSLv3 cipher=RC4-MD5);
        Tue, 23 Jun 2009 17:26:23 -0700 (PDT)
Message-ID: <4a4172af.1cba720a.127d.79dc@mx.google.com>
Subject: hola mundo
From: "Siddharta Buda" <usuario@gmail.com>
To: <destinatario-1@dominio.com>
Date: Tue, 23 Jun 2009 19:25:52 -0500
Content-Type: text/plain
X-Mailer: Cleancode.email v3.1.2

Hola mundo

Para más información sobre la aplicación se puede abrir el archivo README que está en la misma carpeta donde extrajo el contenido del archivo .tar.gz, o también:

email --help

Si alguien tiene interés en donar a Dean Jones puede hacerlo a través de este enlace:
http://www.cleancode.org/projects/email/donate


POR QUÉ LO HICE

Puedo conectarme vía SSH a mi equipo, y enviar mensajes de correo con archivos adjuntos de manera rápida, sin la necesidad de iniciar sesión en KDE o cualquiero otro entorno gráfico. También es posible que en algún momento el entorno gráfico quede desconfigurado, por lo tanto sólo me quedaría conectarme a la red usando otras aplicaciones para la consola como centerim, irssi, ó w3m, así que me faltaba una aplicación para enviar correos de manera rápida, sin tener que usar lo que comúnmente se conoce como webmail, y que pudiera incluso enviar archivos adjuntos.

Había considerado la posibilidad de instalar otras aplicaciones muy conocidas y avanzadas, como postfix, sendmail, y mailx, pero estas aplicaciones habilitan un equipo para convertirlo en un servidor de correo, así que tras la instalación y configuración del servidor de correo es necesario configurar puertos en el cortafuegos, luego hay que crear y configurar buzones de correo (cuentas de usuario), y finalmente instalar y configurar un cliente de correo para que utilice el servidor primeramente instalado.

En mi caso no he querido convertir mi equipo en un servidor de correo y pasar todos esos procesos ya que soy el único usuario de mi equipo, además no hay otros equipos a mi alrededor que vayan a usar el mío como relay para también enviar sus propios mensajes de correo. Por lo tanto la aplicación email es lo más apropiado para mis necesidades, ya que como he explicado anteriormente, se conecta directamente a un servidor de correo en Internet, en donde ya existe una cuenta creada y que soporta envío a través de SMTP.

También puedo tener 2 o más archivos de configuración, y alternar entre ellos para enviar desde distintas cuentas de correo.


Lecturas recomendadas:

E-mail Encryption http://en.wikipedia.org/wiki/E-mail_encryption
Extended Simple Mail Transfer Protocol (ESMTP) http://es.wikipedia.org/wiki/ESMTP
GNU Privacy Guard (GPG) http://es.wikipedia.org/wiki/GNU_Privacy_Guard
Mail Delivery Agent (MDA) http://es.wikipedia.org/wiki/Mail_Delivery_Agent
Mail Submission Agent (MSA) http://en.wikipedia.org/wiki/Mail_submission_agent
Mail Transport Agent (MTA) http://es.wikipedia.org/wiki/Agente_de_Transferencia_de_Correo
Mail User Agent (MUA) http://es.wikipedia.org/wiki/Cliente_de_correo_electr%C3%B3nico
Pretty Good Privacy (PGP) http://es.wikipedia.org/wiki/Pretty_Good_Privacy
OpenSSL http://es.wikipedia.org/wiki/OpenSSL
Simple Mail Transfer Protocol (SMTP) http://es.wikipedia.org/wiki/Simple_Mail_Transfer_Protocol
Transport Layer Security http://es.wikipedia.org/wiki/Transport_Layer_Security

Sidd.

Imagen de Sero
Enviado por Sero el 30 Junio, 2009 - 23:29.

como siempre tan interesantes tus aportes :)

Imagen de shaola
Enviado por shaola el 1 Julio, 2009 - 16:40.

wiki, wiki, wiki! gracias sidd, si es que no paras! clap clap clap

Imagen de vinagrex
Enviado por vinagrex el 1 Julio, 2009 - 16:53.

muy buen post =)! gracias por el aportazo

Imagen de siddharta
Enviado por siddharta el 1 Julio, 2009 - 17:34.


shaola escribió:

wiki, wiki, wiki! [...]

Lo que sucede es que he sentido que este tipo de tutoriales son más personales, pues por ejemplo hablé de Gmail, nano (en realidad yo siempre he usado vim, pero se me hizo más fácil explicar con nano) .. en cambio los otros HOWTO que he escrito en la sección Wiki siento que son más genéricos .... que aplican a varias cosas distintas ... mmmmh, no sé si me explico.

De cualquier manera tengo planes de agregar más documentos a la sección Wiki. De hecho creía que iba a tener menos tiempo últimamente, pues quizás recuerden que mi bebé apenas tiene un mes de nacida ... y miren, ya me he aventado 5 entradas en el mes .... más que los meses anteriores .... ¡jajajaja!, mi objetivo es por lo menos tener 2 entradas por mes en el blog.

Gracias por a todos la retroalimentación, en verdad espero que haya quien pongan a prueba lo que escribo, y lo usen o lo desechen ... pero habiéndolo probado. ¿Saben? a veces creo que escribo demasiado .. quizás simplemente pude indicar:

- conseguir cuenta de Gmail
- instalar email
- email --help

Siento que los lectores se asustan al ver tanto código ... que en realidad no es tanto, pero en verdad me gusta explicar lo que hago ... y evitarles a otros los tropiezos con los que yo me pude haber topado.

Sidd.

Imagen de ncw2233
Enviado por ncw2233 el 10 Enero, 2011 - 23:07.

hola me pareció exelente tu tuto , te tengo una pregunta .. existe algún comando de de envió de mails que me permita ocupar el puerto 465 del smtp.gmail.com. intente con "sendEmail" (no sendmail, por si hay confucion smile ), y como lei arriba no se puede ocuapar email para ese puerto ,si es que me puedes ayudar . se agradece :p

se que ya a pasado tiempo sobre el tuto , pero te agradeceria algun consejo :p gracias

Imagen de siddharta
Enviado por siddharta el 11 Enero, 2011 - 00:23.
ncw2233 escribió:

hola me pareció exelente tu tuto , te tengo una pregunta .. existe algún comando de de envió de mails que me permita ocupar el puerto 465 del smtp.gmail.com. intente con "sendEmail" (no sendmail, por si hay confucion smile ), y como lei arriba no se puede ocuapar email para ese puerto ,si es que me puedes ayudar . se agradece :p

se que ya a pasado tiempo sobre el tuto , pero te agradeceria algun consejo :p gracias

Gracias por la retroalimentación. En este momento no recuerdo por qué razón la aplicación email no puede conectarse al puerto 465, pero en la página oficial hay una nota del autor. Desconozco si eso sucede con cualquier otra aplicación como las que mencionaste. Sugiero busques en la red (yo siempre busco en inglés) expresiones como "linux shell gmail 465", o "send emails from linux shell with gmail port 465", "connect to gmail port 465 from linux", por ejemplo.

Saludos,
Sidd.

Imagen de ncw2233
Enviado por ncw2233 el 12 Enero, 2011 - 19:59.

gracias