Table of Contents

Configuración de Mutt con Gmail + GPG (optativo) fácil + Teclas útiles de Mutt

Manual de Mutt recomendado: mutt.pdf
Software: Mutt, Gnupg (optativo) y w3m (optativo pero recomendable).
Atajos de teclado: Mutt Keys
Aclaración: GNU Privacy Guard = GnuPG = GPG.

Manual GPG en español: http://www.dewinter.com/gnupg_howto/spanish/index.html

Funcionalidades.

NOTA: Se debe activar IMAP en Gmail (Configuración) y configurar las carpetas que se pueden acceder desde el protocolo IMAP.

Si se va a utilizar Mutt en un entorno sin escritorio (SSH) con GPG, este debe tener la siguiente configuración para poder hacer uso de pinentry-curse y no pinentry-gtk-2. Esa aplicación pertenece a Gnugp y pedirá la clave para almacenarla en memoria un periodo de tiempo y que no moleste cada poco tiempo solicitando la clave. En entornos con escritorio se arrancará la aplicación gtk-2.

Fichero /etc/bash.bashrc o ~/.bashrc

export GPG_TTY=$(tty)

Enlace simbólico (/usr/bin/pinentry-curses).

unlink /usr/bin/pinentry
ln -s /usr/bin/pinentry-curses /usr/bin/pinentry

Fichero ~/.gnupg/gpg-agent.conf

# Keyboard control.
no-grab
 
# PIN entry program.
pinentry-program /usr/bin/pinentry-curses

El demonio pgp-agent se arranca de forma predeterminada al usar el primer comando gpg o aplicación que lo requiera. Si el fichero de configuración gpg-agent.conf no parece tener ningún efecto, otra posibilidad para forzar el uso de pinentry-curses es arrancar el demonio gpg-agent con las siguientes opciones.

gpg-agent --homedir /home/busi/.gnupg --use-standard-socket --pinentry-program /usr/bin/pinentry-curses --daemon

Ficheros y su ubicación:

Adaptar los ficheros de configuración: Completar donde pone XXXX en los ficheros de configuración (Usuarios, claves y llavero GPG). El script ~/.mutt/aliases.sh debe tener permisos de ejecución. Se recomienda utilizar una terminal UTF-8 y sistemas con locales UTF-8 (Leer)

NOTA: Si no se va a utilizar GPG, el fichero .muttrc_gpg no es necesario crearlo.

Teclas fundamentales de Mutt

Documentación completa: http://www.mutt.org/doc/manual/

Mutt cheat sheets: http://sheet.shiar.nl/mutt / mutt keys

Moverse por el framework.

@ Muestra la dirección del emisor (From:) usada en el correo.

Acciones

NOTA: Al eliminar un correo (tecla d), este correo no irá a la carpeta / etiqueta “Papelera” de Gmail, para ello se debe crear un marco para otra tecla o bien utilizar la tecla “s” y guardarlo en la carpeta “Papelera”.

Modo de solo lectura.

Reenvío de correos con Mutt.

CUIDADO !!: La opción de rebotar no edita el emisor (from:), por lo tanto los correos suelen ser calificados como SPAM o simplemente descartados, dependerá del servicio que los reciba.

Al querer reenviar correo con cuerpos de mensaje en formato “multipa/alternativ”, usado para enviar el cuerpo del mensaje en formatos de texto y html, lo mejor es seleccionar uno de los dos y reenviarlo. La combinaciones de teclas sería “v” para mostrar los ficheros adjuntos (el cuerpo es un fichero adjunto también), marcar los adjuntos que se quieran con la tecla “t” evitando el del tipo multipa. Por último se pulsa “f” para reenviarlos.

Si se reenvían correos que tienen el cuerpo del mensaje en formato “multipa/alternativ” es muy posible que el cuerpo del mensaje no se envíe ya que mutt no edita las cabeceras y las adapta para este tipo de cuerpos de mensaje (rfc1341: https://www.w3.org/Protocols/rfc1341/7_2_Multipart.html).

Otra opción sería reenviar el correo usando “Esc+e” y posteriormente editar el tipo de fichero adjunto mediante “Cntrl+t” para indicar que es un fichero de texto. De esta manera se enviaría el cuerpo en bruto (delimitadores multipa y los textos en formato html y texto plano). Ejemplo de como se debe adaptar el tipo MIME:

Content-Type: multipart/alternative; boundary="_----------=_1551732836237023" 
Content-Type: text/plain

Teclas una vez se muestra la pantalla con el resumen del correo a enviar.

Descripción de Flags.

Solución: La tecla <backspace> no funciona en Mutt .

Depende de como interprete la terminal en uso la tecla de retroceso (backspace) puede que Mutt no la vincule a la acción de subir a “linea anterior” al leer correos. Un mensaje como el siguiente puede ser mostrado.

Tecla sin enlace. Presione '?' para obtener ayuda.

Si la combinación “Cntrl + h” funciona adecuadamente en Mutt, lo más probable es que el backspace devuelva “^?”, se puede probar pulsando “cntrl + v” y posteriormente la tecla retroceso. (Link 1 / Link2). La solución sería configurar en el archivo .muttr el bind previous-line con ^?.

bind pager ^? previous-line

NOTA: Recordemos que “^?” no son dos caracteres, se debe generar usando “Cntrl + v” a la hora de editar .muttrc, no copiando y pegando desde la web.

Autocompletado. Usar el tabulador, es funcional en varias zonas de Mutt (Adjuntar, escribir direcciones, etc).

Arrancar navegador al pulsar una URL en consola.

Lo más simple es usar las opción de la propia consola sobre la que estamos utilizando Mutt. Por ejemplo en lxterminal, vale con pulsar el enlace con la tecla Cntrl pulsada y nos arrancará el navegador predeterminado.

Colores (Según nuestra configuración).

  1. Verde: Enviado por nosotros.
  2. Rojo negrita: Fichero de tamaño superior a la media.
  3. Amarillo: Correos ya leídos.
  4. Blanco: El correo estaba destinado a más personas.
  5. Fondo blanco: Correos sin leer.
  6. Fondo Rojo: Destacados (Estrella de Gmail).

Ficheros de configuración

Fichero $HOME/.muttrc

.muttrc
# Juego de caracteres de los mensajes que enviamos:
set send_charset = "utf-8"
set assumed_charset = "iso-8859-1"
 
# Editor. Si no se declara se usa $EDITOR.
set editor = "vim -c 'set syntax=mail ft=mail enc=utf-8'"
set menu_scroll = "yes"
 
# Remitente de los mails:
set from = "XXXX@gmail.com"
set realname = "XXXX"
 
# Configuraciones servidor IMAP:
set imap_user = "XXXX@gmail.com"
set smtp_url = "smtp://XXXXX@gmail.com@smtp.gmail.com:587/"
# Opcional (no lo recomiendo porque queda almacenada la contraseña en texto plano):
set imap_pass = "XXXXXXXX"
set smtp_pass = "XXXXXXXX"
# En caso de no introducir los dos valores anteriores, se nos pedirá ingresar la contraseña al enviar o recibir mails.
set folder = "imaps://XXXX@gmail.com@imap.gmail.com:993"
# Coonfiguramos el Inbox
set spoolfile = "+INBOX"
# Configuramos la carpeta de borradores (Debe llamarse igual que en el webmail):
set postponed = "+[Gmail]/Borradores"
# Guardamos los mails en Enviados:
set record ="+[Gmail]/Enviados"
# Ajustes para la conexión IMAP:
set mail_check=60
set imap_keepalive=300
 
# Buzones extra que queremos comprobar (si tenemos carpetas extra en Gmail):
#mailboxes "+[Gmail]/Spam"
#mailboxes "+[Gmail]/Papelera"
 
#### Refrescar con la G
bind index G imap-fetch-mail
 
# Muy útil cuando estamos suscritos a una lista de correos, nos ordena los mensajes por threads:
set sort=threads
set strict_threads=yes
set sort_aux=reverse-last-date-received       
set sort_re
 
# Crear los directorios para no obtener errores, 
# 'mkdir -p ~/.mutt/cache/{bodies,headers}':
set message_cachedir = "~/.mutt/cache/bodies"
set header_cache = "~/.mutt/cache/headers"
 
# El siguiente archivo debe existir y contiene la firma, que va al pie de cada mail que escribamos, naturalmente:
set signature = ".mutt/.firma"
 
set pager_format = " %C - %[%H:%M] %.20v, %s%* %?H? [%H] ?"
set index_format="%3C %4Z %4[!%d.%m %H:%M] %-40.40F (%5c) %s"  
#set pager_format="%S %C/%T?%n: %-50.50n %s"
 
# No mostrar todos los campos de la cabecera del mensaje, solo algunos:
ignore          *
unignore        From To Cc Bcc Date Subject
# y en este orden:
unhdr_order     *
hdr_order       From: To: Cc: Bcc: Date: Subject:
 
##################################################### Color settings for mutt.
 
# Default color definitions
color normal     white         default
color hdrdefault green         default
color quoted	 green         default
color quoted1    yellow        default
color quoted2    red           default
color signature  cyan          default
color indicator  brightyellow  red
color error      brightred     default
color status	 brightwhite   blue
color tree	 brightmagenta default
color tilde	 blue          default
color attachment brightyellow  default
color markers	 brightred     default
color message    white         default
color search     brightwhite   magenta
color bold       brightyellow  default
 
# Color definitions when on a mono screen
mono bold      bold
mono underline underline
mono indicator reverse
mono error     bold
 
# Colors for items in the reader
color header brightyellow default "^(From|Subject):"
color header brightcyan   default ^To:
color header brightcyan   default ^Cc:
mono  header bold                 "^(From|Subject):"
 
# Many of these formulas were stolen from Jeremy Blosser
# These would be much simpler if colors were additive.
 
# regular new messages
color index black         white   "~N !~T !~F !~p !~P"
# regular tagged messages
color index black         cyan    "~T !~F !~p !~P"
# regular flagged messages
color index black         red     "~F !~p !~P"
# messages to me
color index yellow        default "~p !~N !~T !~F !~P"
color index brightyellow  white   "~p ~N !~T !~F !~P"
color index yellow        cyan    "~p ~T !~F !~P"
color index yellow        red     "~p ~F !~P"
# messages from me
color index green         default "~P !~N !~T !~F"
color index green         white   "~P ~N !~T !~F"
color index green         cyan    "~P ~T !~F"
color index green         red     "~P ~F"
# big messages
color index brightred     default "!~N ~z 102400-"
color index brightred     cyan    "~T !~F !~p !~P ~z 102400-"
color index brightred     white   "~N ~z 102400-"
 
# deleted messages
color index red           default "!~N ~D"
color index red           white   "~N ~D"
 
 
# Highlights inside the body of a message.
 
# Attribution lines
color body magenta default "\\* [^<]+ <[^>]+> \\[[^]]+\\]:"
color body magenta default "(^|[^[:alnum:]])on [a-z0-9 ,]+( at [a-z0-9:,. +-]+)? wrote:"
 
# URLs
color body brightyellow default "([a-z][a-z0-9+-]*://(((([a-z0-9_.!~*'();:&=+$,-]|%[0-9a-f][0-9a-f])*@)?((([a-z0-9]([a-z0-9-]*[a-z0-9])?)\\.)*([a-z]([a-z0-9-]*[a-z0-9])?)\\.?|[0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+)(:[0-9]+)?)|([a-z0-9_.!~*'()$,;:@&=+-]|%[0-9a-f][0-9a-f])+)(/([a-z0-9_.!~*'():@&=+$,-]|%[0-9a-f][0-9a-f])*(;([a-z0-9_.!~*'():@&=+$,-]|%[0-9a-f][0-9a-f])*)*(/([a-z0-9_.!~*'():@&=+$,-]|%[0-9a-f][0-9a-f])*(;([a-z0-9_.!~*'():@&=+$,-]|%[0-9a-f][0-9a-f])*)*)*)?(\\?([a-z0-9_.!~*'();/?:@&=+$,-]|%[0-9a-f][0-9a-f])*)?(#([a-z0-9_.!~*'();/?:@&=+$,-]|%[0-9a-f][0-9a-f])*)?|(www|ftp)\\.(([a-z0-9]([a-z0-9-]*[a-z0-9])?)\\.)*([a-z]([a-z0-9-]*[a-z0-9])?)\\.?(:[0-9]+)?(/([-a-z0-9_.!~*'():@&=+$,]|%[0-9a-f][0-9a-f])*(;([-a-z0-9_.!~*'():@&=+$,]|%[0-9a-f][0-9a-f])*)*(/([-a-z0-9_.!~*'():@&=+$,]|%[0-9a-f][0-9a-f])*(;([-a-z0-9_.!~*'():@&=+$,]|%[0-9a-f][0-9a-f])*)*)*)?(\\?([-a-z0-9_.!~*'();/?:@&=+$,]|%[0-9a-f][0-9a-f])*)?(#([-a-z0-9_.!~*'();/?:@&=+$,]|%[0-9a-f][0-9a-f])*)?)[^].,:;!)? \t\r\n<>\"]"
 
# email addresses
color body brightmagenta default "((@(([0-9a-z-]+\\.)*[0-9a-z-]+\\.?|#[0-9]+|\\[[0-9]?[0-9]?[0-9]\\.[0-9]?[0-9]?[0-9]\\.[0-9]?[0-9]?[0-9]\\.[0-9]?[0-9]?[0-9]\\]),)*@(([0-9a-z-]+\\.)*[0-9a-z-]+\\.?|#[0-9]+|\\[[0-9]?[0-9]?[0-9]\\.[0-9]?[0-9]?[0-9]\\.[0-9]?[0-9]?[0-9]\\.[0-9]?[0-9]?[0-9]\\]):)?[0-9a-z_.+%$-]+@(([0-9a-z-]+\\.)*[0-9a-z-]+\\.?|#[0-9]+|\\[[0-2]?[0-9]?[0-9]\\.[0-2]?[0-9]?[0-9]\\.[0-2]?[0-9]?[0-9]\\.[0-2]?[0-9]?[0-9]\\])"
 
# PGP messages
color  body            brightyellow    default "^gpg: Good signature .*"
color  body            white           default "^gpg: "
color  body            brightwhite     red     "^gpg: BAD signature from.*"
mono   body            bold                    "^gpg: Good signature"
mono   body            bold                    "^gpg: BAD signature from.*"
 
# Various smilies and the like
color body brightwhite default "<[Gg]>"                            # <g>
color body brightwhite default "<[Bb][Gg]>"                        # <bg>
color body brightwhite default " [;:]-*[})>{(<|]"                  # :-) etc...
# *bold*
color body brightblue  default "(^|[[:space:][:punct:]])\\*[^*]+\\*([[:space:][:punct:]]|$)"
mono  body bold                "(^|[[:space:][:punct:]])\\*[^*]+\\*([[:space:][:punct:]]|$)"
# _underline_
color body brightblue  default "(^|[[:space:][:punct:]])_[^_]+_([[:space:][:punct:]]|$)"
mono  body underline           "(^|[[:space:][:punct:]])_[^_]+_([[:space:][:punct:]]|$)"
# /italic/  (Sometimes gets directory names)
#color body brightblue  default "(^|[[:space:][:punct:]])/[^/]+/([[:space:][:punct:]]|$)"
#mono  body underline           "(^|[[:space:][:punct:]])/[^/]+/([[:space:][:punct:]]|$)"
 
# Border lines.
color body blue default "( *[-+=#*~_]){6,}"
 
#########
source ~/.muttrc_gpg
 
#########
macro index \Cs  "<change-folder> =[Gmail]/Enviados"<enter>  "go to Sent Items"
 
######## Los ficheros no leídos nuevos no los marque como Old al salir de mutt.
set mark_old=no
 
######## Alias
set alias_file = "~/.mutt/aliases.txt"
set sort_alias = alias
set reverse_alias = yes
source $alias_file
set display_filter    = '$HOME/.mutt/aliases.sh'
 
######## w3c
set mailcap_path        = ~/.mutt/mailcap
auto_view text/html
 
# Si hay versión en modo texto del correo (Depende del emisor) es mejor evitar que mutt lo renderice como HTML, para eso se debe usar la siguiente opción.
 
alternative_order text/plain text/html

NOTA: Cuando un correo tiene mucho contenido html y no puede ser bien representado en la terminal, siempre se puede pulsar la tecla “x” y que nuestro gestor de archivos se encargará del resto. Por norma abrirá el navegador con el contenido del correo.

.muttrc_gpg
# Verificar por defecto las firmas de todos los mensajes recibidos.
set pgp_verify_sig
 
## Uso de GPG en el mismo cuerpo y no como adjunto MIME
# Esto puede ser necesario si nuestro destinatario no soporta PGP/MIME
# ATENCION: si se aplica sobre adjunto _ES MODIFICADO_ (firmado o
# cifrado)
 
# CTRL+V para firmar en el mismo cuerpo sin usar adjuntos PGP/MIME el
# "s" es para que no pregunte si desea sobreescribir
# /tmp/mutt-host-XXXX-Y
macro compose \CV "Fgpg --clearsign\ns"
 
# CTRL+V para verificar la firma sin usar adjuntos PGP/MIME
macro pager \CV "|gpg --verify\n"
 
# CTRL+Y para cifrar en el mismo cuerpo sin usar adjuntos PGP/MIME el
# "s" es para que no pregunte si desea sobreescribir
# /tmp/mutt-host-XXXX-Y
macro compose \CY "Fgpg -ea\ns"
 
# CTRL+Y para descifrar del mismo cuerpo sin usar adjuntos PGP/MIME se
# sale del visor less con una "q" de quit...
macro pager \CY "|gpg --decrypt|less\n"
 
# Macro para que al usar múltiples cuentas se puedan abrir directorios sin problemas (Tecla c), 
macro index 'c' '<change-folder>?<change-dir><home>^K=<enter>'
##########
 
# decode application/pgp
set pgp_decode_command="gpg --status-fd=2 %?p?--passphrase-fd 0? --no-verbose --quiet --batch --output - %f"
# verify a pgp/mime signature
set pgp_verify_command="gpg --status-fd=2 --no-verbose --quiet --batch --output - --verify %s %f"
# decrypt a pgp/mime attachment
set pgp_decrypt_command="gpg --status-fd=2 %?p?--passphrase-fd 0? --no-verbose --quiet --batch --output - %f"
# create a pgp/mime signed attachment
# set pgp_sign_command="gpg-2comp --comment '' --no-verbose --batch --output - %?p?--passphrase-fd 0? --armor --detach-sign --textmode %?a?-u %a? %f"
set pgp_sign_command="gpg --no-verbose --batch --quiet --output - %?p?--passphrase-fd 0? --armor --detach-sign --textmode %?a?-u %a? %f"
# create a application/pgp signed (old-style) message
# set pgp_clearsign_command="gpg-2comp --comment '' --no-verbose --batch --output - %?p?--passphrase-fd 0? --armor --textmode --clearsign %?a?-u %a? %f"
set pgp_clearsign_command="gpg --no-verbose --batch --quiet --output - %?p?--passphrase-fd 0? --armor --textmode --clearsign %?a?-u %a? %f"
# create a pgp/mime encrypted attachment
# set pgp_encrypt_only_command="pgpewrap gpg-2comp -v --batch --output - --encrypt --textmode --armor --always-trust -- -r %r -- %f"
set pgp_encrypt_only_command="pgpewrap gpg --batch --quiet --no-verbose --output - --encrypt --textmode --armor --always-trust -- -r %r -- %f"
# create a pgp/mime encrypted and signed attachment
# set pgp_encrypt_sign_command="pgpewrap gpg-2comp %?p?--passphrase-fd 0? -v --batch --output - --encrypt --sign %?a?-u %a? --armor --always-trust -- -r %r -- %f"
set pgp_encrypt_sign_command="pgpewrap gpg %?p?--passphrase-fd 0? --batch --quiet --no-verbose --textmode --output - --encrypt --sign %?a?-u %a? --armor --always-trust -- -r %r -- %f"
# import a key into the public key ring
set pgp_import_command="gpg --no-verbose --import %f"
# export a key from the public key ring
set pgp_export_command="gpg --no-verbose --export --armor %r"
# verify a key
set pgp_verify_key_command="gpg --verbose --batch --fingerprint --check-sigs %r"
# read in the public key ring
set pgp_list_pubring_command="gpg --no-verbose --batch --quiet --with-colons --list-keys %r" 
# read in the secret key ring
set pgp_list_secring_command="gpg --no-verbose --batch --quiet --with-colons --list-secret-keys %r" 
# fetch keys
# set pgp_getkeys_command="pkspxycwrap %r"
# pattern for good signature - may need to be adapted to locale!
# set pgp_good_sign="^gpgv?: Good signature from "
# OK, here's a version which uses gnupg's message catalog:
set pgp_good_sign="`gettext -d gnupg -s 'Good signature from "' | tr -d '"'`"
# This version uses --status-fd messages
set pgp_good_sign="^\\[GNUPG:\\] GOODSIG"
 
###########
set pgp_autosign=no
set pgp_sign_as=XXXXXX
set pgp_replyencrypt=yes
set pgp_timeout=3600
# Verificar por defecto las firmas de todos los mensajes recibidos.
set pgp_verify_sig

Dentro del directorio $HOME/.mutt

aliases.sh
#!/bin/bash
#
# From http://wcm1.web.rice.edu/mutt-tips.html
 
MESSAGE=$(cat)
 
#NEWALIAS=$(echo "${MESSAGE}" | grep -m 1 ^"From: " | sed s/[\,\"\']//g | awk '{$1=""; if (NF == 3) {print "alias" $0;} else if (NF == 2) {print "alias" $0 $0;} else if (NF > 3) {print "alias", tolower($(NF-1))"-"tolower($2) $0;}}')
make_new_alias() {
    echo "${MESSAGE}" | grep -m 1 ^"From: " | sed s/[\,\"\']//g | awk '{$1=""; if (NF == 3) {print "alias" $0;} else if (NF == 2) {print "alias" $0 $0;} else if (NF > 3) {print "alias", tolower($(NF-1))"-"tolower($2) $0;}}'
}
NEWALIAS=$(make_new_alias)
 
if grep -q 'notification\|noreply\|no-reply\|\(^bugs@\)' <(echo "$NEWALIAS"); then
    # This is an automated message.
    :
else
    if grep -Fxq "$NEWALIAS" $HOME/.mutt/aliases.txt; then
        # This alias already exists.
        :
    else
        # Create the new alias.
        echo "$NEWALIAS" >> $HOME/.mutt/aliases.txt
    fi
fi
 
echo "${MESSAGE}"
mailcap
text/html; w3m -I %{charset} -T text/html; copiousoutput;

Descargar ficheros adjuntos con Mutt

Visualización de nombres de adjuntos

Si la visualización de ficheros adjuntos tienen problemas de codificación, muy posible sea por el uso de clientes como outlook que siguen usando codificaciones no recomendadas.

=?UTF-8?B?MS0...
=?iso-8859-1?...

Ejemplo:
# Codificación erronea.
A     6 =?UTF-8?Q?AB=5FL=C3=B6sung_Wissenswertes                                                                                                                                                                                                  [applica/pdf, base64, 202K]
# Así debería de verse.
A     6 AB_Lösung Wissenswertes.pdf                                                                                                                                                                                                                    [applica/pdf, base64, 202K]

la solución es ejecutar el siguiente comando en mutt y volver a listar los adjuntos (tecla v)

:set rfc2047_parameters

Abrir ficheros adjuntos con Mutt sin descargarlos

Es posible jugar con los fichero mailcap o bien usar un macro para abrir ficheros. Un truco muy socorrido, es usar el gestor de ficheros de la distribución en uso para abrir archivos, ya que este suele tener mapeadas las aplicaciones. Por ejemplo para escritorios LXDE se podría usar pcmanfm en un macro de la siguiente manera (Tecla “x”). En otros escritorio como xfce sería “thunar” el encargado de abrir los ficheros.

## Macro Open files (pcmanfm).
macro attach x \
"\
<enter-command>unset wait_key<enter>\
<shell-escape>rm -f /tmp/mutt-attach<enter>\
<save-entry><kill-line>/tmp/mutt-attach<enter>\
<shell-escape> pcmanfm /tmp/mutt-attach &^A\
"

Con este macro, al pulsar la tecla “x” sobre un un adjunto (tecla “v” para listarlos) guardará el fichero en /tmp/ y lo abrirá con pcmanfm.

Abrir un fichero mbox con Mutt.

mutt -f fichero.mbox

Descargar todos los adjuntos a partir de un fichero mbox: extraer_adjuntos_de_ficheros_mbox

Enlaces de interés.