Извлечени резултати в imap2 за показване в конзолата

Направих скрипт, който се свързва с imap сървър и след това изпраща различни съобщения, за да получа първата поща [имам нужда само от първата]. Когато стартирам скрипта, не получавам резултати, но когато напиша същата последна команда в терминала, получавам резултат.

Някаква идея как да поправя това?

МОЯТ скрипт:

#!/usr/bin/expect
#!/bin/bash
set password 'ent'
spawn telnet host imap2
send "1 login picard enterprise\r"
send "2 list '' '*'\r"
expect "*"

send "3  EXAMINE INBOX\r"
send "4 fetch 1 all\r"

send "5 fetch 1 body[]\r"

Както казах преди, когато напиша 5 fetch 1 body[] в терминала, получавам някакъв резултат, но скриптът не показва нищо. Някакви идеи?


person tudoricc    schedule 14.01.2015    source източник
comment
Винаги съм използвал по-дълги тагове в IMAP (A001 login ... вместо 1 login ...), за да позволя на скрипта да чака завършване на командата. Бихте ли опитали send "A005 FETCH 1 BODY[]\r\n" expect "A005"   -  person Serge Ballesta    schedule 14.01.2015
comment
Можете да наречете това измама, но ако наистина искате IMAP достъп в except, можете да използвате пакета imap4 за Tcl (expect скриптовете са само Tcl код): docs.activestate.com/activetcl/8.4/tcllib/imap4/. Ще трябва да инсталирате Tcllib, ако вече не сте го инсталирали, но като бонус бихте могли да получите и по-добра сигурност, като използвате TLS (вижте горната част на страницата, към която съм свързал).   -  person nwk    schedule 14.01.2015


Отговори (1)


Вашият скрипт има няколко синтактични грешки и не мисля, че изобщо сте правили опит да проучите IMAP синтаксиса.

send "1 login picard enterprise\r"

Това е правилно, при условие че потребителското име и паролата не съдържат интервали или други странни знаци и че Expect действително изпраща \r\n, когато въведете \r там.

send "2 list '' '*'\r"

'' не е IMAP, IMAP използва "".

send "3  EXAMINE INBOX\r"

Имате един интервал твърде много след 3. Интервалите не са идемпотентни в IMAP; ако протоколът казва да използвате едно пространство, трябва да използвате точно едно, нито повече, нито по-малко.

send "4 fetch 1 all\r"
send "5 fetch 1 body[]\r"

ALL и BODY[] се припокриват, защо изпращате и двете? Можете просто да изпратите 4 FETCH 1 (FLAGS INTERNALDATE BODY[]) и да получите същите данни без повторение.

person arnt    schedule 14.01.2015