Верстакфорум практиков
рекламаiprazon: приватные серверные адреса IPv4 и SOCKS5, безлимитный трафик, бесплатный тест до 2 часов
ФорумПочта и рассылки

IMAP или POP3: что брать под задачу

Ринат Ахметов
Ринат Ахметов
Участник
сообщений 700
с авг
1 января, 08:12первое сообщение

Пишу приёмник писем: скрипт раз в минуту забирает входящие, вытаскивает вложение с прайсом и кладёт в обработку. Тот же ящик открыт у двух человек в почтовом клиенте.

Взял IMAP, потому что он у меня везде. Работает, но каждую минуту тянуть список папки на десять тысяч писем скучно, да и коллеги жалуются, что письма помечаются прочитанными сами собой.

Думаю, не взять ли POP3 под скрипт. Кто на чём остановился и почему?

Кирилл Бакин
Кирилл Бакин
Знаток
сообщений 1560
с апр
8 июня, 11:29#2

Разница у них в одном слове: состояние. IMAP держит письма и их состояние на сервере, клиенты видят одну и ту же картину. POP3 забирает письмо к себе и дальше живёт своей жизнью.

Отсюда и ваша жалоба коллег: скрипт по IMAP лезет в тот же общий ящик и меняет общие флаги.

Настя Лужина
Настя Лужина
Новичок
сообщений 265
с янв, второй сезон
15 ноября, 14:46#3

а pop3 разве не удаляет письма с сервера? тогда коллеги их вообще не увидят

ostrov
ostrov
Участник
сообщений 505
с окт
22 апреля, 17:03#4

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

Другой момент важнее: POP3 работает с одной входящей папкой и не знает про остальные. Раскладка по папкам, поиск на стороне сервера, подписка на новые письма без опроса, всё это только в IMAP.

Для описанной задачи я бы всё-таки остался на IMAP, но починил две вещи. Первая: спрашивать сервер поиском, вместо того чтобы тянуть всю папку целиком. Вторая: завести свою отметку и оставить общие флаги в покое.

import imaplib
m = imaplib.IMAP4_SSL("imap.example.net", 993)
m.login(user, password)
m.select("INBOX", readonly=False)

# сервер сам отберёт нужное, список папки тянуть незачем tip, dannye = m.search(None, 'UNSEEN', 'SUBJECT', '"prays"') for uid in dannye[0].split(): syroe = m.fetch(uid, '(BODY.PEEK[])') # PEEK не ставит \Seen m.store(uid, '+FLAGS', '(vzyato_skriptom)') # своя отметка вместо общей m.logout() ```

BODY.PEEK[] вместо BODY[] и есть ответ на «письма помечаются сами собой».

Ринат Ахметов
Ринат Ахметов
Участник
сообщений 700
с авг
1 сентября, 08:20#5
ostrov: BODY.PEEK[] вместо BODY[]

Вот этого я и не знал. Полез в свой код, у меня там обычный fetch(uid, '(RFC822)'), он как раз ставит флаг.

okhotnik
okhotnik
Участник
сообщений 720
с авг
8 февраля, 11:37#6

Про минутный опрос добавлю. Раз в минуту дёргать search можно, но честнее взять IDLE: соединение висит открытым, и сервер сам говорит, когда пришло новое. Нагрузка на обе стороны падает, задержка становится секундной.

Правда, соединение надо переустанавливать примерно раз в двадцать пять минут, такой предел в протоколе. И не все серверы это умеют: смотрите ответ на CAPABILITY, там перечислено, о чём стороны сойдутся. Возможности всегда работают по согласию сторон, клиент один ничего не навяжет.

Алина Т.
Алина Т.
Новичок
сообщений 190
с апр, второй сезон
15 июля, 14:54#7

подскажите, а какие номера портов у них правильные, я путаюсь

Кирилл Бакин
Кирилл Бакин
Знаток
сообщений 1560
с апр
22 декабря, 17:11#8

IMAP: 143 без шифрования и 993 с шифрованием сразу. POP3: 110 и 995 соответственно. Открытые номера берите только внутри своей сети.

Что нужноЧем брать
один ящик на несколько человек и машинIMAP
папки, поиск на сервере, быстрое оповещениеIMAP
скрипт забирает всё к себе и складывает в архивPOP3
ящик распух, а состояние никому не нужноPOP3
Ринат Ахметов
Ринат Ахметов
Участник
сообщений 700
с авг
1 мая, 08:28#9

Остался на IMAP. Поставил BODY.PEEK[], добавил свою отметку вместо общего прочитанного, вместо перебора папки теперь поиск по теме и отметке. Опрос заменил на IDLE с переподключением каждые двадцать минут.

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