Skip to main content
 首页 » 编程设计

Python 多处理 imaplib 抛出错误

2025年05月04日24虾米哥

我有以下代码,我试图同时从邮箱的不同目录中获取邮件。但是,它显示出以下问题。已附上缩短的堆栈跟踪。

import multiprocessing as mlp 
import imaplib as impl 
 
def somefunc(dirc): 
    mail.select(dirc) 
    result, data = mail.uid("search", None, "All") 
    uids = data[0].split() 
    print dirc 
    for mail_id in uids: 
       result, data = mail.uid("fetch", mail_id, "(RFC822)") 
 
if __name__ == '__main__': 
    mail = impl.IMAP4_SSL("somedomain") 
    mail.login("username","password") 
 
    jobs = [] 
    p1 = mlp.Process(target = somefunc, args = ("INBOX",)) 
    jobs.append(p1) 
    p1.start() 
    p2 = mlp.Process(target = somefunc, args = ("Sent",)) 
    jobs.append(p2) 
    p2.start() 
    for i in jobs: 
        i.join() 

它抛出错误:

Process Process-2: 
Traceback (most recent call last): 
File "/usr/lib/python2.7/multiprocessing/process.py", line 258, in _bootstrap 
Process Process-1: 
Traceback (most recent call last): 
File "/usr/lib/python2.7/multiprocessing/process.py", line 258, in _bootstrap 
    self.run() 
File "/usr/lib/python2.7/multiprocessing/process.py", line 114, in run 
    self._target(*self._args, **self._kwargs) 
........ 
File "/usr/lib/python2.7/imaplib.py", line 859, in _command 
    raise self.abort('socket error: %s' % val) 
abort: socket error: [Errno 32] Broken pipe 
    typ, dat = self._simple_command(name, mailbox) 
........ 
error: [Errno 104] Connection reset by peer 

难道不能并发imap连接吗???

谢谢...:)

请您参考如下方法:

我的猜测是您遇到了问题,因为您正试图跨进程共享邮件套接字连接对象。相反,尝试让每个进程创建其连接:

import multiprocessing as mlp 
import imaplib as impl 
 
def somefunc(domain, name, password, dirc): 
    mail = impl.IMAP4_SSL(domain) 
    mail.login(name, password) 
    mail.select(dirc) 
    result, data = mail.uid("search", None, "All") 
    uids = data[0].split() 
    print dirc 
    for mail_id in uids: 
       result, data = mail.uid("fetch", mail_id, "(RFC822)") 
 
if __name__ == '__main__': 
    jobs = [] 
 
    for box in ("INBOX", "Sent"): 
        p = mlp.Process( 
                target = somefunc,  
                args = ("somedomain", "username", "password", box) 
            ) 
        jobs.append(p) 
        p.start() 
 
    for i in jobs: 
        i.join()