3

我正在尝试通过电子邮件发送一些回溯,我正在使用 python SMTPlib。

我的代码看起来像这样

def send_email_thread(from_addr, to_addr, message):
    server = smtplib.SMTP("smtp.googlemail.com", 587)
    server.ehlo()
    server.starttls()
    server.login(SENDMAIL_SMTP_USER, SENDMAIL_SMTP_PASSWD)
    server.sendmail(from_addr, to_addr, message)
    server.quit()

我试图获取回溯的实际代码

try:
    /*Something here that gives exception*/
except Exception:
    send_email_thread(from_addr,to_addr, str(traceback.format_exc()))

现在的问题是这条线

server = smtplib.SMTP("smtp.googlemail.com", 587)

挂起并且不返回。在稍微挖掘问题时,我发现__init__对于SMTP类调用,后者又调用使用 linux 的connect()套接字函数createconnectiongetaddrinfo()

调用路径:

mycode-->smtplib.SMTP---> __init__--->connect---->createconnection()--->getaddrinfo()

getaddrinfo()电话永远不会返回。这是挂机点。可能是什么问题呢?另外,我没有收到来自SMTPlib 的任何回溯或异常。那是因为我已经发现了一个异常吗?

这只发生在我调用块send_mail_thread()内的函数时except。从上面:

except Exception:
    send_email_thread(from_addr,to_addr, str(traceback.format_exc()))

我试着把它放在外面,它奏效了!哪些信号表明捕获异常然后运行它可能会导致问题?任何指针?我在 Linux 上使用 python 2.7

[编辑]

在下面的一些评论之后,我想添加以下更新。代码在从另一个主进程(使用multiprocessing模块)创建的进程内运行。然后send_email_function在这个子进程的线程中调用。

我创建了一个更简单的程序来测试这一点,其中所有事情都在一个进程中完成。它成功了。这意味着getaddrinfo()当某些子进程出现异常或multiprocessing模块处理 POSIX 调用的能力如何时,存在一些问题(死锁)

4

0 回答 0