使用javamail收取邮件的代码及相关问题

寒冬 2006-07-17 10:44:49

这是我用javamail写了个邮件收取程序,可以收取邮件.

但是存在几个问题:
(1)收取邮件过多,附近过大时,容易出现内存溢出,和nullpointexception?
(2)由最后一封邮件时间判断,最新邮件这个方法也不可取,我最近看到一篇文章说用 inbox.hasNewMessage() 判断,我还没试过.
(3)邮件过多过大时,接收时间也很长,用户如果等待不了,执行了别的操作,强制中断邮件收取,有可能会出现不可预知的问题.


我想对这个程序再完善一下,不知大家有什么好的建议?

大家如果有好的 webmail开源系统也可以介绍一下?

附,源码

package struts.action.mail;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import java.util.Date;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.beanutils.RowSetDynaClass;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

import struts.form.mail.MailForm;
import Tools.*;

import Mail.mail;

import javax.mail.*;
import javax.mail.internet.*;
import javax.mail.search.ComparisonTerm;
import javax.mail.search.SearchTerm;
import javax.mail.search.SentDateTerm;

public class MailAction extends Action {

// --------------------------------------------------------- Instance
// Variables

protected mail op = null;

private Store store = null;

private Folder inbox = null;
private Helper h = null;
private RowSetDynaClass rsdc=null;
// --------------------------------------------------------- Methods


public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
{
String forward = "true";

try {

MailForm newsForm = (MailForm) form;
op = new mail();
String actor = newsForm.getActor();
int textid = newsForm.getTextid();

h = (Helper) request.getSession().getAttribute("helper");

if(actor==null)actor="";
//读取结果集
if (actor.equals("look")) {

//listRs(request);
forward = "true";

}else if (actor.equals("add")) {

//获得当前邮件系统的用户名,用户密码,邮件主机

String[] mailMessage=op.getMailMessageById(h.getUserId());

String name = mailMessage[0];
String password = mailMessage[1];
String host =mailMessage[2];

if(name!=null&&password!=null&&host!=null){

// 打开邮箱
if(openMail(name, password, host)){

//把新邮件添加到数据库中
addMail(request,inbox);

}

}


mailMessage=null;
}

} catch (Exception e) {

Tools.setlog("MailAction-------"+e.toString());
} finally {

listRs(request);
forward = "true";
if(op!=null){
op.conclose();
op=null;
}
//h = null;
}

return mapping.findForward(forward);
}


/**
* 打开邮箱
*
* @param name
* @param password
* @param host
*/

public boolean openMail(String name, String password, String host) {
try {

//获得一个session对象,并设置其调试属性为true
Properties props = System.getProperties();
Session foldersession = Session.getDefaultInstance(props, null);
//foldersession.setDebug(false);

//根据从login.html中得到的用户名密码,和邮件主机连接到该主机
//URLName urln = new URLName("pop3://" + name + ":" + password + "@"
// + host + "/");

store=foldersession.getStore("pop3");
store.connect(host,name,password);

//打开收件箱
inbox = store.getFolder("INBOX");
inbox.open(Folder.READ_ONLY);

} catch (Exception e) {

//closeMail();
Tools.setlog("-----openMail-------"+e.toString());

return false;
}


return true;

}

/**
* 关闭邮箱和到服务器的连接
*/
public void closeMail() {

try {
//关闭邮箱和到服务器的连接
if(inbox!=null)
{
inbox.close(true); inbox=null;
}

if(store!=null)
{
store.close(); store=null;
}
} catch (MessagingException e) {
Tools.setlog("------44444------"+e.toString());
}

}

/**
* 把新邮件添加到数据库中
*/
public void addMail(HttpServletRequest request, Folder inbox) {
try {

if(op==null)op = new mail();
//获取最后收取的一封邮件时间.
SearchTerm st = new SentDateTerm(ComparisonTerm.GT,op.getMaxMailTime(h.getUserId()));

//只接受该时间最后的邮件
Message[] message = inbox.search(st);
int count = message.length;

for (int i = 0; i < count; i++) {

if (!message[i].isSet(Flags.Flag.DELETED)) {

//添加邮件的发件人,主题
int id=mailAdd(message[i]);

//判断类型
if(message[i].isMimeType("text/plain")){

//添加邮件内容,向数据库里添加接受的数据
id=op.mailUpdate(Integer.parseInt(h.getUserId()),id,message[i].getContent().toString());

}else if(message[i].isMimeType("multipart/*")){

//添加邮件内容和附件
mailImageAdd(message[i],id);

}

}
message[i]=null;
}
message=null;
st=null;
if(count>0)
{
op.updateMaxMailTime(h.getUserId());
}

} catch (Exception e) {
Tools.setlog("==========="+e.toString());
}

}

/**
* 获得发件人地址
* 2004-12-3 sjz
* @param message
* @return
*/
public String getFrom(Message message){

try{
StringBuffer from =new StringBuffer();

Address[] addresses =message.getFrom();
if(addresses!=null){
for(int i=0;i<addresses.length;i++){
from.append(MimeUtility.decodeText(Tools.toCNString(addresses[i].toString())+" "));
}
}else{
from.append("无");
}
addresses=null;
return from.toString();

}catch(Exception e){

return "无";
}

}
/**
* 添加普通 邮件到数据库中 不带内容
* @param message
* @return
*/
//sun.misc.BASE64Encoder enc = new sun.misc.BASE64Encoder();
public int mailAdd(Message message){
try{

int id=op.mailAdd(Integer.parseInt(h.getUserId()),h.getRealName(),getFrom(message),message.getSubject(),h.getRealName(),Tools.formatDateString(message.getSentDate()));

return id;
}catch(Exception e){
return -1;
}

}

/**
* 添加带附件的邮件到 数据库中
* @param message
* @return
*/
public int mailImageAdd(Message message ,int id){
try{

Multipart multipart=(Multipart) message.getContent();
int iiii=0;

for(int i=0;i<multipart.getCount();i++){
Part p=multipart.getBodyPart(i);


//得到每个部分的类型
String disposition=p.getDisposition();
//如果是附件,输出该附件的下载连接
if((disposition!=null)&&(disposition.equals(Part.ATTACHMENT)||disposition.equals(Part.INLINE) ) ){

String filename= MimeUtility.decodeText(Tools.toCNString(p.getFileName()));

//向数据库里添加附件内容
int ii=op.mailImageAdd(id,Integer.parseInt(h.getUserId()),filename.trim().replaceAll(" ",""),p.getInputStream());

filename=null;
}else if (disposition==null){

// 向数据库里添加邮件内容
int iii=op.mailUpdate(Integer.parseInt(h.getUserId()),id,p.getContent().toString());

}

p=null;disposition=null;
}
multipart=null;


}catch(Exception e){

Tools.setlog("mailImageAdd"+e.toString());return 1;
}
return 1;
}

}



...全文
582 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
ricxie 2006-08-11
  • 打赏
  • 举报
回复
楼主对加密文件和签名文件是怎么处理的,看代码好像这样的邮件就看不到内容了
e3002 2006-08-09
  • 打赏
  • 举报
回复
问问该如何判断是新邮件啊?还有已读和未读邮件?
寒冬 2006-07-20
  • 打赏
  • 举报
回复
我们做的,是往数据库里写的,我这次才改成生成文件试试
sheep219 2006-07-20
  • 打赏
  • 举报
回复
我们把一些小的信息放到数据库,比如主题,发件人等,但大的东西就直接放到文件里。
寒冬 2006-07-19
  • 打赏
  • 举报
回复
楼上的,可不可以说说你们的思路?
我的些问题,在当时做的时候也没发现.是后来在应用时才出现的.
寒冬 2006-07-18
  • 打赏
  • 举报
回复
谢谢,其实我要做的就是一个类似于foxmail这样的邮件客户端,不是做邮件服务器,而问题就出现在大数量和大体积的邮件的下载上
sheep219 2006-07-18
  • 打赏
  • 举报
回复
我们也做一个邮件管理客服端,不过目前还没有碰到你碰到的问题
jobs002 2006-07-17
  • 打赏
  • 举报
回复
关注一下
寒冬 2006-07-17
  • 打赏
  • 举报
回复
呵呵,谢谢捧场,我也好久没上了,希望和大家一起交流一下
kevinliuu 2006-07-17
  • 打赏
  • 举报
回复
占个坑
infowain 2006-07-17
  • 打赏
  • 举报
回复
QMail
TinyJimmy 2006-07-17
  • 打赏
  • 举报
回复
sign, 如果发几个个几十M的邮件, 服务器不完蛋了? 都花在下载邮件上了
nimeide1234567890 2006-07-17
  • 打赏
  • 举报
回复
ding
ranranhu 2006-07-17
  • 打赏
  • 举报
回复
关注
寒冬 2006-07-17
  • 打赏
  • 举报
回复
我就是先从邮件服务器上读下来,存入本地数据库的,用户浏览的邮件信息,其实都是从本地数据库中读取的。但是,在插入数据库这个过程中,经常会出现问题,就像我上面说的。
sheep219 2006-07-17
  • 打赏
  • 举报
回复
有个想法,LZ的操作都是及时的操作,可不可以先写一个服务把所以的邮件内容包括附件都读取先放入到一个物理内存中(比如数据库),当用户操作邮件的时候只是对数据库的操作。

81,092

社区成员

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

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