使用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;
}
}