Stahování e-mailů: offlineimap

Mutt v současné verzi již umí používat protokoly POP3 a IMAP sám. Přesto je však doporučeno svěřit stahování pošty externímu programu. V případě IMAPu navíc tímto získáme výhodu, že budeme mít o lokální kopii dat. To je dobré zejména u notebooku, kdy si potřebujete v terénu přečíst mail, který dávno v INBOXu už máte, ale nechcete se (nebo případně nemůžete) se připojovat.

Pro stahování mailů použiju program Offline IMAP. Umí synchronizovat mezi IMAP účtama a případně lokálním maildirem (který mutt umí číst) a je poměrně jednoduchý (a také typicky ve většině distribucí bývá v repozitáři). Pokud někdo trvá na použití protokolu POP3 (nebo se mu třeba offlineimap nelíbí), může zkusit třeba fetchmail.

Offlineimap po spuštění hledá svůj konfigurační soubor v ~/.offlineimaprc. Případně mu můžete parametrem -c vnutit jiný. Konfigurační soubor má podobu INI souboru. Můj vypadá takto:

  1. [general]
  2. metadata = ~/.offlineimap
  3. accounts = mujmail
  4. maxsyncaccounts = 1
  5. ui = Noninteractive.Basic, Noninteractive.Quiet, TTY.TTYUI
  6. ignore-readonly = yes
  7. socktimeout = 60
  8. fsync = true
  9.  
  10. [Account mujmail]
  11. localrepository = mutt
  12. remoterepository = mailucet
  13. autorefresh = 3
  14. quick = 3
  15.  
  16. [Repository mutt]
  17. type = Maildir
  18. localfolders = ~/.maildir
  19. sep = .
  20. restoreatime = yes
  21.  
  22. [Repository mailucet]
  23. type = IMAP
  24. remotehost = mail.server.com
  25. ssl = yes
  26. remoteuser = username
  27. remotepass = heslo
  28. maxconnections = 3
  29. holdconnectionopen = yes
  30. subscribedonly = no

Konfigurace je docela skromná. Teď co tedy znamenají jednotlivé položky:

  • Sekce general:
    • metadata - do jaké složky si offlineimap bude ukládat nějaká metadata o tom, co kam nasyncoval
    • accounts - seznam účtů, které budeme synchronizovat (účty budeme definovat dále)
    • socktimeout - timeout, po kterém se přeruší spojení, když za tu dobu nepřijdou žádná data.
  • Sekce Account mujmail (mujmail je název účtu, který je v sekci definován):
    • localrepository - jeden zdroj mailů, které budeme synchronizovat (ten druhý je remoterepository) - zde uvedeme pouze jméno zdroje - samotnou definici uvedeme dále
    • autorefresh - doba, po které se provede další synchronizace (v minutách). Pokud se nastaví na 0, offlineimap po synchronizaci skončí.
    • quick - určuje počet rychlých synchronizací - rychlá synchronizace typicky proběhne o něco rychleji, naoplátku ale neupdatuje flagy u mailů. Uvedená konfigurace udělá na začátku plný update, pak další 3 budou rychlé, pak zase úplný atd. Pokud uvedete 0, bude se vždy dělat úplná synchronizace, pokud -1, bude naopak vždy rychlá.
  • Definice lokálního repozitáře - maildiru pro mutt (Repository mutt):
    • type - řekneme, že to chceme jako maildir
    • localfolders - složka, kam se náš maildir bude ukládat
    • sep - znak pro oddělování složek v maildiru (například složka "slozka" umístěná pod sloužkou INBOX s tímto oddělovačem se bude jmenovat INBOX.slozka)
    • restoreatime - pokud je nastaveno na yes, tak se při stažení mailu ze vzdáleného repozitáře obnoví čas poslední změny (tj na ten původní)
  • Vzdálený repozitář - IMAP server (Repository mailucet):
    • type - tentokrát řekneme, že vzdálená strana je IMAP server
    • remotehost - adresa IMAP serveru
    • ssl - pokud je yes, bude se používat SSL spojení
    • remoteuser - uživatelské jméno k IMAP serveru
    • remotepass - heslo k IMAP serveru
    • maxconnections - maximální počet spojení, které budeme při synchronizaci používat (čim víc, tim to možná bude rychlejší, ale taky to víc zatíží server)
    • holdconnectionopen - pokud je yes, tak si ponechá spojení otevřené do dalšího syncu
    • subscribedonly - při nastavení na yes stahuje a syncuje pouze přihlášené složky

Tak, nyní máme vše nastaveno a po spuštění offlineimap by se vám měl obsah IMAP serveru stáhnout do lokálního maildiru (a další změny by se měly navzájem synchronizovat). Offlineimap má takovou jednu, pro někoho možná nepříjemnou, vlastnost - když přijde o svá spojení, spadne. Na stolním PC se stabilním připojením je to zřejmě fuk, horší situace nastává na notebooku, který pak typicky někam přenesete, uspíte a po probuzení chudák offlineimap přijde o otevřené spojení (pokud je holdconnectionopen na yes, ale myslím, že se mu to nelíbí i bez nich) a umře. To se dá snadno napravit jeho neustálým spouštěním ve scriptu. Dá se toho ale také dobře využít.

Pokud někdo používá notebook jako já - tj. doma jako workstation a pak semtam někde v terénu s případným mizerným internetovým spojením, může narazit na jeden problém. Synchronizovat e-maily (ještě nejlépe full updaty) každé 3 minuty přes pomalé GPRS spojení není opravdu ono. Zároveň pokud notebook leží doma a má dobré připojení, není důvod, proč ty maily každé 3 minuty nesyncnout.

Samotný konfigurační problém se dá vyřešit jednoduše. Stačí vytvořit kopii .offlineimaprc, pojmenujeme ji třeba .offlineimaprc-mobile a patřičné parametry v ní upravit. Při připojení přes mobil pak offlineimap spustíme s parametrem -c ~/.offlineimaprc-mobile. Co se týče konfigurace pro mobilní připojení, tak osobně jsem zvednul timeout na 120s, refresh jsem dal po 15 minutých a pouze rychlé updaty, povolil jsem pouze 1 spojení a nechal jsem stahovat pouze přihlášené složky.

Teď už stačí pouze automaticky nahazovat offlineimap pro správné prostředí. Otázka jak poznat, zda sedím doma nebo někde úplně jinde. Osobně jsem využil předpokladu, že doma mám notebook připojený přes ethernetový kabel a typicky v místech, kde chci připojení opravdu šetřit, ta kabelová síťovka nebude mít link. Takže skript běží ve smyčce a při každém průběhu zkontroluje, zda má síťovka link. Pokud ano, pustí offlineimap, jinak offlineimap -c ~/.offlineimaprc-mobile. Následně (což se stane typicky po pádu offlineimap) 30 sekund počká a jede na novo. Výsledný skript vypadá takto:

  1. #!/bin/bash
  2. while true; do
  3.       if ip l | grep eth2 | grep -q "state UP"; then
  4.          echo "Normal IMAP sync"
  5.          offlineimap
  6.       else
  7.          echo "Mobile IMAP sync"
  8.          offlineimap -c ~/.offlineimaprc-mobile
  9.       fi
  10.       sleep 30
  11. done

Pokud někomu pouze detekce linku nestačí, lze si se skriptem více pohrát... třeba zkoumat i přiřazenou IP adresu na interfacu :-)