LINUX.ORG.RU

python-скрипт в какое-то время перестает перенаправлять email сообщения

 


0

1

Ребята, привет.

Есть у меня python-скрипт, который по крону каждые 10 сек проверяет заданную почту по IMAP и если там есть новое сообщение (last id), то он забирает письмо в свою папку INBOX и оттуда сразу же пересылает его моему телеграм-боту. Но вот раз в два дня что-то происходит и письма начинают копиться в папке INBOX, которую создал скрипт и соответственно сообщения перестают уходить в телеграм, пока папку эту не почищу.

Как можно поискать причину такого поведения? Может отладку включить? Поделитесь плиз опытом/вариантами.

Это сообщение прекрасно во всём. Не удивлюсь, если ТС скажет, что это всё «по работе».

vvn_black ★★★★★
()

Как можно поискать причину такого поведения?

Посмотреть логи. Нет логов? Тогда «унутре скрипта» или запустить в консоли и дождаться эксепшена.

Может отладку включить?

А вот это попробуйте.

Поделитесь плиз опытом/вариантами.

Опытом пойти туда-не-знаю-куда и сделать-то-не-знаю-что?

vvn_black ★★★★★
()
Ответ на: комментарий от noname_user

Сам скрипт main.py https://pastebin.com/LSABKQm6

Рядом с ним у меня файл config.ini

[email]
host = host.ru #где ищем почту
login = email@host.ru
password = 5555555
last_uid = 82 # при первом запуске ID должен сформироваться сам

[telegram]
token = 65785689768769aEGOEYyG2s # бот
chat_id = -40876800 # группа

А этот скрипт добавил в крон, чтобы каждые 10 сек проверял почту. Почему-то, если поставить проверку раз в 1 минуту, то если в папке INBOX будет больше одного письма, то скрипт зависнет. Поэтому поставил каждые десять сек, так хоть редко происходит переполнение папки.

Скрипт run.sh

#!/usr/bin/env bash
BASEDIR=$(dirname "$0")
echo "START"
source $BASEDIR/send_tickets/bin/activate
python $BASEDIR/main.py

А вот как генерировать логи от скрипта я пока не знаю, но курю маны.

yatakoi
() автор топика
Ответ на: комментарий от yatakoi

Сейчас отправил на почту сразу 3 сообщения с одинаковым заголовком и содержимым. Только одно письмо пришло в телеграм.

yatakoi
() автор топика
Ответ на: комментарий от yatakoi

Кажется нашёл.

Вставил в скрипт

import logging
logging.basicConfig(filename="sample.log", level=logging.INFO)
log = logging.getLogger("ex")

try:
    raise RuntimeError
except RuntimeError:
    log.exception("Error!")

Отправил на почту 4 сообщения и везде тема сообщения просто цифра «1».

Запустил и вот что выдал

Traceback (most recent call last):
  File "main.py", line 138, in <module>
    last_uid = get_emails(host, login, password, last_uid=last_uid)
  File "main.py", line 62, in get_emails
    os.mkdir(dir_name)
FileExistsError: [Errno 17] File exists: '1 от Максим Александрович ttt@yandex.ru'

Соответственно ни одно сообщение не пришло в телеграм. В этом и заключается «зависание».

yatakoi
() автор топика
Последнее исправление: yatakoi (всего исправлений: 2)

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

seiken ★★★★★
()
Ответ на: комментарий от seiken

Мне теперь не понятно как лучше поступить

yatakoi
() автор топика
Ответ на: комментарий от seiken

Пока проверить не могу, смогу только завтра. Тем не менее рабочий ли вариант строку 48 os.mkdir(dir_name) заменить на pathlib.Path(‘dir_name’).mkdir(parents=True, exist_ok=True) ?

yatakoi
() автор топика
Последнее исправление: yatakoi (всего исправлений: 1)
Ответ на: комментарий от seiken

Такой вариант работает, но если два письма с одинаковым заголовком, то в телеграм отправляется только один файл.

yatakoi
() автор топика
Ответ на: комментарий от seiken

Было так:

            os.mkdir(dir_name)
            os.chdir(dir_name)

Я сделал так:

            if not os.path.exists(dir_name):
                os.mkdir(f"{dir_name}{random.randint(10000000, 999999999999)}")
            
            os.chdir(dir_name)

Когда отправил письмо с темой сообщения «1»

Теперь в INBOX создаётся папка «1 от Максим Александрович фф@yandex.ru739668445337»

И скрипт ругается, потому что ему нужна папка без цифр в конце:

Traceback (most recent call last):
  File "main.py", line 127, in <module>
    last_uid = get_emails(host, login, password, last_uid=last_uid)
  File "main.py", line 52, in get_emails
    os.chdir(dir_name)
FileNotFoundError: [Errno 2] No such file or directory: '1 от Максим Александрович ффф@yandex.ru'
yatakoi
() автор топика
Последнее исправление: yatakoi (всего исправлений: 1)
Ответ на: комментарий от yatakoi

могу и поработать за тебя, было бы тоже супер, ага?

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

anonymous
()
Ответ на: комментарий от XoFfiCEr

где таймер? когда ты его уже допишешь??? джва месяца жду!!!

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.