Как узнать были ли загружены ранее сообщения с почтового сервера?

denisl

Новичок
Как узнать были ли загружены ранее сообщения с почтового сервера?

Здравствуте!
Такой вопрос: пишу почтовый клиент.
Почтовый сервер: POP3
Функции обработки почты - IMAP.
Несколько раз прочитав документацию по iMAP никак не могу понять как мне узнать какие сообщения на сервере новые, а какие я уже считал в локальную папку. Мне требуется оставлять сообщения на сервере после прочтения.
Как я понял из документации, UID должен быть уникальным для каждого сообщения. Значит, если в ящике было например 10 сообщений, то их UID-ы 1......10. И если я сотру первое сообщение, UID-ды будут иметь вид : 2.....10. Так?
А у меня получается что все UID-ы сдвигаются - то есть после удаления первого сообщения они имеют вид: 1.....9.
Получается по UID синхронизировать не могу. Так же в новой сессии съезжает UIDvalidity(который говорит, что полученные ранее UID-ы теперь неправильные).

Так же не совсем понятно как работают флаги. Например после прочтения сообщений я ставлю им флаги \\Seen. А при новом соединении с сервером флаги обнуляются и у всех сообщения флаг Recent имеет статус "N"(значит сообщение новое и не прочитанное).
Что,получается, что флаги актуальны только в рамках текущей сессии? Или это так потому, что работаю с POP3 а не с IMAP-сервером? (ведь IMAP-функции работают с POP3 не в полную силу).

Неужели для синхронизации требуется сравнивать содержимое сообщений на сервере с ранее скаченными? Не верится что-то.
Вобщем если кто поможет разобраться как мне синхронизировать локальную папку с серверным инбоксом - буду благодарен.

Заранее спасибо.
 

DiMA

php.spb.ru
Команда форума
с чего ты решил, что номера с 1 по 10 и при удалении меняются?
у письма есть уникальный идентификатор
скачал - записал
в будущем скачал, сравнил с базой, узнал, что новое/старое, скачал только новое
 

denisl

Новичок
Автор оригинала: DiMA
с чего ты решил, что номера с 1 по 10 и при удалении меняются?
у письма есть уникальный идентификатор
скачал - записал
в будущем скачал, сравнил с базой, узнал, что новое/старое, скачал только новое
А решил просто "опытным" путём: стёр сообщение и прочитал статус ящика.
Всего было 17 сообщений, после удаления первого стало 16.

imap_status ($stream, $mailbox, SA_ALL) вернула такой массив:
[12] => stdClass Object
(
[flags] => 31
[messages] => 16
[recent] => 16
[unseen] => 1
[uidnext] => 17
[uidvalidity] => 1230418126
)
[uidnext] => 17 - это говорит о том что следующий номер (UID) нового сообщения будет 17. Отсюда следует, что нумерация сдвинулась вверх(так как стёр я сообщение под номером 1). Если я всё правильно понимаю.

-~{}~ 28.12.08 02:16:

Я ещё раз оговорюсь - я работаю с POP3 посредством Imap-функций. Может в этом вся запара. Но как тогда работает Mozilla Thunderbidth с тем же ящиком. Она ведь при соединении не считывает те письма, которые уже считала раньше. И галочка стоит(оставить сообщения на сервере). Как ей это удаётся, если сервер POP3? Не понимаю.
 

DiMA

php.spb.ru
Команда форума
по поп3 точно есть уникальный идентификатор
+список всех писем (порядковый номер+уникальный ид) можно получить одной командой, не скачивая сами письма
 

denisl

Новичок
Верю - а это можно как-то получить посредством imap-функций?
если это команда Imap_uid() - то не катит скорее всего.
 

serglt

Анус, ой, Ахтунг
Есть такая чудо команда в попе UIDL, возвращает как раз таки UID сообщений, тебе ток нуна научиться выдирать адишники при помощи имап функций. Во, для одного сообщения - [man]imap_uid[/man]. Дальше ищи сам.

-~{}~ 28.12.08 02:29:

Почему не катит? по номеру выдает айдишник, есть и обратная функция. просто возможно есть уже что нить в imap_fetchstructure. Не мне ж за тебя читать и проверять

-~{}~ 28.12.08 02:34:

Думаю одной командой и для всех сообщений найдется, ток (повторюсь) ман нуна читать.
 

denisl

Новичок
Ещё раз прочитал документацию по IMAP вот что обнаружил:

"Допускается изменение порядкового номера сообщения на протяжении сессии. Например, когда сообщение удаляется из почтового ящика, номера всех последующих сообщений изменяются. Аналогично, новому сообщению может быть присвоен номер удаленного сообщения.

Номера сообщений могут использоваться при вычислениях, касающихся указателей. Например, если сообщение 287 в почтовом ящике, содержащем 523 сообщения, имеет UID 12345, существует 286 сообщений с меньшим значением UID и 236 сообщений с большими UID."

- Так это что получается, если один и тот же ящик читают с разных компов(первый оставляет на сервере сообщения, а второй снимает с сервера после почтения), то если второй юзер стёр сообщение из середины списка (например второе из трёх)- все нижестоящие поднялись выше? И если пришло новое письмо(оно встанет под UID 3), то когда первый проверят ящик основываясь, на том, что UID 1,2,3 - это прочтённые письма - он просто никогда не получит нового письма(под UID3). Правильно я понимаю? Это ж засада какая-то. Или получается, что почтовые клиенты анализируют не только по UID но как-то ещё. Или 3-ий вариант - я не что-то упускаю.
 

serglt

Анус, ой, Ахтунг
Упускаешь
UID Уникальный номер сообщения, он не может повториться
Вообще на примере проще всего смотреть:
telnet mail.xx 110
user [email protected]
pass password
uidl
quit

Смотришь айдишники выданные, затем удаляешь сообщениt - опять смотришь, шлешь сообщение смотришь. В итоге получаешь результат исследований и в голове прирост :)
 

denisl

Новичок
DiMA, serglt -спасибо.
Ну да в заголовке ещё есть [uidvalidity] - но он тоже при каждой сессии меняется. Ещё есть Message-id - но он в некоторых письмах пустой. Люди, кто решал подобную задачу - помогите плз. Мануал можно хоть наизусть выучить - но важно понять ведь. А с этим загвоздка.

-~{}~ 28.12.08 02:54:

Ну ты говоришь ведь про чистый POP3 и обращаешься к нему напрямую. А у меня обращение к POP3 через IMAP и даже в мануле написано, что UID может меняться - и практика показывает что он меняется. Ну или просто не въезжаю совсем.
 

serglt

Анус, ой, Ахтунг
Этот набор команд для POP3 как раз выдают номер - uid для всех писем. Прелогиниваться нуна постоянно, мож комманда есть какая, что б сеанс по новой не начинать, я не помню, счас так смотрел, лень в ман лезть. :). Делал почту как то тоже, ток на сокетах и строковых функциях. :) Но она ток как ящик ридер работает. Не делал возможности смотреть скока новых/старых. Было интересно реализовать чтение аттачментов и прочей гадости.

-~{}~ 28.12.08 03:00:

ДЫк, ты юзаешь имап функции для работы с попой, они тебе ни папку создадут/удалят. Ни флаги не покажут новое письмо или старое и т. д. POP3 - это просто файл с пришедшими к тебе письмами, для каждого письма идет айдишник. Там нет ни флагов ни папок и . т. д. Отправленных писем тож нету.

-~{}~ 28.12.08 03:07:

Говорю тебе - попробуй на практике, отправь письмо. напрямую посмотри uid, удали все письма из ящика и заново отправь новое письмо. Глянь его uid и т. д. Будет видно как оно работает. И так пока не добьешься выводов. Зарегься на нескольких почтах (адреса думаю говорить не нуна) Глянь в в их настройках как клиентом логиниться, и через телнет потестируй, как ко себя ведет. А там и делай выводы.
 

denisl

Новичок
Почему же флаги показывают - и даже сбрасывают-устанавливают - но это действует только в рамках сессии к сожалению. А папки - да - ты абсолютно прав - не создаются и не двигается ничего.
Ладно, может утром что в голову придёт. serglt, спасибо.
 

serglt

Анус, ой, Ахтунг
Имап функции - просто имеют возможность работать с POP, а сами протоколы даже в командах ничего общего не имеют (немного криво сделано со стороны разработчиков). Просто я так думаю что реализация парсинга тела письма была там реализована и просто к имап функциям пркрутили возможность работать с POP.

-~{}~ 28.12.08 03:24:

Флаги то изменяются, но вот сохраняются они ток по закрытию сессии (если мне не изменяет память). А возможностей у POP их сохранения - нету. Есть ток - пометить для удаления и по закрытию они удалятся, можно еще их и отменить.
 

Crys

Двинутый новичок
Вообще, по-нормальному использование IMAP подразумевает использование одного (центрального) сервера.
Зачем делать онлайновый почтовый интерфейс, который будет работать с отдельной базой?
Тут получается синхронизация ради синхронизации. Смысл? Обращайся в IMAP-серверу напрямую.

И в том же Thunderbird что-то я не наблюдаю автоматического изменения флагов для старых сообщений.

-~{}~ 28.12.08 02:37:

Флаги то изменяются, но вот сохраняются они ток по закрытию сессии (если мне не изменяет память)
По закрытию (imap_close) ничего нестандартного не происходит..
А ты походу imap_expunge имеешь ввиду...
 

serglt

Анус, ой, Ахтунг
Crys
Не стоит 5 копеек совать не по делу и без хоть какого то знания мат части - для +1 к постам ;)

Человек пытается работать с POP3 средствами imap функций. А тут не в попад что то говоришь
 

Crys

Двинутый новичок
serglt
Да, я очень люблю циферку рядом со словом "Сообщений: "
Ты что-то имеешь против?

О каких флагах вообще может идти речь при использовании POP3?

Или протокол каким-то образом расширили?

Какие seen? Какое выставление флагов по закрытию сессии? Там только удаление при закрытии происходит. Другого просто нет.
 

serglt

Анус, ой, Ахтунг
Ты либо пьян, (хотя вроде пьян я) либо невнимательно читаешь, Я про это уже писал. Не надо за мной повтаряться

-~{}~ 28.12.08 04:57:

DELE - в POP3 ПОМЕЧАЕТ для удаления, и после команды QUIT (завершаем сеанс) происходит удаление.
Командой RSET - снимает флаги с сообщений помеченных для удаления.
Все что может POP3 с флагами.

Crys
> И в том же Thunderbird что-то я не наблюдаю автоматического изменения флагов > для старых сообщений.

Банально не знаешь как клиенты работают.

Просто качают все сообщения к тебе на комп а с сервера удаляют (в зависимости от твоих индивидуальных настроек). Там можешь помечать его как хош, и в папки перемещать, все уже у тя на лакале.
 

Crys

Двинутый новичок
Ты либо пьян, (хотя вроде пьян я) либо невнимательно читаешь, Я про это уже писал. Не надо за мной повтаряться
Вот и протрезвей для начала...

Я не обязан успевать читать то, что пишут когда я набираю сообщение. К слову, набирать первый ответ я начал когда было только четыре сообщения. Так уж получилось, что набирал его полтора часа. Да, я повторился. Но ничего неправильного в моих сообщениях нет.
 

denisl

Новичок
Вобщем ещё раз посмотрю документацию по IMAP-функциям. serglt, Crys - благодарю за советы.
Тема пока остаётся открытой.
 

Crys

Двинутый новичок
denisl
Не нужны тебе imap-функции. Девять забеременевших женщин. Одна комната. Через месяц они тебе никого не родят, как бы они не старались.

Также и с твоей проблемой. Ну никак ты не сможешь при помощи "imap-функций" добиться от pop3-протокола того, на что он просто не способен.

Посмотри протокол. В нём нет никаких флагов "seen"... Как уже выше говорилось, смотрим, что имеется на сервере.. сверяем с тем что есть. А флагов (seen\unseen) pop3 не поддерживает

По поводу уникального ID - повторяю вышесказанное - посмотри imap_uid. Там были нюансы при работе с pop3, но они были решаемы.

Да и вообще всё, что я написал - уже было сказано. Но может вот так.. когда всё вместе... Оно дойдет до сознания )
Ну не видно здесь никакой мистики.
 

denisl

Новичок
Да, в очередной раз почитал мануал по iMAP-функциям и удивился, что некоторые вещи замечаешь только с четвёртого раза :) - не гоже, видимо, по ночам програмить. Короче про UID-ы написано просто:

Примечание: не поддерживается POP3-mailbox'ами. :)))

И флаги аналогично - в рамках сессии с ними можно работать(сам экспериментировал, проставляя флаг RECENT в "R" - и тогда сообщение выглядело как просмотренное)

Получается, как писалось выше участниками форума, придётся привязываться к POP-овскому UIDL - он, к счастью,неизменен.

Соответственно, если моя задача работать с письмами imap-функциями, то нет другого выхода, как сначала через сокеты получить все UIDL-сообщений(а они выводятся красиво:
1 37cabbcb0000000a
2 37cabbcb0000000b
где первый параметр - это номер сообщения, а второй его UIDL), и далее сравнить UIDL-лы полученных с теми, что ранее скачаны. И далее уже с нужными сообщениями работать через imap-функции. Немного кривовато выглядит решение, но если у кого имеется более изящное(в принципе не нужен код, достаточно алгоритма или идеи), буду рад, если поделитесь.

Ниже хорошая ссылка на ресурс, в котором исчерпывающая инфа с примерами по работе с разными почтовыми протоколами(в том числе POP3).
http://www.intuit.ru/department/internet/sendmail/6/5.html

а это документация по IMAP для PHP:
http://live-co.com/webmasters/php42/f/ref.imap.html

Ещё раз спасибо всем терпеливым и отзывчивым участникам форума за помощь в поисках "истины".
 
Сверху