Как стать автором
Обновить

Комментарии 6

Пользуясь случаем спрошу:

  • может есть у кого готовый (прошедший проверку временем) скрипт для zabbix, который читает почту и при совпадении "темы" и "слов в теле" письма поднимает триггер?

А можете уточнить - используемые в примере библиотеки:

а) подключают только imaps (порт 993/TCP/TLS), или умеет STARTTLS на порту imap (порт 143/TCP)?

б) если умеет STARTTLS - он точно использует те же настройки шифрования (версии протоколов TLS и наборы шифров), что и для imaps?.. (например, в PHP сталкивались с ситуацией, когда библиотека для imaps умеет tls 1.2, а для imap/starttls - максимум tls 1.1, который и более старые версии нынче надо отключать из соображений безопасности, оставлять только TLS 1.2 и 1.3).

imaplib в STARTTLS  - умеет (AP4.starttls(ssl_context=None)), mail.ru тоже (IMAP — 143 (протокол шифрования STARTTLS) или 993 (протокол шифрования SSL/TLS)).

На практике не реализовывал, поэтому на б) пока ответить не могу. Пишут что поддерживает TLS 1.3, но опять же лучше проверить.

Ну в б) самое интересное - как описывал выше, сталкивались с ситуациями, когда в библиотеке эти два метода подключения почему-то используют разные версии протоколов TLS...

Что до мейлру - то да, он поддерживает imaps и imap/starttls, но только версии TLS 1.2, не старее (что хорошо), но и не новее. Но тут уже проблема на стороне мейлру, а не библиотеки.

Спасибо, пригодилась статья.
Однако заметил что такой подход к декодированию строк, хотя может сработать на отдельном письме, не устойчивый:

decode_header(msg["Subject"])[0][0].decode()
  1. по индексу [0][0] может быть и строка, и байты - будет ошибка

  2. для decode не учитывается опциональная кодировка по индексу [0][1], а берётся по-умолчанию

  3. кроме пары по индексу [0] могут прийти и приходят и другие пары, каждая со своей кодировкой

Вобщем нужно писать свою обёртку над decode_header; та что из коробки не готова к реальному использованию вобще.

да, тут надо варианты предусмотреть:

encoding = decode_header(msg_from_subj)[0][1]
msg_from_subj = decode_header(msg_from_subj)[0][0]
if isinstance(msg_from_subj, bytes):
  msg_from_subj = msg_from_subj.decode(encoding)
if isinstance(msg_from_subj, str):
  pass

у меня вот эта проверка довольно стабильно работает, каких-то нареканий пока не поступало

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории