Enviar correo desde consola con Mutt

Mutt es un cliente de correo para la consola, es muy fácil de usar y de configurar. Aunque el manejo del programa se hace principalmente desde su interfaz, aquí indico algunos comandos útiles para enviar un email directamente desde la línea de comandos, algo que puede resultar interesante cuando se usan en algun script.

Instalación y configuración de mutt.

Primero hay que instalar el programa y configurarlo. Si ya lo tenemos instalado, saltamos este paso.

# apt-get install mutt

Para usar mutt hay que configurarlo correctamente, indicándole una cuenta de correo desde la que se enviarán los emails, los datos del servidor, puerto, seguridad, etc, y si queremos usarlo desde la línea de comandos, también debemos incluir la contraseña para nuestra cuenta de correo. Editamos o creamos si no existe el fichero ~/.muttrc e introducimos los datos necesarios, por ejemplo, si tenemos una cuenta de gmail, puede ser algo así:

# Ajustes para el servidor de correo saliente SMTP
set from = "micorreo@gmail.com"
set realname = "Mi nombre"
set smtp_url = "smtp://micorreo@gmail.com@smtp.googlemail.com:587/"
set smtp_pass = "contraseña_para_micorreo"

# Ajustes para el correo entrante usando IMAP
set imap_user = "micorreo@gmail.com"
set folder = "imaps:/imap.googlemail.com:993"
set spoolfile = "+INBOX"
set imap_pass = "contraseña_para_micorreo"

# Si queremos añadir un archivo como plantilla de mensaje, donde incluyamos nuestra firma,
# creamos el fichero primero y lo asignamos aquí
set signature = "~/plantilla-firma.txt"

Con esta configuración, mutt tiene todos los datos necesarios para conectar con el servidor de correo, por lo que no pedirá la contraseña cuando enviemos o leamos el correo. Las contraseñas se guardan abiertas, al final se explica como encriptarlas usando GnuPG.

Algunos comandos útiles para enviar emails.

Mutt tiene una interfaz de usuario bastante intuitiva y fácil de usar, aunque no voy a explicar aquí como se usa, eso bien podría hacerse en un artículo nuevo. Para ejecutar el programa tan solo hay que escribir mutt en la consola, sin añadir ningún argumento ni opción.

Mutt admite varias opciones en la línea de comandos, lo que lo hace muy útil para usar

  • Para enviar un email simple.
$ echo "Este es el texto del mensaje" | mutt -s "Esto es el asunto" destinatario@correo.com
  • Para enviar uno o varios archivos adjuntos.
$ echo "Texto del mensaje" | mutt -s "Asunto del mensaje" destinatario@correo.com -a fichero1.txt imagen.jpg archivo.tar.gz
  • Para enviar un email con copia CC.
$ echo "Texto del mensaje" | mutt -s "Asunto" destinatario@correo.com -c otroemail@mail.com
  • Escribir el cuerpo del email con el comando echo es útil cuando es un texto corto, pero si es muy largo o queremos darle algo de formato, lo mejor es usar un editor de texto. Si ejecutamos directamente el comando mutt, este nos abrirá el editor que tengamos definido por defecto para la consola.
$ mutt -s "Asunto del mensaje" destinatario@correo.com -c otroemail@mail.com -a ficheroadjunto.zip

Después de escribir el texto en el editor, lo guardamos y salimos. Se abrirá de nuevo el interfaz de mutt. Para enviar el email tan solo hay que pulsar la tecla “y“.

Opcional. Encriptar las contraseñas usando GnuPG (GPG).

Como vemos en la configuración habitual de mutt, le estamos indicando nuestras contraseñas de correo de forma abierta y visible. Esto en principio no debería suponer ningún problema de seguridad si somos cuidadosos, ya que .muttrc es un fichero oculto que está solo en nuestra carpeta de usuario, nadie excepto nosotros tendría que tener acceso a el. No obstante una buena práctica es ocultar las contraseñas metiéndolas en un fichero encriptado con GPG y después indicarle a mutt que las busque en ese fichero. Para saber más sobre GnuPG y como usarlo, podemos leer este manual desde la web oficial. Los siguientes pasos son opcionales, sino queremos encriptar con GPG podemos omitirlos.

El primer paso es crear las claves GPG (pública y privada), si tenemos unas creadas de alguna ocasión anterior, podemos podemos utilizar esas y omitir este paso.

$ gpg --gen-key

A las preguntas respondemos indicando:
Tipo de clave: (1) RSA y ElGamal (sirve para firmar y cifrar)
Tamaño de clave: 2048 bits
Fecha de caducidad: 0 (no caduca)
Nombre y apellidos: Nombre Apellido
Dirección de correo electrónico: micorreo@gmail.com (utilizamos esta o cualquier otra)
Comentario: Se puede dejar en blanco

Después de validad todos los datos introducidos, pulsamos V. Nos pide una contraseña con la que proteger nuestras claves. GPG genera las claves a partir de bytes aleatorios obtenidos de acciones de teclado, movimientos de ratón, escrituras o lecturas de disco, etc. Por tanto hemos de hacer alguna actividad durante un tiempo hasta que se genere esta clave, este tiempo dependerá del tamaño de la clave (en este caso 2048 bits). Una buena idea es abrir otro terminal y ejecutar el comando “ls -R / “, así acabará antes.

Nota: En el tipo de clave hay que escoger uno que sirva tanto para cifrar como para firmar. Los hay que solo sirven para cifrar y otros solo para firmar. En este caso la opción (1) nos vale.

Una vez obtenidas nuestro par de claves pública/privada, ya se pueden utilizar para encriptar documentos. Ahora vamos a crear un fichero con los datos que queremos encriptar, en este caso solo serán las contraseñas smtp e imap. Creamos el fichero ~/.mutt/password.txt con este contenido:

set smtp_pass = "contraseña_para_micorreo"
set imap_pass = "contraseña_para_micorreo"

En este caso solo incluimos las contraseñas smtp e imap, pero podemos añadir cualquier otro dato del fichero ~/muttrc que queramos encriptar.

Ahora encriptamos este fichero password.txt usando nuestra clave pública.

$ gpg --encrypt -r micorreo@gmail.com -o password.gpg password.txt

Con la opción -r, indicamos el identificador de usuario de la clave que vamos a usar, ya que podemos tener varias. En este caso usamos la que hemos creado antes, asociada a micorreo@gmail.com.

Eso nos genera el fichero password.gpg con los datos de las contraseñas encriptados, por lo que ya podemos borrar el fichero fuente password.txt.

Lo siguiente es editar el fichero ~/.muttrc para eliminar las líneas de las contraseñas smtp e imap. Añadiendo ahora lo necesario para que mutt sepa donde encontrar estas contraseñas. La configuración de mutt con las contraseñas encriptadas podría ser algo así:

# Ajustes para el servidor de correo saliente SMTP
set from = "micorreo@gmail.com"
set realname = "Mi nombre"
set smtp_url = "smtp://micorreo@gmail.com@smtp.googlemail.com:587/"

# Ajustes para el correo entrante usando IMAP
set imap_user = "micorreo@gmail.com"
set folder = "imaps:/imap.googlemail.com:993"
set spoolfile = "+INBOX"

# Si queremos añadir un archivo como plantilla de mensaje, donde incluyamos nuestra firma,
# creamos el fichero primero y lo asignamos aquí
set signature = "~/plantilla-firma.txt"

# Contraseñas smtp e imap encriptadas
source "gpg -d ~/.mutt/password.gpg |"

Hay que tener en cuenta que al encriptar las contraseñas smtp e imap, lo que conseguimos es evitar que sean visibles, pero cada vez que enviemos o leamos el correo, GPG nos pedirá que introduzcamos la contraseña utilizada para proteger la clave pública. Para no tener que hacer eso, se puede utilizar gpg-agent.

Para correr gpg-agent como demonio y que obtenga nuestra contraseña GPG automáticamente cuando sea necesario, debemos agregar lo siguiente al final de nuestro archivo ~/.bashrc

envfile="$HOME/.gnupg/gpg-agent.env"
if [[ -e "$envfile" ]] && kill -0 $(grep GPG_AGENT_INFO "$envfile" | cut -d: -f 2) 2>/dev/null; then
  eval "$(cat "$envfile")"
else
  eval "$(gpg-agent --daemon --allow-preset-passphrase --write-env-file "$envfile")"
fi
export GPG_AGENT_INFO

Recargamos .bashrc con el siguiente comando:

$ source .bashrc

Configuramos GPG para que use gpg-agent. Editamos o creamos si no existe el fichero ~/.gnupg/gpg.conf y añadimos la línea:

use-agent

Reinciamos sesión y ya debería funcionar. La primera vez nos pedirá la contraseña que protege las claves, pero la guardará en cache y las proximas veces ya no la pedirá.

← Entrada anterior

Entrada siguiente →

11 Comentarios

  1. Jose

    set ssl_force_tls = yes
    set from = “my_user@gmail.com”
    set realname = “My Name”
    set imap_user = “$from”
    set imap_pass = “password”
    set folder = “imaps://imap.gmail.com:993”
    set spoolfile = “+INBOX”
    set postponed = “+[Gmail]/Drafts”
    set header_cache = /root/.mutt/cache/headers
    set message_cachedir = /root/.mutt/cache/bodies
    set certificate_file = /root/.mutt/certificates
    set smtp_url = “smtp://$from@smtp.gmail.com:465/”
    set smtp_pass = “$imap_pass”

    Conexión a smtp.gmail.com cerrada
    SMTP session failed: read error
    No se pudo enviar el mensaje.
    ——————————————————————–
    set ssl_force_tls = yes
    set from = “my_user@gmail.com”
    set realname = “My Name”
    set imap_user = “$from”
    set imap_pass = “password”
    set folder = “imaps://imap.gmail.com:993”
    set spoolfile = “+INBOX”
    set postponed = “+[Gmail]/Drafts”
    set header_cache = /root/.mutt/cache/headers
    set message_cachedir = /root/.mutt/cache/bodies
    set certificate_file = /root/.mutt/certificates
    set smtp_url = “smtp://$from@smtp.gmail.com:587/”
    set smtp_pass = “$imap_pass”

    SASL authentication failed
    No se pudo enviar el mensaje.
    ——————————————————————–

    EL caso, es que no puedo enviar mails :-(, uso Debian 8

    • Alberto Picado

      No he podido responder antes. No se si ya has conseguido que te funcione.

      Acabo de hacer unas pruebas con Google y efectivamente me da el mismo fallo “SASL authentication failed”. Lo que no se ahora mismo es si tiene algo que ver lo de la verificación en dos pasos que tengo activado desde hace un tiempo. A ver si mañana tengo un rato y miro el tema.

      De todas formas he probado con una cuenta de un servidor mio, usando la coonfiguración que pongo en el artículo, a excepción de que he cambiado smtp por smtps en la variable smtp_url, y me funciona correctamente. Lo único a tener en cuenta es que si cambia el certificado del servidor o se elimina del PC local, la línea de comandos no funcionará bien. Para eso es necesario cargar el inferface de MUTT al enviar o recibir y aceptar el nuevo certificado.

      mutt -s “Asunto” destinatario@ correo.com carga el programa para terminar de componer el email, al darle a enviar detecta el nuevo certificado y solo tenemos que añadirlo de forma permanente.

      • Jose

        Buenas, yo tengo desactivado la verificacion 2 pasos, no he podido usar la configuracion de Gmail, pero si funcona con iCloud, y no me muestra el error que te comentado. Con IMAP iCloud, 0 problemas.

        Aunque no le gusta la contraseña encriptada, con lo que demomento esta en texto plano en el fichero /home/$USER/.muttrc (lo tengo pendiente de cambiar)

        Saludos

        • Alberto Picado

          Acabo de hacer una prueba con otra cuenta de Google en la que no tengo la verificación en dos pasos. El asunto es simple, tan solo hay que configurar en la cuenta de Google que se permitan las aplicaciones menos seguras. Esto no es posible si la verificación en dos pasos está activada.

          Y ya debería funcionar.

          • Jose

            Nada, ni activando las aplicaiones menos seguras ni nada. Con iCloud, sin problemas. Con Gmail nada.

            Y lo peor, que en la raspberry pi, lo tengo configurado con la misma cuenta y me deja xD

            Pero en el VPS no, Es un Debian 8 actualizado.
            El VPS se queda con iCloud y fuera.

            Gracias

          • Alberto Picado

            Acabo de probar con Debian 8 y me funciona perfectamente usando la cuenta de Google con las aplicaciones menos seguras activadas. Mi versión es Debian 8.7 y mutt-1.5.23-3. Te pongo lo que tengo en .muttrc

            set from = “micorreo@gmail.com”
            set realname = “Alberto”
            set smtp_url = “smtps://micorreo@gmail.com@smtp.gmail.com:465/”
            set smtp_pass “contraseña”

            set imap_user = “micorreo@gmail.com”
            set folder = “imaps://imap.gmail.com:993”
            set spoolfile = “+INBOX”
            set imap_pass = “contraseña”

            Supongo que ya lo habrás descargado al VPS, pero ten en cuenta también lo del certificado de Google. No se me ocurre mucho más. Prueba y ya me cuentas.

  2. Jose

    Probado, na de na… xD
    Se queda con la config de icloud.

    Muchas gracias

    • Alberto Picado

      Pues nada, ahí se queda.
      😉

    • Alberto Picado

      Parece que Google bloquea por defecto ciertos “dispositivos sospechosos”, en este caso tu servidor VPS. Creo que aquí puede estar la solucción.

      https://www.google.com/accounts/DisplayUnlockCaptcha

      • Jose

        Probado y nada… xD

        Muchas gracias por tu blog. 😉 espero que toda esta información, le pueda servir a alguien en el futuro.

        Un placer! Saludos

        • Alberto Picado

          Esta claro que cada caso es un mundo. Yo haciendo lo que te he puesto puedo enviar sin problemas desde mi VPS. En fin, muchas gracias a ti por comentar.

Deja un comentario