Извлеченные результаты в 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