Пишу одну небольшую программу, иконка в трее и уведомления о непрочитанных письмах в почтовом ящике. Программа уже на стадии завершения, сейчас делаю «защиту от дурака», обрабатываю некоторые распространенные ошибки, чтобы юзеру выводилось сообщение об ошибке, а не краш программы.
Конкретно застрял на вводе заведомо неправильных параметров ящика (логин, пароль, порт). Экспериментирую с подсовыванием программе вместо своего собственного почтового сервера адреса «mail.yandex.ru». Программа от этого на несколько секунд впадает в ступор, а потом вываливается со следующим выхлопом:
Traceback (most recent call last):
File "./mail-notifier.py", line 198, in <module>
mail_check()
File "./mail-notifier.py", line 161, in mail_check
if (SettingsExist() == True and Mail().testConnection() == False):
File "./mail-notifier.py", line 142, in __init__
self.imap = imaplib.IMAP4_SSL(settings.value("MailServer"), settings.value("Port"))
File "/usr/lib64/python3.4/imaplib.py", line 1221, in __init__
IMAP4.__init__(self, host, port)
File "/usr/lib64/python3.4/imaplib.py", line 181, in __init__
self.open(host, port)
File "/usr/lib64/python3.4/imaplib.py", line 1234, in open
IMAP4.open(self, host, port)
File "/usr/lib64/python3.4/imaplib.py", line 257, in open
self.sock = self._create_socket()
File "/usr/lib64/python3.4/imaplib.py", line 1224, in _create_socket
sock = IMAP4._create_socket(self)
File "/usr/lib64/python3.4/imaplib.py", line 247, in _create_socket
return socket.create_connection((self.host, self.port))
File "/usr/lib64/python3.4/socket.py", line 512, in create_connection
raise err
File "/usr/lib64/python3.4/socket.py", line 503, in create_connection
sock.connect(sa)
socket.timeout: timed out
class Mail():
def __init__(self):
self.user = settings.value("Login")
self.password = settings.value("Password")
socket.setdefaulttimeout(5)
self.imap = imaplib.IMAP4_SSL(settings.value("MailServer"), settings.value("Port"))
self.imap.login(self.user, self.password)
def checkMail(self):
self.imap.select()
self.unRead = self.imap.search(None, 'UnSeen')
return len(self.unRead[1][0].split())
def testConnection(self):
# This code doesn't work
try:
socket.create_connection(settings.value("MailServer"),settings.value("Port"),2)
return True
except:
pass
return False
def mail_check():
if (SettingsExist() == True and Mail().testConnection() == True):
if Mail().checkMail() == 0:
window.mailboxEmpty()
else:
window.mailboxFull()
else:
window.mailboxError()