Ошибка 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(), не удалось, ошибка актуальна

Вопросы:

  1. Я каждый раз для входа вызываю tracker(), если вынести авторизацию за пределы функции, это может на что-то повлиять?

  2. Как предотвратить timeout или сделать так, чтобы после него скрипт снова запустился?


Ответы (0 шт):