Я хочу получить и удалить верхнее сообщение (с UID = 1) через IMAP с помощью curl. Я могу сделать это несколькими командами, однако, когда я отправляю команду удаления, у меня нет гарантии, что uid не изменился. Есть ли способ сохранить сеанс imap (или pop3) в curl?
UID не меняются. MSN меняются. 1 - это MSN верхнего / нижнего / самого старого сообщения в почтовом ящике. Удаление одного сообщения не меняет UID другого.
«1» не является UID. «1» - это просто номер сообщения. Если вы удалите сообщение 9, и появится новое сообщение, также будет сообщением 9.





Фактически, у вас есть гарантия того, что UID не изменился: делать - это то, о чем идет речь в поле IMAP UIDVALIDITY. Пока значение UIDVALIDITY для почтового ящика не изменилось, все имеющиеся у вас UID сообщения будут продолжать указывать на это же сообщение. Подробнее об этом читайте в IMAP RFC.
Используя curl, вы можете подтвердить значение UIDVALIDITY в запросе, включив его в URL-адрес IMAP, например:
curl 'imaps://imap.example.com/inbox;UIDVALIDITY=6' ...
Если UIDVALIDITY был изменен, curl сообщит:
curl: (78) Mailbox UIDVALIDITY has changed
Вы можете увидеть значение UIDVALIDITY для почтового ящика, передав опцию -v в curl при выполнении, например, EXAMINE:
$ curl -v imaps://imap.example.com/ -X 'examine inbox'
[...]
> A003 examine inbox
< * FLAGS (\Answered \Flagged \Draft \Deleted \Seen $NotPhishing $Phishing Old SEEN)
< * OK [PERMANENTFLAGS ()] Flags permitted.
< * OK [UIDVALIDITY 7] UIDs valid.
< * 9 EXISTS
< * 0 RECENT
< * OK [UIDNEXT 7422] Predicted next UID.
< * OK [HIGHESTMODSEQ 14264365]
< A003 OK [READ-ONLY] inbox selected. (Success)
Необходимым условием использования значения UIDVALIDITY является запрос uid сообщений. Вы можете запросить атрибут UID при получении информации о сообщениях:
$ curl -sv --netrc 'imaps://imap.example.com/inbox' -X 'fetch 1:* (UID FLAGS)'
[...]
< * 1 FETCH (UID 7186 FLAGS (\Seen))
< * 2 FETCH (UID 7188 FLAGS (\Seen))
< * 3 FETCH (UID 7278 FLAGS (\Seen))
< * 4 FETCH (UID 7288 FLAGS (Old \Seen))
< * 5 FETCH (UID 7364 FLAGS (\Seen))
< * 6 FETCH (UID 7413 FLAGS (\Seen))
< * 7 FETCH (UID 7417 FLAGS (\Seen))
< * 8 FETCH (UID 7419 FLAGS (\Seen))
< * 9 FETCH (UID 7421 FLAGS (\Seen))
Если у вас есть UID, вы можете использовать его для обращения к сообщению, добавляя к командам префикс ключевого слова UID. Например, вместо того, чтобы запрашивать сообщение 9 вроде этого:
FETCH 9 (ENVELOPE)
Вместо этого нам нужно будет отправить следующую команду IMAP:
UID FETCH 7421 (ENVELOPE)
Curl, похоже, не имеет встроенной поддержки команд UID, но мы можем передавать пользовательские команды, используя параметр -X. Например, чтобы получить сообщение с UID 7421, мы должны запустить:
curl 'imaps://imap.example.com/inbox;uidvalidity=7' -X 'UID FETCH 7421 (ENVELOPE)'
Это будет утверждать, что почтовый ящик UIDVALIDITY все еще должен быть 7 (потому что, если он изменился, наш UID больше не действителен), и получить конверт сообщения.
Чтобы удалить это сообщение:
curl 'imaps://imap.example.com/inbox;uidvalidity=7' -X 'UID STORE 7421 +Flags \Deleted'
Большое спасибо! Это круто. Хотел бы я проголосовать за него, но у меня всего 4 балла. Есть ли аналогичный способ для POP3? Насколько мне известно, только некоторые расширения POP3 имеют поддержку UID.
Если это ответило на ваш вопрос, вы можете пометить ответ как «принятый», нажав на галочку слева от ответа. Насчет POP3 я не уверен.
Добро пожаловать в StackOverflow! Что ты пробовал? Большинство из нас здесь рады помочь вам улучшить свое мастерство, но менее довольны тем, что выступают в роли неоплачиваемого персонала по программированию. Просмотрите как спросить, покажите нам свою работу в MCVE, результат, которого вы ожидали, и результаты, которые вы получили, и мы поможем вам разобраться.