Ошибка Python imaplib ssl с использованием очереди celeryd

У меня проблема с использованием imaplib на python 2.6 с последней версией django svn. Я хочу загружать электронные письма imap в очередь (используя celeryd). Я могу подключать/загружать электронные письма из командной строки, но когда я разгружаю задачу через django на celeryd, я получаю эту ошибку: «SSLError: [Errno 1] _ssl.c:1325: ошибка: 1408F10B: подпрограммы SSL: SSL3_GET_RECORD : неправильный номер версии".

В документах Imaplib не упоминается, как указать версию SSL. Я пытаюсь вытащить электронные письма из gmail. Я не понимаю, почему выгрузка задачи в очередь с помощью celeryd может привести к сбою задачи. Любая помощь приветствуется.

Изменить: вот трассировка стека:

Файл "/usr/lib/python2.6/imaplib.py", строка 643, тип select, dat = self._simple_command(имя, почтовый ящик)

Файл "/usr/lib/python2.6/imaplib.py", строка 1059, в _simple_command return self._command_complete(name, self._command(name, *args))

Файл "/usr/lib/python2.6/imaplib.py", строка 889, тип _command_complete, данные = self._get_tagged_response(tag)

Файл "/usr/lib/python2.6/imaplib.py", строка 990, в _get_tagged_response self._get_response()

Файл "/usr/lib/python2.6/imaplib.py", строка 907, в _get_response resp = self._get_line()

Файл "/usr/lib/python2.6/imaplib.py", строка 1000, в строке _get_line = self.readline()

Файл "/usr/lib/python2.6/imaplib.py", строка 1170, в строке чтения char = self.sslobj.read(1)

Файл "/usr/lib/python2.6/ssl.py", строка 136, при чтении возвращает self._sslobj.read(len)

SSLError: [Errno 1] _ssl.c:1325: ошибка:1408F10B:процедуры SSL:SSL3_GET_RECORD:неверный номер версии

Изменить: вот задача, которую я пытаюсь запустить, где imap_parser — это модуль, который обертывает imaplib и загружает электронные письма в мою базу данных.

class DumpIMAPData(Task):
    def run(self, user, username, password, imap_address, **kwargs):
        logger = self.get_logger(**kwargs)
        celery.log.redirect_stdouts_to_logger(logger, loglevel=None)
        #imap_address is e.g. 'imap.gmail.com'                                  
        parser = imap_parser.IMAPFetcher(imap_address, username, password, user\
)
        parser.load_all_emails()
    return True

Я заметил, что задача на самом деле будет выполняться с использованием сельдерея, ЕСЛИ Я не демонизирую задачу с помощью флага --detach. Я не знаю, почему задача не удалась только при запуске в качестве демона. Я попытался установить один и тот же идентификатор пользователя и идентификатор группы с флагами -u и -g, один и тот же umask и убедиться, что путь и рабочие каталоги одинаковы как для демона, так и для недемонизированной версии, но задача все равно не запустится. в сельдерее, когда сельдерей работает как демон.

Я использую последнюю версию сельдерея (0.9.4).


person Evan    schedule 06.01.2010    source источник


Ответы (3)


Если он ломается только при запуске внутри celery worker, может быть что-то с amqplib (который использует модуль ssl) или что-то с многопроцессорностью и разветвлением (глобальная переменная, которая была инициализирована до разветвления, которая больше не существует)

Не могли бы вы включить задачу, которую вы пытаетесь запустить? Вы подключаетесь к серверу внутри самой задачи или это какой-то общий объект?

person asksol    schedule 08.01.2010
comment
Кроме того, возможно, imaplib не является потоко-/форк-безопасным, и есть кеш соединений или что-то подобное, тогда вам, вероятно, придется найти это и очистить его при запуске задачи. - person asksol; 08.01.2010
comment
эй, asksol, спасибо за ваш ответ. Я добавил дополнительную информацию к вопросу выше, включая задачу, которую я выполняю. Кроме того, я заметил, что задача будет выполняться в сельдерее, если только сельдерей не запускается как демон с флагом --detach. есть идеи? - person Evan; 09.01.2010

По словам создателя сельдерея:

С 01a8a0e сельдерей больше не отделяется самостоятельно. С ним было слишком много проблем, и, поскольку он работает при отсоединении с помощью start-stop-daemon, supervisord, launchd и т. д., вместо этого рекомендуется использовать эти инструменты.

person Evan    schedule 23.01.2010

Вы подключаетесь к порту, который не поддерживает TLS. Вы пытаетесь связаться с почтовым сервером с поддержкой TLS/SSL или сельдерей пытается использовать TLS для своего AMQP-соединения?

person Michael Greene    schedule 06.01.2010
comment
это почтовый сервер с поддержкой SSL (gmail) - person Evan; 07.01.2010
comment
и вы подключаетесь к порту 993, как указано в документах Gmail? а также с помощью IMAP4_SSL? - person Michael Greene; 07.01.2010
comment
да, похоже, это порт по умолчанию, который imaplib использует для SSL (и в целом это обычный порт imap ssl). также с использованием IMAP4_SSL.. он полностью работает в командной строке, но когда я выгружаю задачу в очередь с теми же параметрами, она не работает - person Evan; 07.01.2010
comment
Если сельдерей не теряет аргументы, такие как хост и порт, когда он снимает задачи, я в растерянности, извините. Удачи. - person Michael Greene; 07.01.2010