Fetchmail futtatása dinamikus időközzel qpopper segítségével
Adott a következő feladat:
Van egy LAN, ahol egy mailserver (a neve mondjuk mailserver) szolgálja ki a klienseket. Mailserverre
letöltődnek a kliensek levelei egy külső mailserverről (mailserver-külső) fetchmaillel, majd a fetchmail átadja
a leveleket mondjuk egy postfix levelezőszervernek. A kliensek pedig már mailservertől töltik le el a leveleiket
mondjuk az egyszerűség kedvéért POP3-t használva pl. qpopperral.
A fetchmailnek meg lehet adni egy intervallumot, amennyi időközönként le kell szednie a leveleket, de ez
statikus... azaz a fetchmail amíg fut folyamatosan ennek a megadott intervallumnak megfelelő időközönként
fogja leszedni a leveleket. Van, akinek egész nap fut a gépén a fetchmail, viszont nem biztos, hogy a nap 24 órájában
ugyanolyan intervallummal kell dolgoztatni. Ha pl. az ember a gép előtt ül, szereti a leveleket minél hamarabb megkapni,
ha viszont távol van, elegendő 10-15 percenként vagy még ritkábban letöltögetni azokat a fő levelezőszerverről. Én ezt úgy
oldottam meg korábban, hogy van kettő .fetchmailrcm (.fetchmailrc180 és
.fetchmailrc600), és egy script segítségével cserélgetem őket, ami semmi mást nem csinál,
mint valamelyik .fetchmailrcxxxet átmásolja .fetchmailrcnek,
majd fetchmail --quit
, aztán fetchmail újraindítása. Ha a gép előtt ülök, akkor
3 percenként (180 mp) szedi le a leveleimet, ha nem, akkor 10 percenként (600 mp).
Nekem ez frankón működik (azzal a kitétellel, hogy 3 percnél sűrűbben nem kapok levelet hiába nyomogatom a "get messages" gombot), de ez a fenti LAN-ban nem megvalósítható, mivel a klienseken Windows fut. Egy megoldás lett volna az, ha crontab cserélgette volna a 2 vagy több .fetchmailrct előre meghatározott menetrend szerint, azonban ez nagy kötöttséget jelentett volna. A felhasználók a windowsos kliensekről nem tudták volna a crontabot konfigurálni.
Kis ötletelés után a következő megoldás született:
A qopoppert úgy kell konfigurálni, hogy a .felhasznalonev.pop nevű ún.
temp-drop file-t NE
törölje le a POP3-lekérdezés befejezése után, hanem hagyja meg. Ezáltal a fenti file
timestampje jelzi, hogy a felhasználó mikor töltötte le a leveleit utoljára. Ezek után semmi más dolgunk nincs, mint
crontabból percenként ellenőrizni a prominens file timestampjét. Ha az imént töltötte (vagy szerette volna letölteni)
a felhasználó a leveleit a szerverről (mondjuk nyomott egy "get message"-et a levelezőjében), aktivizáljuk a fetchmailt,
amely természetesen daemon módban fut folyamatosan, de nagy periódusidejű beállításban (nálam ez fél óra). Küldünk neki
egy -SIGUSR1
-et, mire az felébred és a periódusidővel nem törődve megnézi, illetve letölti a leveleket.
Lesz egy kis csúszás a dologban, hiszen adott POP3-lekérés által aktivizált fetchmail által a mailserver-külsőről leszedett leveleket valójában csak a következő POP3-kéréskor fogja letölteni a levelezőkliens a mailserver gépről. Ez azt jelenti, hogy ha pl. a levelező 3 percenként tölti le a leveleket automatikusan a mailserver szerverről, akkor legrosszabb esetben csak kb. a második 3. perc múlva fog csak megérkezni az a levél a felhasználó levelezőjébe, amit a legutolsó POP3-kérés óta kapott a mailserver-külső szerverre. Tehát az első POP3-kérés aktivizálja a fetchmailt, és csak a második kérés fogja letölti a mailserverről a pár perccel korábban már a fetchmail által a mailserver-külső szerverről áttöltött levelet. Ugyanakkor ez valójában nem 2x3, hanem csak maximum 5 perc, mivel a fetchmail 1 perccel később indul, mint a POP3-kérés (1 percenként fut az a cron job, ami a temp-drop file-t ellenőrzi). Kis számolással és végiggondolással ki lehet okoskodni hogy jön ki ebből a max. 5 perc. De olyan is elképzelhető, hogy már a következő POP3-kéréskor lejönnek a friss levelek, ha azok az előző kérés utáni egy percben érkeztek a mailserver-külsőre. Természetesen "kézzel" is rá lehet segíteni a rendszerre, ha az ember manuálisan kéri le a leveleket. Ilyenkor maxmimum 1 percet késnek a lekérdezések.
A lényeg, hogy nem kell crontabból cserélgetni a .fetchmailrcket, mert a fetchmail akár percenkét is leszedheti a leveleket, ha a levelező kliensben 1 percre van állítva az automatikus lekérdezés periódusideje, illetve a periódusidőtől függetlenül a "get messages" gomb használatával teljesen rugalmasan tud alkalmazkodni a fetchmail a levelek letöltéséhez. Természetesen azt szem előtt kell tartani, hogy egy lekérdezéssel el lesz mindig "csúszva" a fetchmail a megoldásból fakadóan. Ez a megvalósítás hiánya... viszont azt hiszem a dinamizmus akkora előny, hogy ennyi kis csúszást el lehet viselni.
A szükséges beállítások:
- qpopper vagy bármilyen másik alkalmazás konfigolása a temp-drop file meghagyására ("set keep-temp-drop = true")
- fetchmail futtatása nagyobb (pl. 30 perces) lekérdezési időközzel
- crontabból a pop3-check.sh futtatása percenként (ez 'noszogatja' a fetchmailt)
Kellemes fetchmailezést!