【问题标题】:Fetching and deleting a message over IMAP using cURL使用 cURL 通过 IMAP 获取和删除消息
【发布时间】:2018-03-22 21:42:09
【问题描述】:

我想使用 curl 通过 IMAP 获取和删除顶部消息(UID=1)。我可以在多个命令中执行此操作,但是当我发送删除命令时,我无法保证 uid 没有更改。有没有办法在 curl 中持久化 imap(或 pop3)会话?

【问题讨论】:

  • 欢迎来到 StackOverflow!你试过什么?我们这里的大多数人都很乐意帮助你提高你的手艺,但作为短期无偿编程人员不太乐意。查看how-to-ask,在MCVE 中向我们展示您迄今为止的工作、您期望的结果和您得到的结果,我们将帮助您解决问题。
  • UID 不会改变。 MSN 发生变化。 1 是邮箱中顶部/底部/最旧消息的 MSN。删除一条消息不会更改另一条消息的 UID。
  • '1' 不是 UID。 '1' 只是一个消息编号。如果您删除了第 9 条消息,然后又有新消息进来,那是第 9 条消息。

标签: bash curl imap


【解决方案1】:

您实际上确实保证了 UID 没有改变:这就是 IMAP UIDVALIDITY 字段的全部意义所在。只要邮箱的UIDVALIDITY 值没有更改,您拥有的任何邮件 UID 都将继续指向同一邮件。阅读更多详细信息in the IMAP RFC

使用 curl,您可以通过在 IMAP URL 中包含 UIDVALIDITY 值来断言请求中的值,如下所示:

curl 'imaps://imap.example.com/inbox;UIDVALIDITY=6' ...

如果UIDVALIDITY 发生变化,curl 将报告:

curl: (78) Mailbox UIDVALIDITY has changed

您可以通过将-v 选项传递给curl 来查看邮箱的UIDVALIDITY 值,例如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。
猜你喜欢
  • 2019-03-31
  • 2015-10-03
  • 2016-10-13
  • 2011-12-29
  • 2022-06-11
  • 2011-03-11
  • 1970-01-01
  • 2014-05-16
  • 1970-01-01
相关资源
最近更新 更多