从pop3folder.getuid 为空 UID信息始终是空的问题,怎么解决

看原来的链接被封了,还是自己发布下比较好。
最近在做邮件提醒系统,无论是pop3还是imap都没有一个好的方法只接收新邮件&
我们只能拿到邮件列表后自几判断,大多是通过邮件的UID进行判断&
注意UID与MessageID并非一个东西,UID是邮箱用来标识你这个账户的每一封邮件的东西,而MessageID是发送邮件的时候生成的唯一ID,也有可能发送没有你的接收邮箱自己生成,或者是javamail生成的,总是取messageid需要下载邮件的头,这样有联网操作会很慢的,所以我们只需要存储下来uid就好了,记得保存的时候按照邮箱存储,因为不同的邮箱uid会重复的,至于规律最好别去参考有增的就有减的,所以还是安心的遍历吧,反正很快&
拷贝我刚写的部分代码作为参考&
Store store = session.getStore(type);&
store.connect(host, port, email, password);&
(“login email:{} server:”, emailAccountBean.toString(),&
serverBean.toString());&
Folder folder = store.getFolder(“INBOX”);&
folder.open(Folder.READ_ONLY);&
if (folder instanceof POP3Folder) {&
POP3Folder inbox = (POP3Folder)&
Message[] messages = inbox.getMessages();&
for (int i = 0; i & messages. i++) {&
MimeMessage mimeMessage = (MimeMessage) messages[i];&
String uid = inbox.getUID(mimeMessage);&
if (!emailUidDB.get(userSession.getUserId(), uid)) {&
receive(mimeMessage, uid);&
} else if (folder instanceof IMAPFolder) {&
IMAPFolder inbox = (IMAPFolder)&
Message[] messages = inbox.getMessages();&
for (int i = 0; i & messages. i++) {&
MimeMessage mimeMessage = (MimeMessage) messages[i];&
String uid = Long.toString(inbox.getUID(mimeMessage));&
if (!emailUidDB.get(userSession.getUserId(), uid)) {&
receive(mimeMessage, uid);&
logger.error(“no have this folder {}”, folder);&
emailAccountBean.setTime(System.currentTimeMillis());&
} finally {&
folder.close(false);&
store.close();&
大家注意这个方法&
String uid = inbox.getUID(mimeMessage);&
要先强制转换&
IMAPFolder inbox = (IMAPFolder)&
POP3Folder inbox = (POP3Folder)&
是哪个自己判断就好了,这样取的UID是不需要下载每一封邮件的这样速度很高,即使是几千封邮件也很快完成&
千万不要用mimeMessage.getMessageID();这个方法,这个方法会去下载邮件头,是一个很耗时的过程&
不推荐验完首封邮件和尾封邮件就跳出循环的方法,因为遇到过新邮件夹在中间的时候&
今天的发现& 之前都是这么写&
final Properties props = new Properties();&
if (ssl) {&
.addProvider(new com.sun.net.ssl.internal.ssl.Provider());&
props.setProperty(“mail.imap.socketFactory.class”, SSL_FACTORY);&
props.setProperty(“mail.imap.socketFactory.fallback”, “false”);&
props.setProperty(“mail.pop3.socketFactory.class”, SSL_FACTORY);&
props.setProperty(“mail.pop3.socketFactory.fallback”, “false”);&
Session session = Session.getDefaultInstance(props, null);&
现在发现这样写不对,其实加密是不需要特殊处理的,只需要把& type换成pop3s和imaps就可以了,还有就是session如果不带有用户和服务器信息,全程序公用一个就可以了&
就这样生成一个公用的就可以了&
private final Session session = Session.getDefaultInstance(System.getProperties());&
而且之前那样写用default拿session每次都拿到同一个新传入的props也会失效的,所以之前犯了大错误 呵呵&
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/dongmeng110/archive//5254042.aspx&
本文已收录于以下专栏:
相关文章推荐
介绍一下JavaMail的Message
它对应JavaMail的Message对象,一个Message对象又会有多个子对象如MultiPart对象,更特殊的是整个邮件内容为一个大的 MultiPa...
在多次尝试和一些网友的讨论下终于对这一问题有了一点点心得,写出来为以后需要用到这个的兄弟行个方便。当然,有疏漏的地方请高手批示。 
1.先说协议。pop3是不支持读取新邮件的,flag也只能用del...
网络绝对是任何系统的核心,对于容器而言也是如此。Docker 作为目前最火的轻量级容器技术,有很多令人称道的功能,如 Docker 的镜像管理。然而,Docker的网络一直以来都比较薄弱,所以我们有必要深入了解Docker的网络知识,以满足更高的网络需求。
JavaMail 如何只处理新邮件 这个应该可以实现的,部分邮件服务器是可以提供一个标识来判断是不是未读,但是部分邮件服务器不支持。 主流邮件服务器类型:CoreMail  , NetEase Fla...
JavaMail Pop获取邮件 主要步骤如下: 设置服务器,设置登录名,设置密码 获取连接 获取所有的信息Message 根据自己需要信息获取Email 工具类如下:  import com.sun...
JavaMail API中定义了一个javax.mail.Store类,它用于执行邮件接收任务,这个类的实例对象封装了某种邮件接收协议的底层实施细节,应用程序调用这个类中的方法就可以获得用户邮箱中的各...
[html] view
javamailpop3imap  
使用javaMail收邮件主要有两种协议,一种是pop3,一种是imap。这两种协议都可以用来收邮件,但...
看原来的链接被封了,还是自己发布下比较好。
最近在做邮件提醒系统,无论是pop3还是imap都没有一个好的方法只接收新邮件 
我们只能拿到邮件列表后自几判断,大多是通过邮件的UID进行判断 
...
source:http://www.blogjava.net/fengliangjun/archive//5740.html
import java.util.Pr...
import java.util.P
import javax.mail.A
import javax.mail.F
import java...
1、简单、直观、强悍。直接上代码
package com.gstd.
import java.io.*;
import java.text.*;
import java...
他的最新文章
讲师:王渊命
讲师:蔡栋
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
您的访问请求被拒绝 403 Forbidden - ITeye技术社区
您的访问请求被拒绝
亲爱的会员,您的IP地址所在网段被ITeye拒绝服务,这可能是以下两种情况导致:
一、您所在的网段内有网络爬虫大量抓取ITeye网页,为保证其他人流畅的访问ITeye,该网段被ITeye拒绝
二、您通过某个代理服务器访问ITeye网站,该代理服务器被网络爬虫利用,大量抓取ITeye网页
请您点击按钮解除封锁&对POP3邮箱中的新邮件的判断方法
由于pop3协议不支持对已读未读邮件的标记,因此,要判断一封pop邮箱中的邮件是否是新邮件必须与邮件客户端联合起来才能做到。其原理是,每个服务器都会给每封邮件产生一个唯一的uid,客户端把读到的uid与本地保存的uid比较,如果本地没有这个uid,则这封邮件是新的,否则就是旧邮件。一般的邮件客户端,如
outlook express、foxmail等,都是用这种方法实现的。大约步骤如下:
客户端读取邮箱里所有邮件的 uid 列表(通过命令 UIDL 可以查看);
把uid列表与本地保存的uid列表相比较;
如果本地已存在,则比较下一个邮件uid;
如果本地不存在此uid,则下载此邮件,并保存此邮件的uid在本地;
大致的java代码实现如下:
Java代码 &
URLName&url&=&new&URLName("pop3",&host,&port,&"",&user,&password);
Session&session&=&Session.getInstance(System.getProperties(),null);
Store&store&=&session.getStore(url);
POP3Folder&inbox&=&null;
&&&&&&&store.connect();
&&&&&&&inbox&=&(POP3Folder)&store.getFolder("INBOX");
&&&&&&&inbox.open(Folder.READ_ONLY);
&&&&&&&FetchProfile&profile&=&new&FetchProfile();&
&&&&&&&profile.add(UIDFolder.FetchProfileItem.UID);&
&&&&&&&Message[]&messages&=&inbox.getMessages();
&&&&&&&inbox.fetch(messages,&profile);
&&&&&&&for&(int&i&=&0;&i&&&messages.&i++)&
&&&&&&&&&&&&&&System.out.println(inbox.getUID(messages[i]));&
}&finally&{
&&&&&&&try{
&&&&&&&&&&&&&&inbox.close(false);
&&&&&&&}catch(Exception&e){}
&&&&&&&try{
&&&&&&&&&&&&&&store.close();
&&&&&&&}catch(Exception&e){}
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。}

我要回帖

更多关于 no output folder 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信