Mutt

Z HelpDesk

Mutt je emailový konzolový klient. Jde o podobnou záležitost jako je Alpine (pine), ale s jinou filosofií ovládání a vysokou mírou možností konfigurace. Tento klient není přímo podporován CIVem, ale vzhledem ke znalostem zde uvádíme jeho základní konfiguraci. Jeho velkou výhodou je používání regulárních výrazů při vyhledávání a dalších hromadných operací s emaily. V současnosti nevyřešeným problémem je šifrování a podepisování emailů certifikátem uloženým na zaměstnaneckých JIS kartách, to je ale způsobeno chybou v cizí knihovně, která emaily nedokáže podepsat.

Toto nastavení předpokládá mutt verze 1.5.21 nebo vyšší, ideálně s rozšířeními. V Debianu je pod názvem mutt-patched, nutná je podpora SMTP a Trash.

Základní nastavení

Všechny konfigurační úpravy budou prováděny v domovském adresáři uživatele, na linuxu se předpokládá ~/.mutt/ Základní konfigurace se uvádějí do souboru muttrc, ostatní jako je obarvování, nastavení klávesových zkratek nebo dalších rozšíření se doporučuje nastavit do samostatných souborů a v muttrc je na konec připojit parametrem source.

Pošta pro odesílání

Vhodné uvést do souboru muttrc, zde je komentovaný konfigurační soubor, zvýrazněné hodnoty je třeba upravit dle vašeho nastavení:

#
# SMTP
#
set smtp_url="smtps://civenka@smtp.zcu.cz:465/" # pro odesilani pouzivam tento ucet
set from = "Civenka <civenka@civ.zcu.cz>" # vas email pro hodnotu 'From:' v emailech
set envelope_from = "yes" # nastaveni odesilatele na hodnotu z 'From:'

Při prvním odeslání emailu se vás Mutt zeptá na heslo k vašemu účtu, do doby než jej ukončíte si vaše heslo zapamatuje.

Příjem pošty

#
# folders
#
#set imap_authenticators="gssapi:login"
#set ssl_starttls=yes
set mbox_type=Maildir
set folder="imaps://civenka@imap.zcu.cz/" # vase schranka, na tuto polozku se odkazuje dale znakem '='
set spoolfile="=INBOX"  # zde se nachazi nova posta
set mbox="="             # kde je mailbox 
set record="=Sent"      # odchozi posta
set postponed="=Drafts" # rozepsana posta
set trash="=Trash"      # kde je zahozena posta, nutno povolit nize
set imap_list_subscribed=yes 
 
# which mailboxes to list in the sidebar
mailboxes =INBOX =Sent =Sent/SentOld =Drafts =Templates =Trash =my/friends =my/family

V této chvíli by se měl Mutt dokázat připojit k vaší emailové schránce a dokázat odeslat poštu. Pro lepší uživatelský komfort pokračujte v konfiguraci dále.

Další nastavení pro vhodnější chování

Tato nastavení zlepšují standardní nastavení Muttu, pro základní funkcionalitu nejsou nezbytná, ale doporučená:

#
# obecne
#
set maildir_trash = yes # ukladat smazane maily do kose, nutne rozsireni Trash
set mail_check = 30     # jak casto kontrolovat novou postu v sekundach
set mark_old = no       # oznacovat neprectenou postu jako starou pri ukonceni Muttu, priste bude zvyraznena
set pipe_decode = "yes" # umozni preprocessing zpravy jinymi programy
set signature = "~/.signature" # pripoji signaturu z urceneho souboru
set smart_wrap = "yes"  # zalamovani na mezerach, pokud se nevejde email do radku
#set wrap = "120" # po kolika znacich se ma lamat text v browseru, defaultne dle nastaveni terminalu
set date_format="%d. %b (%A) v %H:%M:%S %Z %Y" # cesky format datumu
set wait_key = "no" # pokud se vola ext. program, pri navratu nechtit 'Press any key to continue ...'

#
# Chovani pri Re: a Fwd:
#
set include                     # automaticke vkladani predchozi zpravy
set attribution="%D, %a wrote:" # nastaveni uvodniho textu zpravy
set forward_format="Fwd: %s"    # uprava Subject: pri preposilani zpravy
set forward_edit=yes            # chceme preposilanou zpravu upravovat, tj. automaticky otevrit editor
set forward_quote=yes           # preposlana zprava bude oznacena uvozenim

#
# jake casti zahlavi mailu chceme zobrazovat
#
ignore *                              # nic nezobrazovat
unignore From: To: Cc: Date: Subject: # z hlavicky mailu ukazat tyto polozky

Cache

Umožní rychleji prohledávat emaily, to co již stáhl ukládá do nastaveného adresáře:

#
# cache
#
set header_cache="~/.mutt/cache"
set message_cachedir="~/.mutt/cache"
set message_cache_clean=yes

Rozšířená konfigurace

Sidebar

Doporučuji nastavit v samostatném souboru .mutt/sidebar a v hlavním souboru .mutt/muttrc jej volat direktivou:

source ~/.mutt/sidebar 

Jde o rozšíření, v kterém jsou vidět jednotlivé foldry, jestli je v nich nová pošta a kolik. Všechny volby jsou dobře zdokumentovány, proto jen jedna z vhodných konfigurací:

#
# sidebar 
#
# set up the sidebar, default not visible
set sidebar_width=25
set sidebar_visible=yes
set sidebar_delim='|'
set sidebar_sort=no

# color of folders with new mail
color sidebar_new yellow default

# ctrl-n, ctrl-p to select next, prev folder
# ctrl-o to open selected folder
bind index \CP sidebar-prev
bind index \CN sidebar-next
bind index \CO sidebar-open
bind pager \CP sidebar-prev
bind pager \CN sidebar-next
bind pager \CO sidebar-open

# I don't need these.  just for documentation purposes.  See below.
# sidebar-scroll-up
# sidebar-scroll-down

# b toggles sidebar visibility
#macro index b '<enter-command>toggle sidebar_visible<enter>'
#macro pager b '<enter-command>toggle sidebar_visible<enter>'

# Remap bounce-message function to "B"
bind index B bounce-message

Jediná důležitá část je položka mailboxes, kde jsou vyjmenované foldry, které chcete zobrazovat a to včetně subfoldrů. Ovládání je klávesovými zkratkami ctrl+n (next folder), ctrl+p (previous folder) a ctrl+o (open folder).

Kombinace vyhledávání kontaktů ze ZČU LDAP serveru a z vlastních emailů

Je založeno na balíku lbdb, který je nutné nastavit, pro Mutt stačí nastavit jeden řádek:

set query_command="lbdbq '%s'" # prohledavani adressbooku pres LDAP

Nastavení lbdb

Tento program se nastavuje v adresáři ~/.lbdb/, hlavní část se nachází v souboru rc, kde stačí nastavit 2 hodnoty:

METHODS="m_ldap m_inmail"
LDAP_NICKS="zcu.cz"

To znamená, že lbdb bude pro správu kontaktů používat dva moduly, jeden na LDAP (kontakty ZČU) a druhý vytvářet na základě příchozích emailů, oba moduly je třeba nastavit zvlášť.

modul m_ldap

Konfigurace je uložena v ~/.lbdb/ldap.rc a je třeba, aby vypadal takto (poslední řádek musí končit na "1;"):

%ldap_server_db = (
  'zcu.cz' => ['ldap.zcu.cz',
            'ou=rfc2307,o=zcu,c=cz',
            'givenname sn cn mail', 'givenname cn sn mail o',
            '${mail}', '${givenname} ${sn}', '${o}' ]
);

# hostname of your ldap server
$ldap_server = 'ldap.zcu.cz';
# ldap base search
$search_base = 'ou=rfc2307,o=zcu,c=cz';
# list of the fields that will be used for the query
$ldap_search_fields = 'uid cn sn ircnick';
# list of the fields that will be used for composing the answer
$ldap_expected_answers = 'uid cn sn ircnick';
# format of the email result based on the expected answers of the ldap query
$ldap_result_email = '${mail}';
# format of the realname result based on the expected answers of the ldap query
$ldap_result_realname = '${cn} ${sn}';
# format of the comment result based on the expected answers of the ldap query
$ldap_result_comment = '(${ircnick})';
# Don't use wildchars on searching
$ignorant = 1;
# Do an anonymous bind to the LDAP server:
$ldap_bind_dn = '';
$ldap_bind_password = '';
1;

modul m_inmail

Tento modul prohledá vaše emaily a vytvoří z ní databázi kontaktů v souboru ~/.lbdb/m_inmail.list, stačí do konfiguračního souboru Mutt (doporučuji do samostatného .mutt/bindings a přilinkovat jej příkazem source ~/.mutt/bindings v hlavním konfiguráku) tyto dva řádky:

# lbdb-fetchaddr
macro index ",a" "<enter-command>set pipe_split=yes<enter><tag-prefix><pipe-message>lbdb-fetchaddr<enter><enter-command>unset pipe_split<enter>" "Add email address into contacts"
macro pager ",a" "<enter-command>set pipe_split=yes<enter><tag-prefix><pipe-message>lbdb-fetchaddr<enter><enter-command>unset pipe_split<enter>" "Add email address into contacts"

Postupným stiskem kláves , (čárka) a a (malé písmeno 'a') se prohledá v daném emailu hlavička a vloží se emailové adresy do databáze. Pokud chcete více emailů současně, musíte je označit (tag) a pak přes ; (středník) vyvolat hromadnou operaci pro ,a

Pozor: aby program mohl prohledat emaily, bude je muset stáhnout, pokud jej necháte prohledávat například všechny emaily v Trash před tím, než je smažete. Stažení emailu může zahltit vaši linku a určitou dobu trvat. Po tuto dobu bude Mutt nedostupný, po ukončení prohledávání se automaticky vrátí jeho rozhraní. Počítejte přibližněš 10 vteřin na každých 100 emailů při rozumné konektivitě.

Problém je, že to uloží i kontakty pro ZČU, kde máme aktuálnější z LDAPu, proto je potřeba databázový soubor očistit o tyto kontakty. To nám nejlépe provede cron s tímto záznamem (pustí se denně v 19:17 a odebere všechny duplicity a adresy z domény zcu.cz):

17 19 * * * ( cd ~/.lbdb/ ; cp m_inmail.list m_inmail.list.tmp && cat m_inmail.list.tmp | sort -u -d -f -i -k 1,1 | egrep -v '[@\.]zcu.cz' > m_inmail.list && rm -f m_inmail.list.tmp )

Použití

Při dotazu na adresu příjemce stačí napsat část emailové adresy nebo jména a stisknout ctrl+t, pak si z nabídnutého seznamu stačí vybrat správnou volbu. Pokud je emailová adresa z modulu m_inmail, pak je u ní uvedeno datum poslední aktualizace. Více emailových adres se odděluje čárkou.

Formátování html emailu

#
# formatovani html emailu, nutno nastavit ~/.mailcap, viz
# http://www.debian-administration.org/articles/75
#
auto_view text/html

Do souboru ~/.mailcap přidáme nebo upravíme řádky:

text/html;                      links %s; nametemplate=%s.html
text/html;                      links -width 180 -dump %s; nametemplate=%s.html; copiousoutput

Šířku používaného terminálu lze zjistit příkazem:

$ echo $COLUMNS
211

Ale je potřeba odečíst šírku sidebaru a oddělovače, což je 26 znaků, takže jsme přidali malou rezervu.

Vyhledávání URL

V mailech se často posílá URL, aby jste je měli přehledně, doinstalujte si program urlview, pak stačí stisknout ctrl+b a dostanete nabídku všech nalezených URL, po vybrání by dané URL mělo zobrazit v prohlížeči.

Opravdové mazání emailu, nepřesunuj do koše

Mělo by stačit nastavit klávesovou zkratku pro smazání, nejlépe v souboru ~/.mutt/bindings:

bind index ",d" purge-message
bind pager ",d" purge-message

Klávesovou zkratkou ,d (čárka 'd'), pak daný email označíte ke smazání, po provedení synchronizace složky klávesou $ (dolar) budou změny provedeny.

Bez konektivity - offline

Příchozí pošta

Zde je potřeba použít libovolný nástroj pro synchronizaci emailů skrze protokol IMAP. Velmi jednoduchým programem je offlineimap, doporučuji od verze 6.5.4, kde je ošetřena změna IP adresy stroje a hlavně nepadá, taktéž je vylepšeno logování a ssl část.

ZČU

Použijeme výše uvedenou konfiguraci Muttu, ve které upravíme následující direktivy:

set folder="~/.mutt/mail/ZCU"

set maildir_trash = no 

Změnili jsme tedy úložiště emailů, vypnuli označování mailů v koši příznakem, jinak by se emaily nepřesunuly do koše.

Vytvoříme adresář mkdir -p ~/.mutt/mail a založíme konfigurační soubor ~/.offlineimaprc, lze použí komentovaný template z dokumentace a nastavit níže uvedené volby:

[general]
metadata = ~/.offlineimap
accounts = ZCU
maxsyncaccounts = 2
ui = TTYUI
ignore-readonly = no 

[Account ZCU]
localrepository = Local-ZCU
remoterepository = Remote-ZCU
autorefresh = 3
quick = 10

[Repository Local-ZCU]
type = Maildir
localfolders = ~/.mutt/mail/ZCU
sep = /
restoreatime = no

[Repository Remote-ZCU]
type = IMAP
remotehost = imap.zcu.cz
ssl = yes
sslcacertfile = /etc/ssl/certs/ca-certificates.crt
remoteuser = civenka
maxconnections = 1
holdconnectionopen = no
subscribedonly = no

Jediné, co je třeba upravit je hodnota remoteuser, kam patří jméno vašeho emailového účtu. Program umožňuje vložit do konfiguračního souboru heslo nebo odkaz na takový soubor. Toto nedoporučuji bez řádného zabezpečení, problém je, že takto nelze program pouštět automaticky po startu počítače, protože se bude na heslo ptát. Program stačí pustit ve vedlejším terminálu, zadat heslo a pak jej přesunout na pozadí nebo terminál minimalizovat, minimálně ze začátku je vhodné jej sledovat jak se chová.

Po tom, co vám poštu nasynchronizuje s poštou na serveru, pusťte Mutt a načtěte poštu.

Gmail

Pro Gmail je nastavení obdobné, a stačí jej přidat do seznamu accounts a nastavit části Account a Repository pro lokální i vzdálenou kopii. U Gmailu se doporučuje jej nepřetěžovat, jinak vás může Google odstřihnout, pokud mu začnete výrazněji vytěžovat připojení, to platí zvláště u první synchronizace, takže se nesnažte zvyšovat položku maxconnections. Synchronizace cca 3GB emailů trvá něco přes 2 dny, je třeba ji kontrolovat, občas může spadnout, nechte si ji běžet na terminálu. Podle toho, jak máte emaily značkované, vám také zaberou velikost na disku, počítejte tak s dvojnásobkem pokud chcete mít kopii celého Gmailu. Pokud nepotřebujete všechny maily (značka Všechny zprávy) pak bude zabraného prostoru relativně málo, k odfiltrování vybraných složek lze použít v remote části příkazu folderfilter, pro inspiraci takto (netestováno):

folderfilter = lambda foldername: foldername not in '[Gmail]/V&AWE-echny zpr&AOE-vy'

Lokalizace Gmailu je také v pojmenovaní imapových složek, bohužel trochu nečitelně, takže je potřeba udělat přejmenování. Do souboru ~/.offlineimaprc přidejte tyto řádky, nezapomeňte změnit název svého účtu:

[Account GMAIL]
remoterepository = Remote-GMAIL
localrepository = Local-GMAIL
autorefresh = 3
quick = 10

[Repository Local-GMAIL]
type = Maildir
localfolders = ~/.mutt/mail/GMAIL
nametrans = lambda folder: re.sub('^Spam$', '[Gmail].Spam',
                           re.sub('^Drafts$', '[Gmail].Koncepty',
                           re.sub('^Sent$', '[Gmail].Odeslan&AOE- po&AWE-ta',
                           re.sub('^Starred$', '[Gmail].S hv&ARs-zdi&AQ0-kou',
                           re.sub('^Trash$', '[Gmail].Ko&AWE-',
                           re.sub('^Important$', '[Gmail].D&AW8-le&AX4-it&AOk-',
                           re.sub('^Archive$', '[Gmail].V&AWE-echny zpr&AOE-vy', folder)))))))

[Repository Remote-GMAIL]
type = Gmail
sslcacertfile = /etc/ssl/certs/ca-certificates.crt
remoteuser = civenka@gmail.com
realdelete = no
maxconnections = 1
nametrans = lambda folder: re.sub('^.*Gmail.*Spam$', 'Spam',
                           re.sub('^.*Gmail.*Koncepty$', 'Drafts',
                           re.sub('^.*Gmail.*Odeslan&AOE- po&AWE-ta$', 'Sent',
                           re.sub('^.*Gmail.*S hv&ARs-zdi&AQ0-kou', 'Starred',
                           re.sub('^.*Gmail.*Ko&AWE-$', 'Trash',
                           re.sub('^.*Gmail.*D&AW8-le&AX4-it&AOk-$', 'Important',
                           re.sub('^.*Gmail.*.V&AWE-echny zpr&AOE-vy$', 'Archive', folder)))))))

a upravte v sekci [general] seznam účtů následovně:

accounts = ZCU,GMAIL

V terminálu nyní pustťe příkaz offlineimap, zadejte přístupová hesla k účtům a sledujte synchronizaci. Pokud heslo zadáte špatně, vypíše se chyba autentizace, ale už se znova nezeptá. Je potřeba program přerušit a pustit znovu.

Odchozí pošta

Zatím nevyřešeno, je potřeba nakonfigurovat lokální SMTP server, který se bude pokoušet emaily odesílat. Maily by měly jít i takto rozepsat a uložit coby Draft, po připojení je možné je znova otevřít a odeslat. Je také třeba řešit autentizaci vůči SMTP serveru ZČU, pokud jste mimo univerzitní IP rozsah.

Správa více účtů

Předpokládejme, že máme maily ZCU a GMAIL, pro oba musíme trochu upravit chování, naštěstí Mutt zná tzv. hook skripty, které upraví automaticky konfiguraci podle toho, jaký účet máte zrovna otevřený.