2015-04-08 69 views
1

其實我想刪除通過郵件唯一ID的郵件(我用ActiveUp.Net.Mail.Pop3Client)C#的POP3 DeleteMessage可以不刪除電子郵件

爲此我使用下面的代碼:

private void DeleteMessageByUID (string uid , Pop3Client popClient) 
{ 
    for (int i = 1; i <= popClient.MessageCount; i++) 
    { 
      Header email = popClient.RetrieveHeaderObject(i); 

      if (email.MessageId == uid) 
      { 
       popClient.DeleteMessage(i); 
       break; 
      } 
    } 

    popClient.Disconnect(); 
} 

但從我刪除所有郵件(最初郵件從郵箱中消失)開始大約兩個小時後,我將能夠找回它們(使用與以前刪除的郵件相同的UID)。

我不確定問題的原因是否在我的程序中,我猜是郵箱的配置錯誤,但在與系統管理員聯繫之前,我肯定會這樣做。

+0

代碼很好。我會向管理員查詢您的電子郵件保留政策。也許你不能刪除這些消息,它們必須保留在服務器上。 – ApolloSoftware

回答

1

POP3的工作方式是由DeleteMessage()方法發送的DELE命令實際上並未刪除該消息,它所做的只是在POP3客戶端使用QUIT命令斷開連接時將其標記爲將來刪除。

我不知道ActiveUp的POP3客戶端是如何工作的,但如果你調用client.Disconnect (true);礦(MailKit)將只發送QUIT命令(true是不幹的說法)。

此外,FWIW,Message-Id標題與唯一標識不同。請小心使用它作爲以任何獨特方式識別消息的機制,因爲消息ID不一定是唯一的,也不是識別消息的安全方式。以這種方式使用消息ID的客戶端可能面臨DoS攻擊,黑客可以向您發送一封具有相同Message-Id的電子郵件,並強制您將其映射到錯誤的消息。

+0

我檢查了ActiveUp的斷開連接是如何實現的,看起來並沒有採用任何參數,並總是發回「退出」命令到Pop3服務器(以字符串形式返回服務器響應)。 另一個問題,我不明白的是關於Message-Id的問題,你能給我一個鏈接在哪裏解釋這種情況? 在此先感謝您的幫助。 – Skary

+0

如果您發送的電子郵件消息的ID爲'X',並且我作爲破壞者想要破壞您的消息,則可以使用相同的消息ID發送另一條消息。如果收件人的客戶假定您的郵件與我的郵件重複(我的郵件首先到達),因爲它具有相同的郵件ID,則收件人永遠不會看到您的郵件。 – jstedfast

+0

現在感謝問題清楚,這不是我的情況。 我正在開發一個用於自動郵件交換的簡單工具,但它可以在私人網絡和「可信」方之間工作。 再次感謝您的澄清。 – Skary