清除 Java 邮件中已删除的电子邮件

Erase deleted Emails in Java Mail

我删除电子邮件的方法似乎有效,但是当我检查我的邮件客户端时,我发现邮件仍然存在。

@Async
public void deleteEmailAsync(Email email) {
    LOGGER.debug("Deleting email: " + email.getSubject());

    Properties properties = getServerProperties(this.protocol, this.host, this.port);
    Session session = Session.getDefaultInstance(properties);

    try {
        // connects to the message store
        Store store = session.getStore(protocol);
        store.connect(this.userName, this.password);

        // opens the inbox folder
        Folder folderInbox = store.getFolder("INBOX");
        folderInbox.open(Folder.READ_WRITE);

        // fetches new messages from server
        Message[] messages = folderInbox.getMessages();

        for (int i = 0; i < messages.length; i++) {
            Message msg = messages[i];
            Address[] fromAddress = msg.getFrom();
            if (fromAddress[0].toString().contains(email.getFrom()) 
                    && msg.getSubject().equals(email.getSubject()) ) {
                msg.setFlag(Flags.Flag.DELETED, true);
            }
        }

        // disconnect
        folderInbox.close(false);
        store.close();

    } catch (NoSuchProviderException e) {
        LOGGER.error("No provider for protocol: " + protocol + " " + e.getMessage());
    } catch (MessagingException e) {
        LOGGER.error("Could not connect to the message store " + e.getMessage());
    } 
}

现在我必须手动删除已删除的项目,否则下载 INBOX 每次都需要更长的时间。

如何清除已删除的消息?

您忘记关闭文件夹了!这应该可以正常工作。

@Async
public void deleteEmailAsync(Email email) {
    LOGGER.debug("Deleting email: " + email.getSubject());

    Properties properties = getServerProperties(this.protocol, this.host, this.port);
    Session session = Session.getDefaultInstance(properties);

    try {
        // connects to the message store
        Store store = session.getStore(protocol);
        store.connect(this.userName, this.password);

        // opens the inbox folder
        Folder folderInbox = store.getFolder("INBOX");
        folderInbox.open(Folder.READ_WRITE);

        // fetches new messages from server
        Message[] messages = folderInbox.getMessages();

        for (int i = 0; i < messages.length; i++) {
            Message msg = messages[i];
            Address[] fromAddress = msg.getFrom();
            if (fromAddress[0].toString().contains(email.getFrom()) 
                    && msg.getSubject().equals(email.getSubject()) ) {
                msg.setFlag(Flags.Flag.DELETED, true);
            }
        }

        // disconnect
        folderInbox.close(true);
        store.close();

    } catch (NoSuchProviderException e) {
        LOGGER.error("No provider for protocol: " + protocol + " " + e.getMessage());
    } catch (MessagingException e) {
        LOGGER.error("Could not connect to the message store " + e.getMessage());
    } 
}