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:


Kellemes fetchmailezést!


Vissza a leírásokhoz