Как я могу поймать ошибку тайм-аута соединения в SMTPlib Python? - PullRequest
2 голосов
/ 28 марта 2010

Выдается ошибка:

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

Спасибо.

Ответы [ 2 ]

4 голосов
/ 28 марта 2010

Необходимо указать класс исключения, а не его экземпляр. То есть код должен выглядеть как

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.

2 голосов
/ 28 марта 2010

Я считаю, socket.error должно работать, но если вы разместите код, который вы используете, мы можем помочь вам лучше. smtplib.SMTPConnectError также должен представлять интерес.

Попробуйте что-то вроде этого:

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