使用 cURL 通过 IMAP 获取和删除消息
Fetching and deleting a message over IMAP using cURL
我想使用 curl 通过 IMAP 获取和删除顶部消息(UID=1)。我可以在多个命令中执行此操作,但是当我发送删除命令时,我无法保证 uid 没有更改。有没有办法在 curl 中保留 imap(或 pop3)会话?
你实际上做保证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
您可以通过将 -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'
我想使用 curl 通过 IMAP 获取和删除顶部消息(UID=1)。我可以在多个命令中执行此操作,但是当我发送删除命令时,我无法保证 uid 没有更改。有没有办法在 curl 中保留 imap(或 pop3)会话?
你实际上做保证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
您可以通过将 -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'