Javamail无法获取所有邮件。

3

我正在使用以下配置:

mail.pop3.ssl.enable "true"
mail.pop3s.socketFactory.class "javax.net.ssl.SSLSocketFactory" 
mail.pop3s.socketFactory.fallback "false" 
mail.pop3s.port "995"
mail.pop3s.socketFactory.port "995"
username "...@hotmail.com"
password "..."
host "pop3.live.com"

这些属性是在一个xml文件中定义的,并由应用程序加载到一个Properties对象中。
以下是获取我的电子邮件的getter方法:
public Message[] getMessages()
{
    // init variables
    Folder folder = null;
    Store store = null;
    Session session = null;

    // setup session
    try {
        session = Session.getInstance(props,
        new javax.mail.Authenticator() {
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(username, password);
            }
        });
        String protocol = host.contains("imap") ? "imaps" : "pop3";
        store = session.getStore(protocol);       
        store.connect(host, username, password);            
    } catch (NoSuchProviderException ex) {
        Logger.getLogger(Fetcher.class.getName()).log(Level.SEVERE, null, ex);
    } catch (MessagingException ex) {
        Logger.getLogger(Fetcher.class.getName()).log(Level.SEVERE, null, ex);
    }

    // read folder          
    try {
        folder = store.getFolder("INBOX");
    } catch (MessagingException ex) {
        Logger.getLogger(Fetcher.class.getName()).log(Level.SEVERE, null, ex);
    }
    try {
         if(!folder.isOpen())
            folder.open(Folder.READ_ONLY);
    } catch (MessagingException ex) {
        Logger.getLogger(Fetcher.class.getName()).log(Level.SEVERE, null, ex);
    }

     // get messages
    try {                       
        return folder.getMessages();
    } catch (MessagingException ex) {
        Logger.getLogger(Fetcher.class.getName()).log(Level.SEVERE, null, ex);
    }

    // default
    return new Message[]{};
}

这段代码可以运行,能够返回我的邮件。但出现了一些问题,它不能返回我最近的邮件。然而,它总是从同一个时间点开始返回邮件(换句话说,它总是跳过同样的邮件,因此这种行为是确定的)。这些邮件都在我的收件箱中(不在垃圾邮件中),它们是各种各样的,没有任何特殊之处。
出了什么问题?
更新(调试输出到第一条消息):
DEBUG: setDebug: JavaMail version 1.4.5
DEBUG: getProvider() returning  javax.mail.Provider[STORE,pop3s,com.sun.mail.pop3.POP3SSLStore,Sun Microsystems, Inc]
DEBUG POP3: mail.pop3s.rsetbeforequit: false
DEBUG POP3: mail.pop3s.disabletop: false
DEBUG POP3: mail.pop3s.forgettopheaders: false
DEBUG POP3: mail.pop3s.cachewriteto: false
DEBUG POP3: mail.pop3s.filecache.enable: false
DEBUG POP3: mail.pop3s.keepmessagecontent: false
DEBUG POP3: mail.pop3s.starttls.enable: false
DEBUG POP3: mail.pop3s.starttls.required: false
DEBUG POP3: mail.pop3s.apop.enable: false
DEBUG POP3: mail.pop3s.disablecapa: false
DEBUG POP3: connecting to host "pop3.live.com", port 995, isSSL true
S: +OK DUB006-POP396 POP3 server ready
C: CAPA
S: -ERR unrecognized command
DEBUG POP3: authentication command trace suppressed
DEBUG POP3: authentication command succeeded
C: STAT
S: +OK 2256 257829688

C: NOOP
S: +OK
C: TOP 1 0
S: +OK

1
小精灵?说真的,如果代码只检索到了一些电子邮件而不是全部,那么为了帮助您,我们需要查看网络流量跟踪以确定它为什么无法正确地与服务器交互。您应该从那里开始,可能使用WireShark来捕获流量并查看实际发生的情况。 - Jim Garrison
也许这是一个已知的问题。也许有一些配置只获取缓存的电子邮件,而不是实际进行完整的检索?我不知道。因此提出了这个问题。但我怀疑小精灵们是否参与其中。我认为他们更喜欢银行业务而不是电子邮件。 - Joris Schellekens
1
您可以通过修复所有这些常见的JavaMail错误来简化您的代码和配置。 (请注意,所有“mail.pop3s.*”属性都被忽略,因为您正在使用“pop3”协议,而不是“pop3s”协议。)然后,打开JavaMail会话调试,并在此处发布输出。 Gmail有一些控制哪些消息返回pop3的设置,也许live.com有类似的设置?您是否使用imap获得相同的结果? - Bill Shannon
1
Imap 返回的结果恐怕是一样的。 - Joris Schellekens
据我所记,javamail 不会获取位于服务器上的非标准目录/类别中的电子邮件。尝试找到已获取和未获取电子邮件之间的关系。 - deathangel908
1个回答

0

我曾经遇到过与MS Exchange邮箱相同的问题。这只是一个猜测,但我认为当使用“现代”电子邮件提供商时,这可能是一个非常普遍的问题。

在我的情况下,原因是消息线程(“对话视图”): 不知何故,folder.getMessages()获取收件箱中会话数量而不是消息数量,并在该数字之后结束。 如果您的收件箱中有10封邮件,但其中3封邮件被分组成一次对话,则只会收到前8封邮件(7封邮件加1次对话)。

对我来说,解决方案很简单:

  • 在电子邮件提供商的网页界面中关闭收件箱文件夹中的对话视图
  • 以另一种方式迭代所有邮件,避免使用 .getMessages():

    for (int i = 1; i < folder.getMessageCount()+1; i++) {
        Message m = folder.getMessage(i);
        ...
    }
    

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接