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.
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).
Fichero $HOME/.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.
# 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
#!/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}"
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.