一个javamail的老问题,已查阅论坛内其他帖子,暂无好方法

Great6661 2012-05-19 12:21:46
使用javamail以pop3、只读的方式收取邮件,而不留下任何痕迹。

目前遇到的问题如下:

程序在收取公司exchange邮箱里的邮件后,会将服务上的邮件标记为已读,这恰恰是不我希望的。


而在测试163邮箱的时候,同样的代码,却不会改变服务器上的邮件标记。


不知道是哪里出了问题,在线急等答案,问题解决后,速结贴!

最后附上部分源代码:

Session session = Session.getInstance(prop, null);
session.setDebug(false); // 是否启用debug模式
Folder folder = null;
Store store = null;
try {
store = session.getStore("pop3"); // 使用pop3会话机制,连接服务器
store.connect(pop3Server, port, loginName, password);
}
folder = store.getFolder("INBOX"); // 收件箱

folder.open(Folder.READ_ONLY);
// 得到收件箱文件夹信息,获取邮件列表
Message[] msgs = folder.getMessages();
int iemmalcount=0;

for (int i = 0; i < msgs.length; i++) {
if (isResumeEmail(resumeFromEmail, msgs[i]) && isNewEmail(lastSyncDateTime, msgs[i])) {
iemmalcount=iemmalcount+1;
resumesName = downLoadResumeByType(resumeType, msgs[i], resumesName, zipForderPath, htmlForderPath);
// 设置最后邮件时间
setLastMailDateTime(msgs[i]);

}
}

System.out.println("从上次:"+lastSyncDateTime+"到现在,共收到来自"+resumeFromEmail+"邮件"+iemmalcount+"封");

return resumesName;
} catch (Exception e) {
logger.error("网络故障或邮件配置错误,系统不能连接邮箱服务器!");
//logger.error("Network failure or mail configuration errors, the system can not connect to mail server.");
e.printStackTrace();
return null;
} finally {
// 释放资源
try {

if (folder != null) folder.close(false); //
if (store != null) store.close();
} catch (Exception bs) {
bs.printStackTrace();
}
}

...全文
99 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Great6661 2012-05-19
  • 打赏
  • 举报
回复
要想解决邮件阅读状态标记问题,应该从邮件协议入手,由于你们使用的是EXCHANGE服务器,若使用exchange协议阅读邮件然会修改邮件的状态标记。所以,你可以尝试采用POP3或IMAP方式进行邮件阅读。若你们的EXCHANGE服务器在外网也可以访问,为了让出差或在家也可以访问,一般都会开放POP3协议。你可以使用在线邮件系统检测工具 www.winwinsoft.com.cn/sy_bg.html,查一下系统是否开放了POP3服务。POP3方式阅读Exchange服务器上的邮件,不会修改邮件状态标记。具体操作为在outlook中添加一个邮件账号,接收邮件服务器的类型设置为POP3,填写其他账户信息和服务器信息,然后进行邮件接收即可。若系统启用了SSL,可以在账户设置中,进入高级勾选上“此服务器要求加密连接(ssl)”。若在内网也可能开发IMAP方式阅读邮件,基本操作与POP3雷同,IMAP是在线邮箱访问协议,读完邮件后,将状态修改为未读即可。试试吧,希望你能成功!
Great6661 2012-05-19
  • 打赏
  • 举报
回复
今天搜索到的一些有用的信息

在多次尝试和一些网友的讨论下终于对这一问题有了一点点心得,写出来为以后需要用到这个的兄弟行个方便。当然,有疏漏的地方请高手批示。
1.先说协议。pop3是不支持读取新邮件的,flag也只能用delete,只能自己手动实现。
2.想使用flag判断是否是新邮件,需要使用imap协议:Store store = session.getStore("imap");
3.folder需要读写,不知道read-only是不是也可以,没有验证,folder.open(Folder.READ_WRITE);
4.要注意一个陷阱!!!就是getMessage();

Message message[] = folder.getMessages(); //注意这里!
for(int i=0;i<message.length;i++){
System.out.println(message[i].getFlags().toString());
if(message[i].getFlags().toString().equals("javax.mail.Flags@10")){
String subject = message[i].getSubject();
System.out.println("new mail= "+subject+" "+i);
}

在第一行,如果你调用了getMessages(),在第二次运行程序时就不会出现新邮件!因为调用了getMessages(),它就把新邮件读成了旧邮件。
所以,第一次运行,输出的flag会有新的,结果是javax.mail.Flags@10,再次运行就全是0了
Great6661 2012-05-19
  • 打赏
  • 举报
回复
不太清楚,都是用pop连接,163的邮箱和exchange 邮箱怎么有有这种区别?
今天查了一天的资料,都不太理想。。
qybao 2012-05-19
  • 打赏
  • 举报
回复
会不会跟邮件服务器的设置有关系

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧