2

我在使用最新 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 行,在 select typ 中,dat = self._simple_command(name, mailbox)

文件“/usr/lib/python2.6/imaplib.py”,第 1059 行,在 _simple_command 中返回 self._command_complete(name, self._command(name, *args))

文件“/usr/lib/python2.6/imaplib.py”,第 889 行,在 _command_complete typ 中,data = self._get_tagged_response(tag)

_get_tagged_response self._get_response() 中的文件“/usr/lib/python2.6/imaplib.py”,第 990 行

_get_response resp = self._get_line() 中的文件“/usr/lib/python2.6/imaplib.py”,第 907 行

文件“/usr/lib/python2.6/imaplib.py”,第 1000 行,在 _get_line 行 = self.readline()

文件“/usr/lib/python2.6/imaplib.py”,第 1170 行,在 readline 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

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

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

4

3 回答 3

1

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

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

于 2010-01-08T11:03:48.850 回答
1

根据 celeryd 的创建者的说法:

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

于 2010-01-23T22:27:14.913 回答
0

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

于 2010-01-06T21:51:47.763 回答