如何在Python的SMTPlib中捕获连接超时错误?

2 投票
3 回答
9029 浏览
提问于 2025-04-15 20:56

出现的错误是:

error: [Errno 110] Connection timed out

我不太明白我应该期待什么?

    try:
        smtpObj = smtplib.SMTP('smtp.example.com')
        smtpObj.starttls()
        smtpObj.login('user','pass')
        smtpObj.sendmail(sender, receivers, message)
        print "Successfully sent email"
    except smtplib.SMTPException('Error: unable to send email"'):
        pass
    except smtplib.socket.error ('Error: could not connect to server'):
        pass

谢谢。

3 个回答

0

OSError 是一个基础类,用来处理一些特定的错误,比如 smtplib.SMTPConnectError(SMTP连接错误)、socket.timeout(套接字超时)和 TimeoutError(超时错误)等。因此,如果你想处理这些错误,最好是捕获 OSError

try:
    ...
except OSError:
    ...

查看详情: https://bugs.python.org/issue20903

2

我觉得 socket.error 应该可以用,但如果你把你正在使用的代码发出来,我们可以更好地帮助你。还有 smtplib.SMTPConnectError 也可能对你有帮助。

你可以试试下面这样的代码:

try:
    server = smtplib.SMTP("something.com")
except (socket.error, smtplib.SMTPConnectError):
    print >> stderr, "Error connecting"
    sys.exit(-1)
4

你需要提供异常类,而不是它的实例。也就是说,代码应该像这样:

try:
    smtpObj = smtplib.SMTP('smtp.example.com')
    smtpObj.starttls()
    smtpObj.login('user','pass')
    smtpObj.sendmail(sender, receivers, message)
    print "Successfully sent email"
except smtplib.SMTPException: # Didn't make an instance.
    pass
except smtplib.socket.error:
    pass

第二个异常,smtplib.socket.error,似乎是捕捉那个错误的合适选择。通常可以直接从套接字模块访问它,方法是 import socket,然后使用 socket.error

注意,我说代码“应该”是这样的,其实有点夸张。当你使用 try/except 时,想要在 try 块中包含尽可能少的代码,特别是当你要捕捉像 socket.error 这样比较通用的错误时。

撰写回答