【问题标题】:How to delete email permanently in Gmail using Java mail (POP3 Client & IMAP)如何使用 Java 邮件(POP3 客户端和 IMAP)在 Gmail 中永久删除电子邮件
【发布时间】:2017-11-13 20:07:01
【问题描述】:

我一直在使用 java 邮件(POP3 客户端和 IMAP)来自动化 Gmail 操作。其中一项操作是删除邮件,我使用以下代码 -

public void deleteInboxMasseges() throws IOException, MessagingException
{
    store = getConnection(EMAIL_USERNAME, EMAIL_PASSWORD);
        if (store != null)
        {
            int inboxMassegeCount = inbox.getMessageCount();
            Message[] messages = inbox.getMessages();
            for (int i = 0; i < inboxMassegeCount; i++)
            {
                messages[i].setFlag(Flags.Flag.DELETED, true);
            }
            inbox.expunge();
        }
    }

邮件已从“收件箱”中删除,但在“所有邮件”中可用,但不在“垃圾箱”文件夹中。我想永久删除它。是否有任何直接的方法可以永久删除邮件,而不是从“收件箱”中删除邮件?

【问题讨论】:

    标签: java jakarta-mail imap pop3


    【解决方案1】:

    按照这些步骤使用 JavaMail api 从 Gmail 中永久删除邮件

    1. 连接到商店
    2. 以读/写模式打开文件夹收件箱。
    3. 以读/写模式打开文件夹。
    4. 从收件箱中获取消息。
    5. 将邮件从收件箱复制到垃圾箱。
    6. 将所有消息的标志设置为已删除。
    7. 删除文件夹。
    8. 关闭商店

      def deleteMessages(String userName, String password) {
      
            Properties properties = new Properties();
      
            String host = "imap.gmail.com";
            String port = "993";
            String mailStoreType = "pop3";
      
            // server setting
            properties.put("mail.imap.host", host);
            properties.put("mail.imap.port", port);
      
            // SSL setting
            properties.setProperty("mail.imap.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
            properties.setProperty("mail.imap.socketFactory.fallback", "false");
            properties.setProperty("mail.imap.socketFactory.port", String.valueOf(port));
      
            Session session = Session.getDefaultInstance(properties);
      
            try {
                // connects to the message store
                Store store = session.getStore("imap");
                store.connect(userName, password);
      
                // opens the inbox folder
                Folder folderInbox = store.getFolder("INBOX");
                folderInbox.open(Folder.READ_WRITE);
      
                //opens the trash folder
                Folder folderBin = store.getFolder("[Gmail]/Bin");
                folderBin.open(Folder.READ_WRITE);
      
                // fetches new messages from server
                Message[] arrayMessages = folderInbox.getMessages();
      
                //Copy messages from inbox to Trash
                folderInbox.copyMessages(arrayMessages, folderBin)
      
                arrayMessages = folderBin.getMessages();
      
                for (int i = 0; i < arrayMessages.length; i++) {
                       Message message = arrayMessages[i];
                       String subject = message.getSubject();
                       message.setFlag(Flags.Flag.DELETED, true);
      
                }
      
                // expunges the folder to remove messages which are marked deleted
                boolean expunge = true;
                folderBin.close(expunge);
                folderInbox.close(expunge);
      
                // disconnect
                store.close();
            } catch (NoSuchProviderException ex) {
      
                System.out.println("No provider.");
                ex.printStackTrace();
            } catch (FolderNotFoundException ex) {
      
                System.out.println("Folder Not Found")
                ex.printStackTrace();
            } catch (MessagingException ex) {
      
                 System.out.println("Could not connect to the message store.");
                 ex.printStackTrace();
            }
      }
      

    【讨论】:

      【解决方案2】:

      很遗憾,这是一个多步骤的过程,需要使用 IMAP 而非 POP 来完成。要从 GMail 中永久删除某些内容,您似乎需要将其移至垃圾箱,然后将其从垃圾箱中删除。它支持 MOVE 扩展,所以这还不错。您还必须发现 Trash 文件夹名称,可能使用 LIST,因为它已本地化。

      a001 UID MOVE xxx "[Gmail]/Trash"
      * OK [MOVEUID xxxxxxx yyy] Message moved
      a002 SELECT "[Gmail]/Trash"
      a003 UID STORE yyy +FLAGS (\Deleted)
      a004 UID EXPUNGE yyy
      

      那它就真的没了。

      对于大多数用户而言,将其移至回收站就足够了。它稍后会自行消失。

      【讨论】:

      • @Max 感谢您的 cmets。我们根据您的输入进行了尝试,它对我来说工作正常。下面是我们尝试的场景 1. 首先我们将邮件从 Inbox 移动到 Trash 文件夹,2. 将邮件从 All mail 移动到 Trash 最后我们从 Trash 文件夹中删除了邮件。现在它工作正常。
      • @Max 你能分享一下代码 sn-p 吗?我似乎在做你描述的事情......但我的消息留在垃圾箱中。
      【解决方案3】:

      您可能会在您的 Gmail 帐户设置中解决此问题。

      Gmail 在设置 页面、转发和 POP/IMP 选项卡中有以下选项:

      当邮件被标记为已删除并从最后一个可见的 IMAP 文件夹中清除时:

      • 存档消息(默认)
      • 将邮件移至垃圾箱
      • 立即永久删除邮件

      尝试在您的帐户中设置最后一个选项(立即永久删除该消息)并再次运行您的代码。

      祝你好运。

      【讨论】:

      • 根据我的经验,尽管措辞如此,该设置实际上并没有改变任何东西。
      • @Danilo 感谢您的宝贵建议,我试过了,但它不起作用。
      猜你喜欢
      • 2019-08-26
      • 2017-02-02
      • 1970-01-01
      • 2023-03-17
      • 2021-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多