NávodySoftwareUnix

Útulný Mutt

Všechny e‐mailové kli­enty jsou mi­zerné, te­nhle je mi­zerný o tro­chu méně.

– Mi­chael R. El­kins, cca 1995

Úvod

Zku­sil jsem všechny možné e‐mailové kli­enty, na­ko­nec jsem cel­kem dlouho po­u­ží­val Thun­der­bird, který mě ale hrozně štval vším mož­ným, a když jsem se pak pře­stě­ho­val před ně­ja­kou do­bou na Ubuntu, ob­je­vil jsem Mutt. Nejdřív jsem si mys­lel, že to fakt ne, pak jsem si řekl, že to zku­sím, když jsem těžce se­lhal při jeho kon­fi­gu­raci, řekl jsem si opět, že to fakt ne, a pak jsem, od­hod­lán to zku­sit znova, ob­je­vil te­nhle člá­nek od Steva Loshe. A z toho budu silně čer­pat i v tomto ná­vodu.

Při­pravte se, že vám kon­fi­gu­race Muttu za­bere ve­čer… nebo taky ně­ko­lik ve­čerů, po­kud se na ně­čem sek­nete. Mutt není kli­ent, který na­in­sta­lu­jete, za­pnete, za­dáte e‐mail a heslo, a mů­žete ve­sele pra­co­vat. Ale když se tou kon­fi­gu­rací pro­kou­šete, bude to stát za to, pro­tože dobře na­kon­fi­gu­ro­va­nému Muttu se vy­rovná asi má­lo­který kli­ent.

A ještě ta­kový de­tail: an­g­lická verze to­hoto ná­vodu je pro OSX, já jsem jej re­a­li­so­val pod Ubuntu 14.04. Po­kud máte jiný sys­tém, bu­dete muset uči­nit menší či větší změny, po­kud máte Win­dows, tak… asi hodně štěstí s Cygwi­nem. Zá­ro­veň taky ose­ká­vám tento ná­vod o ně­které části an­g­lické verze, se kte­rými např. ne­mám zku­še­nosti.

Ter­mi­no­lo­gická po­známka: CC zna­mená car­bon copy, tedy přes ko­pí­rák – ko­pie zprávy při­jde dal­šímu uži­va­teli. Zkratku CC po­u­ží­vám jako nor­mální slovo, tu­díž z něj tvo­řím slo­vesa, ad­jek­tiva a po­dobně. Deal with it.

Tech­nická po­známka: v kon­fi­gu­rá­cích uvá­dím edison23@​otakuland.​cz, vy si tam dejte svůj nor­mální gmai­lov­ský účet.

Jak po­u­ží­vám e‐mail

Mám oby­čejný účet na Gmailu, e‐maily čtu pri­márně na PC a na mo­bil­ním te­le­fonu, ale ob­čas se ke svému účtu při­po­juji i od­ji­nud, tzn. že po­tře­buji mít vše syn­chro­ni­zo­váno se ser­ve­rem Go­o­glu. Na bez­peč­nost si to­lik ne­po­tr­pím v tom smyslu, že mi ne­vadí, že se Go­o­gle te­o­re­ticky k mým e‐mailům může do­stat. Kdyby mi to va­dilo, tak ho už 8 let ne­po­u­ží­vám, že. E‐maily lo­kálně ulo­žené zá­lo­huji, takže je mám prak­ticky na třech mís­tech. Po­u­ží­vám štítky, tzn. v e‐mailovém kli­entu ko­pí­ruji maily do da­ných IMA­Pov­ských slo­žek, které na Gmailu štítky před­sta­vují.

Schéma kon­fi­gu­race

Bu­deme Mutt kom­bi­no­vat s ně­ko­lika dal­šími utli­ti­kami, a to kon­krétně s of­fli­ne­i­map, který za­jiš­ťuje syn­chro­ni­saci se vzdá­le­ným ser­ve­rem, msmtp, který za­jiš­ťuje ode­sí­lání e‐mailů (mutt to umí taky, ale není v tom tak dobrý) a s not­much, který umí e‐maily in­de­xo­vat, abychom v nich mohli rychle hle­dat.

Schéma správy e-mailů
Schéma správy e‐mailů

Po­kud vás to­hle ne­při­nu­tilo utéci do nej­bližší hos­pody, i kdyby Sta­robrno měla to­čit, pak směle čtěte dál.

Of­fli­ne­i­map

Of­fli­ne­i­map zr­ca­dlí všechny e‐maily do lo­kální složky. To se hodí i jako zá­loha, nicméně hlav­ním dů­vo­dem, proč jsem šel touto ces­tou já, je fakt, že Mutt je pak o mnoho rych­lejší, než když musí pra­co­vat přímo s IMAP ser­ve­rem. Zjis­til jsem totiž, že bez of­fli­ne­i­map Mutt pro­jíždí celý in­dex složky s maily při kaž­dém pře­chodu z jedné IMAP složky do jiné. Po­kud máte pár sto­vek e‐mailů, asi je to sne­si­telné, po­kud 15 ti­síc (ano, i ode­slané se po­čí­tají) jako já, tak ne.

Mějte na pa­měti, že jde o dvou­stran­nou syn­chro­ni­saci, takže po­kud něco hodně po­ka­zíte, tak mů­žete te­o­re­ticky při­jít o ně­které až všechny své e‐maily (i na Gmailu). Stát se to může na­pří­klad při tom, když sma­žete svůj mail­dir (nebo ně­které jeho části) a ne­sma­žete sta­vové sou­bory of­fli­ne­i­mapu, které ří­kají, v ja­kém stavu se syn­chro­ni­sace na­chá­zela po po­slední akci. Tyto sou­bory jsou ve složce ~/.offlineimap.

In­sta­lace Of­fli­ne­i­mapu

Zvo­lil jsem ofi­ci­ální re­po­si­táře Ubuntu a roz­hodl se dou­fat, že ně­jaký up­date mi ne­roz­bije sou­čas­nou kon­fi­gu­raci. Po­kud chcete v této bla­žené ne­vě­do­mosti žít také, po­u­žijte apt-get:

# apt-get install offlineimap

Sou­časná verze v době psaní to­hoto ná­vodu je 6.5.4–2.

Po­kud se chcete up­da­tům vy­hnout, mů­žete po­u­žít re­po­si­tář na Gitu, který lin­kuje ori­gi­nální ná­vod (ne­zkou­šel jsem):

# git clone git://github.com/spaetz/offlineimap.git
# cd offlineimap
# git checkout 679c491c56c981961e18aa43b31955900491d7a3
# python setup.py install

Kon­fi­gu­race Of­fli­ne­i­mapu

Of­fli­ne­i­map skla­duje kon­fi­gu­raci v ~/.offlineimaprc. Tento sou­bor vy­tvořte a vložte si do něj na­sta­vení po­dobná ná­sle­du­jí­címu:

[general]
ui = ttyui
accounts = edison23
fsync = False

[Account edison23]
localrepository = edison23-Local
remoterepository = edison23-Remote
status_backend = sqlite
postsynchook = notmuch new

[Repository edison23-Local]
type = Maildir
localfolders = ~/.mail/edison23
nametrans = lambda folder: {'drafts': '[Gmail]/Drafts',
                            'sent': '[Gmail]/Sent Mail',
                            'spam': '[Gmail]/Spam',
                            'important': 'Dulezite',
                            'fansub': 'Fansub',
                            }.get(folder, folder)

[Repository edison23-Remote]
maxconnections = 2
type = Gmail
remoteuser = edison23@otakuland.cz
remotepasseval = 'moje_heslo'
realdelete = no
nametrans = lambda folder: {'[Gmail]/Drafts': 'drafts',
                            '[Gmail]/Sent Mail': 'sent',
                            '[Gmail]/Spam': 'spam',
                            'Dulezite': 'important',
                            'Fansub': 'fansub',
                            }.get(folder, folder)
folderfilter = lambda folder: folder not in ['[Gmail]/Trash',
                                             '[Gmail]/All Mail',
                                             '[Gmail]/Starred',
                                             '[Gmail]/Important',
                                             'test',
                                             ]

Pro­jdeme si ně­která na­sta­vení po­stupně (ta, co ne­u­vá­dím, si buď do­hle­dejte, nebo je prostě zko­pí­rujte, ob­čas jsem to taky tak dě­lal).

ui = ttyui
accounts = edison23
fsync = False
  • ac­counts: ná­zvy účtů, mám jen je­den; obecně – všechno, kde se vy­sky­tuje v mých kon­fi­gu­rá­cích edison23, si na­hraďte tím, co si dáte do to­hoto pole a pak to už ne­měňte, po­kud ne­víte přesně, co dě­láte
  • fsync: ne­po­tře­bu­jeme, aby of­fli­ne­i­map syn­co­val mail­dir (lo­kální složka s e‐maily) po každé ope­raci, pro­tože když se něco stane (např. of­fli­ne­i­map spadne), tak o nic ne­při­jdeme, pro­tože se to na­praví při další syn­chro­ni­saci
Account edison23]
localrepository = edison23-Local
remoterepository = edison23-Remote
status_backend = sqlite
postsynchook = notmuch new
  • status_backend: bu­deme po­u­ží­vat da­ta­bází sqlite, takže po­kud ji ne­máte, tak apt-get install sqlite
  • po­st­syn­chook: tím po syn­chro­ni­saci za­vo­láme not­much, aby nám e‐maily re­in­de­xo­val
[Repository edison23-Local]
type = Maildir
localfolders = ~/.mail/edison23
nametrans = lambda folder: {'drafts': '[Gmail]/Drafts',
                            'sent': '[Gmail]/Sent Mail',
                            'spam': '[Gmail]/Spam',
                            'important': 'Dulezite',
                            'fansub': 'Fansub',
                            }.get(folder, folder)

Na­sta­vení pro lo­kální stranu.

  • type: jak jsem ří­kal, všechny e‐maily máme ve složce, takže mail­dir; exis­tuje ještě např. mbox, ale to ne­chcete
  • lo­cal­fol­ders: kde se váš mail­dir na­chází; složku, kam bu­dete své e‐maily uklá­dat (v mém pří­padě ~/.mail), vy­tvořte před spuš­tě­ním of­fli­ne­i­map na ně­ja­kém místě, kde máte dost místa. Roz­hodně aspoň troj­ná­so­bek, než ko­lik máte e‐mailů ve schránce.
  • na­me­trans: Po­zor! Zved­něte se, do­jděte si do led­ničky pro pivo, ote­vřete si ho a pak te­prve po­kra­čujte. Ná­sle­duje kód v Py­thonu. Ne, dobře, to­hle mám z pů­vod­ního ná­vodu, který je pro uži­va­tele OSX, nás na Li­nuxu to to­lik ne­pře­kvapí, ne? Kaž­do­pádně to­hle se stará o pře­klad ná­zvů IMAP slo­žek mezi lo­kál­ním mail­di­rem a vzdá­le­ným ser­ve­rem. Sem si mu­síte na­cpat všechny složky (aka štítky, la­bely, wha­te­ver), které na Gmailu máte. Mějte na pa­měti, že mi­ni­málně Drafts, Sent a Spam jsou v sub­složce [Gmail]. Na žádné další jsem tu­ším ne­na­ra­zil. Vlevo je lo­kál, vpravo vzdá­lený ser­ver.
[Repository edison23-Remote]
maxconnections = 2
type = Gmail
remoteuser = edison23@otakuland.cz
remotepasseval = 'moje_heslo'
realdelete = no
nametrans = lambda folder: {'[Gmail]/Drafts': 'drafts',
                            }.get(folder, folder)
folderfilter = lambda folder: folder not in ['[Gmail]/Trash',
                                             ]

Na­sta­vení pro vzdá­le­nou stranu.

  • ma­x­con­necti­ons: po­čet při­po­jení, které of­fli­ne­i­map pro při­po­jení k gmai­lov­skému ser­veru vy­u­žije. Do­po­ru­čuji ne­na­sta­vo­vat na víc než 2, ji­nak vás Gmail ve­sele vy­kopne.
  • Uži­va­tel­ské jméno a heslo va­šeho účtu tak, jak se nor­málně při­hla­šu­jete k Gmailu. Rov­nou ří­kám, že skla­do­vat heslo v plain textu je pří­šerná pra­sárna, ale to­hle je jedno z míst, kde se ná­vod pro Mac a pro Li­nux liší a já se ještě ne­do­stal k tomu, abych to ře­šil – jste‐li tu­díž na Macu, jděte se pro ře­šení in­spi­ro­vat do ori­gi­nál­ního ná­vodu, jste‐li na Li­nuxu, vy­mys­lete, jak se to řeší a buďte tak hodní a po­dělte se se mnou, budu vám vděčný.
  • re­al­de­lete: sma­zané maily se bu­dou jen pře­sou­vat do složky Trash, ne sku­tečně ma­zat
  • fol­der­fil­ter: složky/štítky, které ne­chcete, aby se syn­chro­ni­so­valy; tady je vhodné po­dotknout, že ur­čitě chcete vy­řa­dit All Mail, pro­tože to je sou­bor všech e‐mailů – tu­díž byste si zby­tečně du­pli­ko­vali svou schránku.

Chcete‐li šif­ro­vat své heslo, jděte se tím za­bý­vat, po­kud ne, je čas spus­tit of­fli­ne­i­map:

$ offlineimap

Po­kud máte to­lik e‐mailů jako já, je pravá chvíle na to jít teď do hos­pody. Po­kud jste všechno správně na­sta­vili, Gmail se ne­roz­hodne vás vy­ho­dit při 2 při­po­je­ních a po­dobně, bude ta­hle ope­race tr­vat pár ho­din. Když bu­dete mít štěstí, ne víc než tři. Of­fli­ne­i­map stáhne všechny vaše e‐maily včetně pří­loh (už chá­pete, proč tvr­dím, že po­sí­lat pří­lohy větší než 1 MB je pra­sárna, a rov­nou to mažu?) do va­šeho mail­diru. Po­kud se všechno po­vede, máte na svém po­čí­tači kom­pletní zá­lohu svého e‐mailového účtu. Po­kud jste něco po­ka­zili, tak možná ne­máte nic ani na mail­ser­veru. Zkuste se jít po­mod­lit, třeba to po­může.

Jak za­ří­dit, abyste mohli při­jí­mat e‐maily au­to­ma­ticky v ně­ja­kém ča­so­vém in­ter­valu nebo po stisku klá­vesy v Muttu, si vy­svět­líme poz­ději. Kaž­do­pádně další spuš­tění of­fli­ne­i­mapu už by mělo vy­vo­lat jen krátké po­rov­nání mail­diru se ser­ve­rem a pří­padné sta­žení no­vých e‐mailů.

Mutt

Je čas pro­bu­dit bes­tii.

In­sta­lace

Opět do­po­ru­čuji vo­lit in­sta­laci z re­po­si­tářů. Máte na vý­běr ze dvou verzí Muttu – zá­kladní a „spra­vené“. Zá­kladní je čistý Mutt, spra­vená (mutt‐patched) ob­sa­huje různé vy­chy­távky, jako je např. si­de­bar. Do­po­ru­čuji si vy­brat tu.

# apt-get install mutt-patched

Kon­fi­gu­race

Jak jsem už na­zna­čil, v Muttu si mů­žete na­sta­vit snad úplně všechno. Což pro za­čí­na­jí­cího uži­va­tele je cel­kem peklo. Po­kud bu­dete líní zjiš­ťo­vat, co které na­sta­vení zna­mená, tak aspoň tro­chu u toho ko­pí­ro­vání pře­mýš­lejte, ji­nak s vámi Mutt prav­dě­po­dobně spo­lu­pra­co­vat moc ne­bude.

Veš­kerá na­sta­vení Muttu se na­chá­zejí v sou­boru ~/.muttrc. Až se s Mut­tem tro­chu sži­jete, do­hle­dejte si tato na­sta­vení v do­ku­men­taci, ať víte, co dě­lají.

# Paths
set folder           = ~/.mail               # umisteni maildiru
set alias_file       = ~/.mutt/alias         # umisteni aliasu
set header_cache     = ~/.mutt/cache/headers # hlavicky e-mailu
set message_cachedir = ~/.mutt/cache/bodies  # tela e-mailu
set certificate_file = ~/.mutt/certificates  # certifikaty
set mailcap_path     = ~/.mutt/mailcap       # zaznamy pro jednotlive typy souboru
set tmpdir           = ~/.mutt/temp          # docasna slozka
set signature        = ~/.mutt/sig           # soubor s podpisem

Na­sta­vení cest k ad­re­sá­řům s daty, které bude Mutt po­tře­bo­vat. Složky si, tu­ším, je scho­pen vy­tvo­řit sám. Zá­znamy pro jed­not­livé typy sou­borů ještě ro­ze­beru níže, ostatní v pod­statě ne­po­tře­bu­jete ře­šit.

# Basic Options
set wait_key = no        # neotravuj, mutte
set mbox_type = Maildir  # typ mailboxu
set timeout = 180        # interval obnovovani
set mail_check = 0       # min. cas mezi obnovenimi
unset move               # kvuli gmailu
unset mark_old           # nove/prectene staci
set pipe_decode
set thorough_search
set edit_headers = yes   # povolit editovani hlavicek pri vytvareni e-mailu
set sleep_time = 0       # zrychleni prepinani adresaru

A teď pár zá­klad­ních na­sta­vení, aby se Mutt cho­val pří­čet­něji. Ty ne­po­psané si do­hle­dejte sami, sám po­řádně ne­vím, co dě­lají. edit_headers umož­ňuje při psaní e‐mailů např. při­dat pří­jemce nebo změ­nit ad­resu ode­si­la­tele (je­diný způ­sob, na který jsem za­tím v Muttu při­šel, jak ře­šit ali­asy – ač­ko­liv ofi­ci­álně to jde i čis­těji, prak­ticky jsem to ne­roz­bě­hal).

# Sidebar Patch --------------------------------------
set sidebar_delim   = '  │'
set sidebar_visible = yes
set sidebar_width   = 24

# Status Bar -----------------------------------------
set status_chars  = " *%A"
set status_format = "───[ Folder: %f ]───[%r%m messages%?n? (%n new)?%?d? (%d to delete)?%?t? (%t tagged)? ]───%>─%?p?( %p postponed )?───"

Na­sta­vení si­de­baru a sta­tus baru. Takhle to vy­padá pří­šerně, pak při­jdete na to, že ten sta­tus bar není tak těžké si ze­di­to­vat.

Ori­gi­nální ná­vod uvádí ještě skrý­vání ně­kte­rých částí hla­vičky e‐mailů, mně do­cela za­jimá všechno v nich, takže to v .muttrc ne­mám.

# Account Settings -----------------------------------

# Default inbox.
set spoolfile = "+edison23/INBOX"

# Alternate email addresses.
alternates 6516545649@mail.muni.cz

# Mailboxes to show in the sidebar.
mailboxes +edison23/INBOX \
        +edison23/drafts \
        +edison23/sent \
        +edison23/spam \
        +edison23/important \
        +edison23/fansub \

# Other special folders.
set mbox      = "+edison23/Archive"
set postponed = "+edison23/Drafts"

De­taily účtu, jako na­pří­klad jeho umís­tění, al­ter­na­tivní e‐mailové ad­resy (ali­asy) – tedy to, co mi ne­fun­guje – a ad­re­sáře, které chceme mít v si­de­baru.

A mů­žeme Mutt spus­tit. Za­tím ne­u­míme ode­sí­lat e‐mailu, ne­máme na­sta­vené klá­ve­sové zkratky a spoustu dal­ších věcí, ale na ove­ření, že Mutt fun­guje, to stačí, tak do toho:

$ mutt

Měli byste vi­dět se­znam svých e‐mailů, tedy zhruba něco ta­ko­vého:

Mutt screenshot
Mutt

Barvy od­po­ví­dat ne­bu­dou, ale to ča­sem po­cho­píte.

Po­kud Mutt nebo co­ko­liv ji­ného křičí ně­ja­kou chybu, za­stavte se a zjiš­ťujte, o co jde. Může být pro­blém se za­pi­so­vá­ním do slo­žek, může být pro­blém s ná­zvy slo­žek, po­pravdě může pro­blém tkvít skoro v čem­ko­liv.

Na ovlá­dání při­jdete prav­dě­po­dobně sami, ob­čas ně­kde máte ná­po­vědu, co které klá­vesy dě­lají, kom­plexní ná­po­vědu máte k dis­po­sici po stisku klá­vesy ?.

Mutt mů­žete zase vy­pnout, jdeme na­sta­vo­vat dále.

# Index View Options ---------------------------------
set date_format = "%m/%d %T"               # format data
set index_format="%2C | [%Z] (%-4.4c) %d ~ %-25.25F %s"
set sort = threads                         # zobrazovat e-maily po vlaknech
set sort_aux = reverse-last-date-received  # nejnovejsi e-maily nahore
set uncollapse_jump
set sort_re                                # vlakna se vytvari podle regexu
set reply_regexp = "^(([Rr][Ee]?(\[[0-9]+\])?: *)?(\[[^]]+\] *)?)*"

# Index Key Bindings ---------------------------------
bind index gg       first-entry             # prvni zaznam
bind index G        last-entry              # posledni

bind index R        group-reply             # odpoved skupine
bind index     sync-mailbox            # synchronisovat maildir
bind index   collapse-thread         # zavrit vlakno

For­máty zob­ra­zo­vání si mů­žete ča­sem na­sta­vit sami, klá­ve­sové zkratky vám možná také ne­bu­dou vy­ho­vo­vat, tak se do toho pak ča­sem za­hrabte. Syn­chro­ni­sace mail­diru zna­mená, že Mutt pro­ve­dené změny (pře­čtení e‐mailu, jeho sma­zání, …) pro­vede na lo­kální složce s e‐maily. Of­fli­ne­i­map se pak po­stará o to, aby se re­flek­to­valy i na vzdá­le­ném ser­veru.

Po­zor, syn­chro­ni­saci s mail­di­rem spustí i pře­chod do ji­ného ad­re­sáře.

Na­sta­vení pageru, nebo‐li okna, ve kte­rém se zob­ra­zují jed­not­livé e‐maily. Osobně pre­fe­ruji v pageru vi­dět pouze daný ote­vřený e‐mail a si­de­bar, ni­ko­liv i část in­dexu, jako uvádí pů­vodní pří­ručka.

# Pager View Options ---------------------------------
set pager_stop             # neskakat automaticky na dalsi zpravu
set menu_scroll            # zachovavat menu na vrchu obrazovky
unset markers              # nezobrazovat znak + na zalomenych radcich

Teď bude ná­sle­do­vat spousta na­sta­vení klá­ve­so­vých zkra­tek, které jsou sice velmi uži­tečné, ale ne­budu je po­pi­so­vat víc, než jsou po­psány v ko­men­tá­řích v kódu.

Sa­mo­statné pís­menko za macro index zna­mená, že zkrat­kou je přesně ono pís­meno. \C zna­mená Con­t­rol. Všechno je case‐sensitive.

# Postopone Draft ------------------------------------
bind compose p postpone-message             # odlozit zpravu (ulozit do Drafts)
bind index p recall-message                 # vyvolat odlozenou zpravu

# Ctrl-R - oznaci vse za prectene
macro index \Cr "T~UN." "mark all messages as read"

# Sync e-mail - spusti offlineimap (-f znamena pouze INBOX)
macro index O "offlineimap -o"          "run offlineimap to sync all mail"
macro index o "offlineimap -o -f INBOX" "run offlineimap to sync inbox"

# Kopirovani a presouvani mezi slozkami
macro index C "?" "copy a message to a mailbox"
macro index M "?" "move a message to a mailbox"

# Sidebar Navigation ---------------------------------
bind index,pager j   sidebar-next           # pohyb v sidebaru dolu
bind index,pager k     sidebar-prev         # pohyb v sidebaru nahoru
bind index,pager   sidebar-open      # otevrit oznacenou slozku

Shr­nutí klá­ve­so­vých zkra­tek

S touto kon­fi­gu­rací tedy zá­kladní na­vi­gace vy­padá ná­sle­dovně:

  • šipky nahoru/dolů: na­vi­gace v se­znamu e‐mailů
  • M, C: pře­sun a ko­pí­ro­vání e‐mailů mezi slož­kami
  • D: sma­zání e‐mailu
  • F: ozna­čení e‐mailu tagem dů­le­žitý
  • t: ozna­ceni více zpráv na­jed­nou pro hro­madné ope­race
  • j, k: po­hyb v si­de­baru
  • šipka do­prava: vstup do složky zvo­lené v si­de­baru
  • gg, G: skok na za­čá­tek, resp. ko­nec se­znamu e‐mailů
  • ?: ná­po­věda ke klá­ve­so­vým zkratkám

Pří­lohy

Se­znam pří­loh zob­ra­zíte stis­kem klá­vesy v. Při této pří­le­ži­tosti prav­dě­po­dobně bu­dete chtít mít mož­nost zob­ra­zit pří­lohy, které nejsou pla­in­tex­tové (tedy zob­ra­zi­telné v ter­mi­nálu), v ná­le­ži­tém pro­gramu. O to se po­stará ná­sle­du­jící na­sta­vení.

Pa­ma­tu­jete si na .mailcap? Tak teď ho po­u­ži­jeme. Vy­tvořte sou­bor ~/.mutt/mailcap a vložte do něj ná­sle­du­jící na­sta­vení.

# MS Word documents
application/msword; ~/.mutt/view_attachment.sh %s xdg-open
application/vnd.openxmlformats-officedocument.wordprocessingml.document; ~/.mutt/view_attachment.sh %s "-" '/usr/lib/libreoffice/program/soffice'

# Images
image/jpg; ~/.mutt/view_attachment.sh %s jpg xdg-open
image/jpeg; ~/.mutt/view_attachment.sh %s jpg xdg-open
image/pjpeg; ~/.mutt/view_attachment.sh %s jpg xdg-open
image/png; ~/.mutt/view_attachment.sh %s png xdg-open
image/gif; ~/.mutt/view_attachment.sh %s gif xdg-open

# PDFs
application/pdf; ~/.mutt/view_attachment.sh %s pdf "-" '/usr/bin/evince'

# HTML
text/html; ~/.mutt/view_attachment.sh %s html firefox new-tab %U 2>/dev/null

# Unidentified files
application/octet-stream; ~/.mutt/view_attachment.sh %s "-"

Toto na­sta­vení de­fi­nuje pří­kazy, které se mají pro­vést v pří­padě, že pří­loha má ur­čitý MIME‐type (je ur­či­tého typu). Já tady mám de­fi­no­vané nej­čas­tější for­máty, které do­stá­vám, tedy HTML (ano, to je su­ve­rénně nej­čas­tější, pro­tože spousta fi­rem po­sílá své e‐maily v HTML a tex­to­vou verzi se ne­ob­tě­žují při­dá­vat), do­ku­menty Of­fice a PDF. Zby­tek se moc ne­řeší.

Aby vám toto fun­go­valo, mu­síte si se­hnat ten skript, který se o ote­ví­rání sou­borů stará. Ten si mů­žete stáh­nout od­sud, pří­padně mů­žete zvo­lit moji po­změ­ně­nou verzi zde. Pů­vodní verze je pro OSX, takže v ní bu­dete muset po­změ­nit pár věci, co se týče sa­mot­ného ote­ví­rání sou­borů. Moje verze už je při­pra­vena pro De­bi­a­nov­ské sys­témy, po­kud máte něco ji­ného, moc si ne­po­mů­žete ani v jed­nom pří­padě.

Pozn.: skript mu­síte dát ho na místo, které máte v kon­fi­gu­raci v ~/.mutt/mailcap – v mém pří­padě tedy ~/.mutt/view_attachment.sh -, a chmod­nout, aby byl spus­ti­telný:

$ chmod +x view_attachment.sh

Po­kud všechno fun­guje, jak má, mů­žete otevřít pří­lohu stisk­nu­tím enter, po­kud ne, tak vám to vy­hodí ně­ja­kou chybu – v tom pří­padě upřím­nou sou­strast a ve­selé de­bu­go­vání.

URL

Po­kud se v e‐mailu vy­sky­tuje ně­jaký od­kaz, ve vět­šině mo­der­ních ter­mi­nálů na něj mů­žete prostě klik­nout myší. Ale jestli jste do­šli až sem, tak se se mnou (a opět i s au­to­rem pů­vodní pří­ručky) ur­čitě shod­nete, že kli­kat myší v ter­mi­nálu je lame (ač to všichni čas od času dě­láme). Proto máme způ­sob, jak se tomu vy­hnout.

Na­in­sta­lujte si url­s­can.

# apt-get install urlscan

Pak vy­tvořte sou­bor ~/.urlscan a vložte do něj ná­sle­du­jící:

COMMAND open %s

Tím sdě­lu­jeme url­s­canu, jak má linky ote­ví­rat. Tady do­konce fun­guje volba pře­vzatá z OSX, která to ne­chává na sys­tému. Kdyby to ne­fun­go­valo, prav­dě­po­dobně tam bu­dete chtít mít něco jako firefox new-tab %U 2>/dev/null.

Zbývá jen v ~/.muttrc na­kon­fi­gu­ro­vat klá­ve­so­vou zkratku:

macro pager \Cu "|urlscan" "call urlscan to open links"

Nyní když stistknete ctrl-U, měl by se vám ob­je­vit se­znam URL na­le­ze­ných v e‐mailu:

Urlscan screenshot
Url­s­can

Psaní e‐mailů

Do­teď jsme e‐maily je­nom četli, tak pojďme taky ně­jaký na­psat. Nejdřív si na­sta­víme pár věcí:

# Compose View Options -------------------------------
set realname = "Moje Jméno"
set envelope_from
set sig_dashes                       # spojovniky pred podpisem
set edit_headers                     # zobrazit hlavicky pri psani zpravy
set fast_reply
set askcc                            # ptat se na CC
set fcc_attach
unset mime_forward
set forward_format = "Fwd: %s"       # format predmetu pri preposilani
set forward_decode
set attribution = "On %d, %n wrote:" # format uvadeni citace puvodni mailu pri odpovidani
set reply_to                         # respektovani Reply to pole
set reverse_name                     # magic, i guess
set include
set forward_quote

set editor = "vim"                   # pouzivat vim jako editor pri psani zprav

Vět­šinu věcí kromě iden­tity do­po­ru­čuji ne­mě­nit. set editor říká, jaký edi­tor se při kom­po­no­vání zpráv po­u­žije. Ukázky mož­ností:

set editor = "nano"       # nano
set editor = "subl -w"    # sublime text

Když nyní v Muttu stisk­neme m, bu­deme do­tá­zání na pří­jemce, před­mět a po­dobně a ote­vře se nám náš zvo­lený edi­tor, v němž bu­dou před­vy­pl­něny hla­vičky a pří­padný pod­pis, a mů­žeme psát. Po­zor, tělo zprávy jde pod hla­vičky, ne nad ně!

Když sou­bor ulo­žíte, bu­dete na­vrá­ceni zpět do Muttu, kde mů­žete buď si zprávu pro­hléd­nout (enter), dále ji edi­to­vat (e), při­dat pří­lohu (a), nebo např. ode­jít bez ode­slání (q). To nyní udě­lejte, pro­tože Mutt za­tím neví, jak zprávy ode­sí­lat.

Ode­sí­lání e‐mailů

Ač­ko­liv je Mutt sám o sobě scho­pen ode­sí­lat e‐maily, my po­u­ži­jeme msmtp; jed­nak proto, že schop­nost Muttu ode­sí­lat e‐maily se jaksi vy­myká jeho ur­čení (je to pro­gram na čtení e‐mailů a ope­race s nimi, ne na ko­mu­ni­kaci se ser­ve­rem), a tu­díž prav­dě­po­dobně ne­bude do­ko­nalá, a jed­nak vy­ža­duje hesla v ote­vřené po­době, což, na­vzdory tomu, že je tu v tomto ná­vodu tak mám, není ide­ální.

Nuže, na­in­sta­lujte si msmtp,

# apt-get install msmtp

vy­tvořte sou­bor ~/.msmtprc a pojďme edi­to­vat.

account edison23
host smtp.gmail.com
port 587
protocol smtp
auth on
from edison23@otakuland.cz
user edison23@otakuland.cz
password moje_heslo
tls on
tls_trust_file ~/.mutt/Equifax_Secure_CA.cert

account default : edison23

tls_trust_file umož­ňuje msmtp zjis­tit, jestli může vě­řit cer­ti­fi­kátu, který mu ser­ver Go­o­glu vrací. Prostě bez­peč­nostní magie. Ten klíč buďto mů­žete vzít od­sud (po­chází z pů­vod­ního ná­vodu), a nebo si jej mů­žete vy­ge­ne­ro­vat sami.

-----BEGIN CERTIFICATE-----
MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJVUzEQMA4GA1UE
ChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5
MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoT
B0VxdWlmYXgxLTArBgNVBAsTJEVxdWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCB
nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPR
fM6fBeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+AcJkVV5MW
8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kCAwEAAaOCAQkwggEFMHAG
A1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UE
CxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoG
A1UdEAQTMBGBDzIwMTgwODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvS
spXXR9gjIBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQFMAMB
Af8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GBAFjOKer89961
zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y7qj/WsjTVbJmcVfewCHrPSqnI0kB
BIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee95
70+sB3c4
-----END CERTIFICATE-----

Nyní mu­síme Muttu říci, že má po­u­ží­vat msmtp.

# Sending Email --------------------------------------
set from     = "edison23@otakuland.cz"
set sendmail = "/usr/bin/msmtp -a default"
set sendmail_wait = 0
unset record

sendmail_wait říká, že Mutt má pře­dat kon­t­rolu uži­va­teli až ve chvíli, kdy se e‐mail ode­šle – tak je mno­hem jas­nější, když ode­sí­lání selže. unset record na­sta­vuje, že se ode­slané e‐maily ne­mají uklá­dat do mail­diru – to by mělo smysl, kdy­bychom měli kla­sický e‐mail, ale v pří­padě Gmailu to smysl nemá, pro­tože ten je ukládá u sebe, a tu­díž je při další syn­chro­ni­saci do­sta­neme.

Teď zkuste na­psat zprávu a ode­slat ji (y). Po­kud se vše zdaří, uvi­díte ve spod­ním sta­vo­vém řádku „Sen­ding message“, vyskytne‐li se pro­blém, msmtp vám to s chutí sdělí.

Od­klá­dání e‐mailu

Již dříve jsme v kon­fi­gu­raci mj. na­sta­vili, že od­lo­žit zprávu (ulo­žit ji do Drafts) mů­žeme klá­ve­sou p. Touto klá­ve­sou ji také vy­vo­láme zpět k edi­taci. Mutt se na­víc při vy­tvá­ření nové zprávy (m) v pří­padě, že jsou v Drafs ně­jaké drafty, ze­ptá, zda ná­ho­dou ne­chceme no­vou zprávu tvo­řit z draftu. Když mu to od­sou­hla­síte, do­sta­nete se na dříve ulo­že­nou zprávu. Po­kud vy­tvo­říte draftů víc, bu­dete pak vy­zvání k vý­běru ze se­znamu.

Kon­takty

Na vy­hle­dá­vání kon­taktů a uklá­dání no­vých bu­deme vy­u­ží­vat malý pro­gram v Py­thonu zvaný Go­o­book. Ten ne­na­jdete v re­po­si­tá­řích, ale lze jej jed­no­duše na­in­sta­lo­vat přes ma­na­žer py­tho­nov­ských ba­líčků Pip. Nej­prve si tedy na­in­sta­lujte Pip:

# apt-get install python-pip

Poté mů­žete jed­no­duše za­dat ná­sle­du­jící pří­kaz a tím go­o­book na­in­sta­lu­jete:

# pip install goobook

Do sou­boru ~/.goobookrc uložte své při­hla­šo­vací údaje:

[DEFAULT]
email: you@gmail.com
password: yourgooglepassword

Chcete‐li kom­plex­nější kon­fi­gu­raci (např. bez pla­in­tex­to­vých he­sel), na­hléd­něte do ~/goobook/README.txt.

Abychom mohli Go­o­book po­u­ží­vat v Muttu, mu­síme na­bin­do­vat ně­ko­lik klá­ves v ~/.muttrc:

set query_command="goobook query '%s'"
macro index,pager a "goobook add" "add sender to google contacts"
bind editor  complete-query
  • set query_command: způ­sob, ja­kým se má Go­o­gbok spouš­tět (mů­žete si to zku­sit v ter­mi­nálu, např. goobook query "nejake jmeno"
  • ma­cro index,pager a: bin­duje a v in­dexu i v pageru na ulo­žení ad­resy ode­si­la­tele při­ja­tého e‐mailu do kon­taktů. Po­zor, po­kud už kon­takt jed­nou v kon­tak­tech máte, vy­tvo­říte du­pli­kát, žádná kon­t­rola ne­pro­bíhá.
  • bind edi­tor <Tab>: kom­ple­tace ad­res při stisku ta­bu­lá­toru

Nyní, když při vy­tvá­ření nové zprávy v poli pro ad­re­sáta (nebo CC) na­pí­šete prv­ních pár pís­men jména/adresy ně­kte­rého ze svých kon­taktů a stisk­nete ta­bu­lá­tor, bude vám buďto do­pl­něna e‐mailová ad­resa (bude‐li na­le­zen jen je­den kon­takt), nebo do­sta­nete na vý­běr ze se­znamu. Dobrý, co?

Po­kud Go­o­book nic ne­na­lezne, ne­u­dělá nic, takže ne­po­znáte, jestli vám umřelo při­po­jení k in­ter­netu, nebo jste blbě za­dali jméno ad­re­sáta.

Hle­dání

Po­pí­šeme si tři způ­soby pro­hle­dá­vání e‐mailů v Muttu. Dva zá­kladní, je­den po­kro­čilý, slo­ži­tější na na­sta­vení, ale zato skvělý a rychlý.

Oby­čejné hle­dání

Když stisk­nete klá­vesu /, bu­dete vy­zvání k za­dání ře­tězce, podle kte­rého se bude hle­dat. Tento ře­tě­zec může být i re­gex. Toto hle­dání bere v po­taz pouze pole ode­si­late, pří­jemce a před­mět. Ni­ko­liv tělo zprávy.

Ve­dle re­gexů lze po­u­ží­vat i mut­tov­ské vý­razy, které dá­vají hle­dání vel­kou sílu: ~f arthur ~C honza ~s api = na­jdi zprávy od arthur, které byly CCo­vané pro honza a měly před­mět api.

Klá­ve­sou n mů­žete pře­jít na další zprávu, která od­po­vídá do­tazu. Pře­chod na před­chozí není de­faultně de­fi­no­ván, já jsem si to na­bin­do­val na čárku:

bind index , search-opposite
bind pager , search-opposite

Li­mi­to­vání

Dru­hým způ­so­bem, který Mutt na­bízí v ob­lasti oby­čej­ného hle­dání (ne­bere v po­taz tělo zprávy), je li­mi­tace. Je­diný roz­díl oproti oby­čej­nému hle­dání přes / je ten, že Mutt skryje zprávy, které ne­od­po­ví­dají za­da­nému do­tazu.

Li­mi­to­vání vy­vo­láte klá­ve­sou l.

Full­tex­tové vy­hle­dá­vání

Full­tex­tově své e‐maily mů­žete pro­hle­dá­vat dvěma způ­soby. Je­den je jed­no­du­chý a velmi po­malý (když máte hodně e‐mailů), druhý je slo­ži­tější a velmi rychlý. Po­kud máte méně než 500 e‐mailů a ne­plá­nu­jete jich mít více, ne­ob­tě­žujte se s touto sekcí a po­u­ží­vejte oby­čejné hledání/limitování s flagem ~B, tedy lomítko/l a:

~B nejaky text, co je v tele e-mailu

Po­kud jich máte víc, po­ři­dťe si Not­much.

# apt-get install notmuch

Po in­sta­laci spustťe notmuch new a sdělte not­mu­chi pár údajů, na které se ze­ptá. Když se ze­ptá na složku, kde máte ar­chiv zpráv, chce vě­dět nej­vyšší složku va­šeho účtu, v mé kon­fi­gu­raci tedy ~/.mail/edison23.

Po­tom spustťe notmuch new, aby si not­much mohl vy­tvo­řit in­dex. To může chvíli za­brat.

Aby se vám zprávy re­in­de­xo­valy po každé změně mail­diru, při­dejte do ~/.offlineimaprc do sekce Ac­count (v mém pří­padě [Account edison23]) ná­sle­du­jící (po­kud to tam už ne­máte, uvá­děl jsem to již výše):

$ postsynchook = notmuch new

Nyní si mů­žete vy­zkou­šet pro­hle­dá­vání e‐mailů z ter­mi­nálu:

$ notmuch search hledaný výraz

Abyste mohli vy­hle­dá­vát Muttu, bu­dete po­tře­bo­vat malý py­tho­nov­ský skript, který in­te­graci za­jistí. Ten si stáh­něte od­sud a dejte si ho do PATH ně­kam (a učiňte jej spus­ti­tel­ným), udě­lejte ná­sle­du­jící a zkon­t­ro­lujte, že vý­stup od­po­vídá:

$ mutt-notmuch-py -G ~/.mail/temporary/search
Query: foo

$ ls ~/.mail/temporary/search
cur new

Do­časné složky curnew ob­sa­huje vý­sledky hle­dání se stej­nou struk­tu­rou, jako nor­mální složky v mail­diru, takže se s nimi dá i stejně v Muttu pra­co­vat. Je­jich ob­sah je při kaž­dém spuš­tění hle­da­cího skriptu sma­zán.

Nyní už zbývá jen do­ře­šit klá­ve­sové zkratky a po­dobné ne­smysly. Do ~/.muttrc tedy při­dejte ná­sle­du­jící:

macro index S "unset wait_keymutt-notmuch-py ~/.mail/temporary/search+temporary/search" "search mail (using notmuch)"

Ta­hle ší­le­nost říká Muttu ná­sle­du­jící:

  • na­bin­duj klá­vesu S
  • ne­če­kej na stisk klá­vesy po do­kon­čení hle­dání
  • spusť mutt-notmuch-py a pře­dej mu kon­t­rolu
  • pře­jdi do ad­re­sáře +temporary/search v módu pouze pro čtení (vý­sledky hle­dání je bl­bost edi­to­vat)
  • a ob­vyklý ko­men­tář, co to dělá…

A ještě si pro své po­hodlí při­dejte v ~/.muttrc do se­znamu slo­žek v si­de­baru vý­sledky hle­dání:

# Mailboxes to show in the sidebar.
mailboxes +edison23/INBOX \
        +edison23/drafts \
        ...
        +temporary/search \

Tím máme vy­ře­šené hle­dání, což z těch ži­votně dů­le­ži­tých věci bylo po­slední. To, co ná­sle­duje, už je čistě otázka vkusu.

Barvy

Je­li­kož v Muttu jde na­de­fi­no­vat skoro všechno (ano, už jsem při­šel na věc, která nej­spíš nejde), lze v něm i na­prosto li­bo­volně na­sta­vit ba­revné téma.

Já vám zde před­lo­žím dvě sta­žená z In­ter­netu a k nim je­jich dvě verze, které jsem si upra­vil, abych s nimi byl spo­ko­jen.

8barevné téma

Re­la­tivně jed­no­du­ché téma, ke kte­rému ne­po­tře­bu­jete twea­ko­vat svůj ter­mi­nál, aby pod­po­ro­val více než 8 ba­rev, lze na­jít zde. Moje mo­di­fi­kace je k dis­po­sici zde.

256barevné téma

Re­la­tivně slo­ži­tější, ale také s vět­šími mož­nostmi, je téma z řady so­la­ri­zed. Jeho pů­vodní verzi (resp. ně­ko­lik verzí) mů­žete na­jít zde. Moje mo­di­fi­kace tma­vého té­matu, která by se tvůrci nej­spíš to­lik ne­lí­bila, ale mne při­jde po­u­ži­tel­nější, na­jdete zde.

Po­kud váš ter­mi­nál ne­pod­po­ruje 256 ba­rev, do­po­ru­čuji svůj dří­vější člá­nek.

Zá­věr

Do­šli jste až sem? Gra­tu­luji, máte sluš­nou šanci si Mutt za­mi­lo­vat pro jeho na­sta­vi­tel­nost, kom­plex­nost a přesto im­po­nu­jící ele­ganci. Po­stupně bu­dete při­chá­zet na další věci, jak si ho na­sta­vit, co kde vy­lep­šit a bude možná do­cela tr­vat, než na­ra­zíte na li­mity, které ne­do­ká­žete vy­ře­šit. Po­řád si s ním bu­dete hrát, než to bude do­ko­nalý, váš je­diný mi­lo­vaný Mutt.

Budu rád, když se o své zku­še­nosti, po­znatky, vy­lep­šení, etc. po­dě­líte v ko­men­tá­řích. Stejně tak budu vděčný za hlá­šení chyb.

To­hle je můj Mutt. Je mnoho ta­ko­vých Muttů, ale te­nhle je můj. Bez svého Muttu nejsem nic. Beze mě není můj Mutt nic.

Napsat komentář

Vaše emailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *