【问题标题】:python imaplib ssl error using celeryd queuepython imaplib ssl错误使用celeryd队列
【发布时间】:2011-01-02 06:10:39
【问题描述】:

我在使用最新 django svn 的 python 2.6 上使用 imaplib 时遇到问题。我想在队列中下载 imap 电子邮件(使用 celeryd)。我可以从命令行连接/下载电子邮件,但是当我通过 django 将任务卸载到 celeryd 时,我收到此错误:“SSLError: [Errno 1] _ssl.c:1325: error:1408F10B:SSL routines:SSL3_GET_RECORD :错误的版本号”。

Imaplib 文档没有提到如何指定 SSL 版本。我正在尝试从 gmail 中提取电子邮件。我不明白为什么使用 celeryd 将任务卸载到队列会导致任务失败。任何帮助将不胜感激。

编辑:这是一个堆栈跟踪:

文件“/usr/lib/python2.6/imaplib.py”,第 643 行,在选择中 typ, 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 line = self.readline()

文件“/usr/lib/python2.6/imaplib.py”,第 1170 行,在 readline char = self.sslobj.read(1)

文件“/usr/lib/python2.6/ssl.py”,第 136 行,已读取 return 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

我注意到该任务实际上将使用 celery 运行,除非我使用 --detach 标志对任务进行守护。我不知道为什么任务只有在作为守护进程运行时才会失败。我尝试使用 -u 和 -g 标志设置相同的用户 ID 和组 ID,相同的 umask,并确保守护程序和非守护程序版本的路径和工作目录相同,但任务仍然不会运行当 celery 作为守护进程运行时在 celery 中。

我正在使用最新版本的 celery (0.9.4)。

【问题讨论】:

    标签: python django celery


    【解决方案1】:

    如果它只在 celery worker 内部运行时中断,则可能是 amqplib (使用 ssl 模块)或多处理和分叉(一个在 fork 之前初始化的全局变量不再是活着)

    能否请您包含您要运行的任务? 您是连接到任务本身内部的服务器,还是某种共享对象?

    【讨论】:

    • 另外,可能 imaplib 不是线程/forksafe,并且存在连接缓存或类似缓存,那么您可能必须在任务开始时找到并清除它。
    • 嘿,asksol,感谢您的回复。我在上面的问题中添加了更多信息,包括我正在运行的任务。另外,我注意到该任务将在 celery 中运行,除非 celery 作为带有 --detach 标志的守护进程运行。有什么想法吗?
    【解决方案2】:

    据 celeryd 的创造者说:

    自 01a8a0e 起,Celery 不再自行分离。它存在太多问题,而且由于它在使用 start-stop-daemon、supervisord、launchd 等进行分离时有效,因此建议您改用这些工具。

    【讨论】:

      【解决方案3】:

      您正在连接到不使用 TLS 的端口。您是在尝试与启用 TLS/SSL 的邮件服务器通信,还是 celery 尝试将 TLS 用于其 AMQP 连接?

      【讨论】:

      • 这是一个启用 SSL 的邮件服务器 (gmail)
      • 并且您正在连接端口 993,如 gmail 文档中所述?并且还使用IMAP4_SSL?
      • 是的,看起来这是 imaplib 用于 SSL 的默认端口(通常是通常的 imap ssl 端口)。也使用 IMAP4_SSL ..它完全可以在命令行上运行,但是当我使用相同的参数将任务卸载到队列时它会失败
      • 除非 celery 在完成任务时丢失了主机和端口等参数,否则我很茫然,抱歉。祝你好运。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-04
      • 2013-09-16
      • 2012-12-11
      • 2016-06-23
      • 1970-01-01
      • 2012-12-11
      • 2011-11-26
      相关资源
      最近更新 更多