2016-11-09 61 views
0

我想通過curl(BashScript,使用curl)從IMAP服務器讀取電子郵件。IMAP不更新它的文件夾狀態

我的問題是:移動電子郵件後,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只會移動郵件,如果我通過webmailer檢查它,但不這樣做,如果我不檢查它。這應該是自動化的,所以,任何人都可以向我解釋,爲什麼會發生這種情況,我能做些什麼呢?

+0

你打電話過了嗎?在調用清除之前,郵件不會被刪除。 – Max

+0

謝謝!我會嘗試! –

+0

發送'EXPUNGE'命令?推測像-X就像你調用其他命令一樣。但是,在你完成之前不要調用它,因爲EXPUNGEing消息會導致所有的ID移動(當消息3被刪除時,消息4變爲3)。這就是它不會自動發生的原因。 – Max

回答

0

在有人發送EXPUNGE命令之前,郵件實際上不會被刪除。與此同時,他們只是被標記爲已刪除的消息。其他客戶端或網絡郵件系統已發送EXPUNGE,這就是爲什麼您會看到更改。

此行爲的原因是,當處理EXPUNGE時,消息序列號將發生變化:消息3從郵箱中刪除,消息4將變爲消息3,消息5變爲消息4,依此類推。它還允許用戶可能取消刪除郵件。

您可能會希望等到您完成所有消息移動操作後再打電話清除,這樣您的消息序列號不會在您不期望時發生改變。