scriptből e-mail csatolmány mentése

Fórumok

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?

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

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

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.

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 :)

csodálkoznék, ha a mailutilsban ne lenne valami...

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