Получение и удаление сообщения по IMAP с помощью cURL

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

Добро пожаловать в StackOverflow! Что ты пробовал? Большинство из нас здесь рады помочь вам улучшить свое мастерство, но менее довольны тем, что выступают в роли неоплачиваемого персонала по программированию. Просмотрите как спросить, покажите нам свою работу в MCVE, результат, которого вы ожидали, и результаты, которые вы получили, и мы поможем вам разобраться.

ghoti 22.03.2018 13:59

UID не меняются. MSN меняются. 1 - это MSN верхнего / нижнего / самого старого сообщения в почтовом ящике. Удаление одного сообщения не меняет UID другого.

arnt 22.03.2018 14:40

«1» не является UID. «1» - это просто номер сообщения. Если вы удалите сообщение 9, и появится новое сообщение, также будет сообщением 9.

larsks 22.03.2018 14:41
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
3
4 633
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Фактически, у вас есть гарантия того, что 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.

sonat 23.03.2018 14:52

Если это ответило на ваш вопрос, вы можете пометить ответ как «принятый», нажав на галочку слева от ответа. Насчет POP3 я не уверен.

larsks 23.03.2018 16:44

Другие вопросы по теме