Sziasztok
Ütemezett feladatként kellene IMAP szerverről csatolmányt mentenem.
Munpackot találtam neten, de úgy látom az feltételezi, hogy szerver oldalról érem el a leveleket és feldoglozza a maildir fájlokat.
Nekem távoli IMAP szerverre kellene felcsatlakoznom és ott adott levelek csatolmányát leválasztani, majd olvasottnak jelölni vagy áthelyezni egy másik mappába jelezve, hogy feldolgozva. A lényeg, hogy a csatolmány (pdf) különálló fájlként egy másik bash script rendelkezésére álljon.
Van erre bevált megoldásotok parancssor szinten?
- 246 megtekintés
Hozzászólások
Lehet, hogy van rá kész eszköz, de fetchmail lehozza a levelet, abból awk-val szerintem ki tudod szedni a mellékletet, amelyet base64 -d-vel binárissá tudsz alakítani.
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
awkval levelet parseolni, hát, bátor. :)
- A hozzászóláshoz be kell jelentkezni
Nem muszáj regexpet használni, karakterenként is fel lehet dolgozni, mintha C-ben írnánk. :)
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
Az mindegy. A levelezés annyira tele van edge casekkel, hogy nem akarsz nekiállni random eszkábálni, ha fontos. Vagy tényleg körbe kell tákolni valamelyik parancssorossat, vagy valami p betűs nyelv, ahol valaki már körbeszopta az összes ilyet egy libben.
- A hozzászóláshoz be kell jelentkezni
OFF:
Egyszer már kérdeztem, csak sok egyéb miatt választ nem kaptam: ha egyébként a C-hez sem értek, miért előny nekem az awk C-szerűsége? :)
- A hozzászóláshoz be kell jelentkezni
Zavarba hozol a kérdéseddel. Mondjuk úgy, az awk a C-nek a triviális szintaxisát tudja, ami nagyon könnyen elsajátítható. Épp a struktúrákat, pointereket nem ismeri az awk, ami a C-nek viszont az erőssége, és kellőképpen meg lehet vele zavarni egy kezdőt. Itt olyanokra gondolok, hogy awk-ban az i = i + 1; helyett írhatod, hogy i += 1;, vagy azt is, hogy i++;.
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
Köszi, csak azért kérdeztem, mert többször írtad már, hogy a C-szerűsége miatt szereted, ami nekem nem tűnt előnynek abban az esetben, ha valaki egyébként nem jártas a C-ben, mert úgy nem ad semmi pluszt (a C-szerűség.) Tényleg csak kíváncsi voltam. :)
- A hozzászóláshoz be kell jelentkezni
awk -v FS='\n' -v RS='\n+' { ... }
És máris lehet az első rekordban mezőnként feldolgozni a header-t, szépen beletenni egy asszociatív tömbbe (*) mi kell még?
(*) gy.k.: az ugyanaz, mint a hash vagy a dict, csak awkul.
- A hozzászóláshoz be kell jelentkezni
Hát, a multipart boundary tudhat meglepetéseket okozni, a \n kissé naív, pl szövegtörzsben simán lesz '\n+', a headerek tartalmában az encoding miatt lehetnek vicces dolgok, a key-value store (hívhatjuk tudományosan asszociatív tömbnek :) ) nem jó a headerek tárolására, mert azok ismétlődhetnek, cserébe számít a sorrendjük. Azt, hogy valami csatolmány-e, még a benne levő content disposition alapján ki kell találni és tovább kell boncolni, stb stb.
Biztos vagyok benne, hogy lehet olyat csinálni awkban, ami nagyrészt működni fog :)
- A hozzászóláshoz be kell jelentkezni
csodálkoznék, ha a mailutilsban ne lenne valami...
- A hozzászóláshoz be kell jelentkezni
Minimális Python programozás esetleg?
https://medium.com/@sdoshi579/to-read-emails-and-download-attachments-i…
- A hozzászóláshoz be kell jelentkezni
Nekem ez a PHP kód működik cronból hasonló feladathoz:
- A hozzászóláshoz be kell jelentkezni
metamail-nek hívják azt a csomagot, amiben pont ez a funkció implementálva van ( pl. https://kb.iu.edu/d/aibt )
- A hozzászóláshoz be kell jelentkezni
Esetleg ripmime.
(Csak mert most nézem, hogy a fedorámban se mailutils se metamail nincs)
- A hozzászóláshoz be kell jelentkezni
Az imap részével nem foglalkoztam, de az attachments kiszedésére a ruby mail gem-jét használom.
Az alábbi kódrészlet segíthet. A mailtext változóba kell berakni a teljes levelet, a dirname pedig a könyvtár, amibe a csatolmányokat rakja:
require 'mail'
mail=Mail.read_from_string(mailtext)
mail.attachments.each do |a|
filename=a.filename.gsub(' ','_')
File.open(dirname+filename,"w+b",0644) do |f|
f.write(attach.body.decoded)
end
end
- A hozzászóláshoz be kell jelentkezni