Mutt
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
Certifikáty
Napřed importujeme klíč do smime (lze i více klíčů):
smime_keys add_p12 /home/user/osobni_20240128.p12
A následně si je vylistujeme
smime_keys list
a vybereme si ten defaultní, kterou si uložíme do ~/.mutt/muttrc
smime_default_key=aa26c522.0 smime_sign_as=aa26c522.0
Je nutné mít nainstalován gpgsm a přidat do něj klíč, např.:
gpgsm --import /home/user/osobni_20240128.p12
Po přidání si můžeme zkontrolovat, že zde je přidán:
gpgsm -K
Nyní je nutné naučit mutt příkazům pro smime, stačí okopírovat
cp /usr/share/doc/mutt/examples/smime.rc ~/mutt/
a do ~/mutt/muttrc přidat:
source ~/.mutt/smime.rc
Odkazy:
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
Do konfigurace stačí přidat:
# # formatovani html emailu, nutno nastavit ~/.mailcap, viz # http://www.debian-administration.org/articles/75 # auto_view text/html # pokud nekdo posle take text/plain, pak jej preferujeme alternative_order text/plain text/html text/enriched
Do souboru ~/.mailcap pak přidáme nebo upravíme řádky:
text/html; elinks %s; nametemplate=%s.html text/html; elinks -width 180 -dump -eval "set document.codepage.assume = %{charset}" %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. Pokud elinks vyhazuje nějaké chyby (např. ohledně otevření gnome-keyring), můžete je ošetřit přesměrováním chybového výstupu do /dev/null.
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ý.
Odesílání pošty
# # 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 folder-hook ~/.mutt/mail/ZCU 'set smtp_url="smtps://civenka@smtp.zcu.cz:465/" from="Civenka <civenka@civ.zcu.cz>"' folder-hook ~/.mutt/mail/GMAIL 'set smtp_url="smtps://civenka@smtp.gmail.com:465/" from="Civenka <civenka@gmail.com>"'
Přijímaná pošta
# nastaveni pro ZCU set folder="~/.mutt/mail/ZCU" set spoolfile="=INBOX" # pokud zakomentuji, otevre se /var/mail/$USER set mbox="=" #set record="=Sent" #set postponed="=Drafts" #set trash="=Trash" mailboxes =INBOX =Sent =Sent/SentOld =Drafts =Templates =Trash =my/friends =my/family #nastaveni pro GMAIL set folder="~/.mutt/mail/GMAIL" mailboxes =INBOX =Sent =Archive =Drafts =Trash =Spam =Starred =my_project folder-hook ~/.mutt/mail/GMAIL 'unset record' # gmail automaticky vlozi zpravu do odeslanych, offlineimap ji pak nasynchronizuje folder-hook ~/.mutt/mail/GMAIL 'set folder=~/.mutt/mail/GMAIL spoolfile="=INBOX" mbox="=" postponed="=Drafts" trash="=Trash"'
Drobné úpravy
Příkaz folder-hook lze používat na nejrůznější nastavení, například pro vypnutí signatury:
#set signature = "~/.signature" folder-hook ~/.mutt/mail/ZCU 'set signature="~/.signature"' folder-hook ~/.mutt/mail/GMAIL 'unset signature'
nebo jejich přepínaní
#set signature = "~/.signature" folder-hook ~/.mutt/mail/ZCU 'set signature="~/.signature"' folder-hook ~/.mutt/mail/GMAIL 'set signature="~/.signature.gmail"'
Bindings
Gmail má trochu jiné zvyklosti než ostatní emailové klienty, každá složka je jako label, pokud chceme email opravdu smazat, pak je třeba jej přesunout do koše, upravíme tedy klávesové zkratky dle aktuálně používáného foldru (původní mapování pro klávesy zakomentujte nebo smažte):
folder-hook ~/.mutt/mail/ZCU 'macro index,pager ",d" "<purge-message>" "Purge message"' folder-hook ~/.mutt/mail/ZCU 'macro index,pager "d" "<delete-message>" "Delete message (move to Trash)"' folder-hook ~/.mutt/mail/GMAIL 'macro index,pager ",d" "<delete-message>" "Gmail delete message (move to Trash)"' folder-hook ~/.mutt/mail/GMAIL 'macro index,pager "d" "<purge-message>" "Gmail remove label (stay in Archive)"'