Ошибка timeout в почтовой программе на python
Есть скрипт, который постоянно просматривает почту. Свою задачу выполняет, но через пару минут / часов, вне зависимости от количества поступивших писем, скрипт останавливается с ошибкой
socket.timeout: _ssl.c:1112: The handshake operation timed out
или
socket.timeout: The read operation timed out
Код:
def tracker():
mail_pass = "password"
username = "mail"
imap_server = "imap.yandex.ru"
imap = imaplib.IMAP4_SSL(imap_server, 993)
sock = imap.socket()
imap.login(username, mail_pass)
imap.select("INBOX")
data_1 = imap.uid('search', "ALL")
timeout = 60
sock.settimeout(timeout)
Если писем несколько, то в print data_1 будет вот такое
[b'11 12 13']
Отделяю номера друг от друга
if str(data_1[1]) != "[b'']":
for numb in data_1[1]:
numb = str(numb).replace("b'", '')
numb = numb.replace("'", '')
numb = numb.split(' ')
Если сделать print(numb), получится
11
12
13
И для каждого UID выполняю след. действия:
for num in numb:
res, msg = imap.uid('fetch', num, '(RFC822)')
msg = email.message_from_bytes(msg[0][1])
try:
theme = decode_header(msg["Subject"])[0][0].decode() # Получили тему письма
except:
theme = decode_header(msg["Subject"])[0][0] # Получили тему письма
Ищем задачу в трекере
check = client.issues.find(filter={'queue': 'Имя очереди',
'summary': theme})
Если не нашли, создаём
if str(check) == '[]':
data = {"summary": theme, "queue": {"id": "2", "key": "Имя очереди"}}
# Отправляем запрос
response = requests.post("https://api.tracker.yandex.net/v2/issues/",
headers={"Authorization": f"OAuth {oauth_token}",
"X-Cloud-Org-ID": organization_id},
json=data)
Читаем текст сообщения
text = ""
for part in msg.walk():
if part.get_content_maintype() == 'text' and part.get_content_subtype() == 'html':
text = str(part.get_payload())
if re.search('PGR', text):
text = base64.b64decode(part.get_payload()).decode()
Удаляем сообщение, если не нашли ключевое слово "Статус"
if not re.search('Статус:', str(text)):
imap.uid("STORE", num, "+FLAGS", "\\Deleted")
Если нашли в сообщении "Статус", то меняем статус в задаче
else:
issues = client.issues.find(filter={'queue': 'Имя очереди', 'summary': theme})
change = str(issues).replace('[<Resource /v2/issues/', '')
change = change.replace('>]', '') # Не нашла, как достать без replace)
if not re.search(']', str(change)):
def change_status(txt, a, b):
if re.search(a, txt):
print(a, txt)
try:
iss = client.issues[change]
iss.transitions[b].execute()
r, d = imap.uid("STORE", num, "+FLAGS", "\\Deleted")
print(iss)
return r, d
except:
print('Error', a)
def status(txt):
change_status(txt, '1', '1Meta')
change_status(txt, '2', '2Meta')
change_status(txt, '3', '3Meta')
status(text)
threading.Timer(10, tracker).start()
if __name__ == "__main__":
tracker()
Пробовала с sock = imap.socket(), не удалось, ошибка актуальна
Вопросы:
Я каждый раз для входа вызываю tracker(), если вынести авторизацию за пределы функции, это может на что-то повлиять?
Как предотвратить timeout или сделать так, чтобы после него скрипт снова запустился?