IMAP不会更新其文件夹状态

时间:2016-11-09 17:04:01

标签: curl imap

我想用curl(BashScript,使用curl)从IMAP-Server读取电子邮件。

我的问题是:移动电子邮件后,IMAP服务器不会更新,因此,如果我检查收件箱,IMAP服务器会向我显示包含在INBOX中的旧邮件数量。

要清除我的问题,这里有一些例子 - 代码:

function delete_mail_id() {
     curl --insecure \
          --url "${SERVER}/INBOX" \
          --user "${USER}:${PASSWD}" \
          -X "STORE ${1} +Flags \Deleted" 1>/dev/null 2>/dev/null
}
function copy_mail_id_to() {
    curl --insecure \
         --url "${SERVER}/INBOX;UID=${1}" \
         --user "${USER}:${PASSWD}" \
         -X "COPY ${1} INBOX/${2}" 1>/dev/null 2>/dev/null
}
function move_mail_id_to() {
    copy_mail_id_to "${1}" "${2}"
    delete_mail_id "${1}"
}
function wait_for_mail_move(){
    TEMP=$( tempfile )
    while true; do
        fetch_first_mail > $TEMP
        if [ "$( grep 'Message-ID:' $TEMP )" != "${1}" ]; then
            break
        else
            sleep 1
        fi
    done
    rm $TEMP
}

现在移动电子邮件后,我等待邮件移动,但似乎是一个无限循环。现在有趣的部分:如果我通过我的webmailer手动查看邮件,循环结束,邮件逐个移动(我有一个循环,所以所有的邮件应该在其他文件夹中排序)。

如果我通过网络邮件程序检查它,IMAP只会移动邮件,但如果我不检查它,则不会这样做。这应该是自动化的,所以,任何人都可以向我解释,为什么会发生这种情况以及我能做些什么呢?

1 个答案:

答案 0 :(得分:0)

在有人发送EXPUNGE命令之前,消息实际上不会删除。同时,它们只是标记为已删除的消息。其他客户端或网络邮件系统已发送EXPUNGE,这就是您看到更改的原因。

此行为的原因是处理EXPUNGE时邮件序列号将更改:当邮件从邮箱中删除时,邮件4将变为邮件3,邮件5将变为邮件4,并且等等。它还允许用户可能取消删除邮件。

您可能希望等到完成所有邮件移动操作,然后调用expunge,这样您的邮件序列号就不会发生变化。