使用cURL通过IMAP获取和删除消息

时间:2018-03-22 12:47:11

标签: bash curl imap

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

1 个答案:

答案 0 :(得分:5)

你实际上保证UID没有改变:这就是IMAP UIDVALIDITY字段的全部内容。只要邮箱的UIDVALIDITY值未更改,您拥有的任何邮件UID将继续指向同一邮件。更详细地了解这一点in the IMAP RFC

使用curl,您可以在请求中声明UIDVALIDITY值,方法是将其包含在IMAP URL中,如下所示:

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'