22 сент. 2014 г.

bash + pop3s connection

Когда-то давно потребовалось мне автоматизировать сбор почты из ящика на mail.ru через pop3. Решение получилось примерно таким:
function getmail_mailru {
expect -c '
        log_file -noappend /tmp/mail.log
        spawn /bin/nc pop.mail.ru 110
        set timeout 3
        expect "+OK"  {send "USER username\r" ; send_user "user sent\n"}
        expect "+OK"  {send "PASS password\r" ; send_user "pass sent\n"}
        expect "+OK Welcome!"   {send "RETR 1\r"}
        expect -regexp {^.}   {send "DELE 1\r"}
        expect "+OK message 1 deleted"   {send "QUIT\r"}
        expect "*maildrop empty" {send "QUIT\r" ; send_user "empty mailbox\n"}
        '
}
Однако сегодня команда mail.ru прислала сообщение, что
После 22 сентября на POP3 и SMTP-серверах останется только безопасная
авторизация через протокол SSL
Возможно, они и раньше предупреждали, но до моего сведения сия идея дошла только сегодня, когда уже полдня почта не забиралась.
Решение: заменить строчку
spawn /bin/nc pop.mail.ru 110
на
spawn /usr/bin/openssl s_client -connect pop3.mail.ru:995
Таким образом, соединение с сервером снова будет установлено.
Однако тестирование выявило еще одну проблему: при посылке команды RETR 1 соединение с почтовым сервером подвисало с сообщением RENEGOTIATING.
Выяснилось, что такое поведение вызвано тем, что заглавная R воспринимается утилитой s_client как команда переподключения к серверу.
CONNECTED COMMANDS
       If a connection is established with an SSL server then any data received from the server is displayed and any key presses will be sent to the server. When used interactively (which means neither -quiet nor -ign_eof have been given), the session will be renegotiated if the line begins with an R, and if the line begins with a Q or if end of file is reached, the connection will be closed down.
Решение: не использовать верхний регистр, так как для общения с почтовым сервером он не обязателен.
function getmail_mailru {
expect -c '
        log_file -noappend /tmp/mail.log
        spawn /usr/bin/openssl s_client -connect pop3.mail.ru:995
        set timeout 3
        expect "+OK"   {send "user username\r" ; send_user "user sent\n"}
        expect "+OK"    {send "pass password\r" ; send_user "pass sent\n"}
        expect "+OK Welcome!"  {send "retr 1\r"}
        expect -regexp {^.}  {send "dele 1\r"}
        expect "+OK message 1 deleted"  {send "quit\r"}
        expect "*maildrop empty"   {send "quit\r" ; send_user "empty mailbox\n"}
        '
}

Комментариев нет:

Отправить комментарий