用java收邮件- -
收邮件没问题了,缺点就是邮件太多的话,会等好长时间才出来,应用线程方式来收,否则看着象死机了,:),以后再说了
package com.IEthing.util;
import java.io.*;
import java.text.*;
import java.util.*;
import javax.mail.*;
import javax.mail.internet.*;
import javax.mail.*;
import javax.mail.internet.*;
import javax.activation.*;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.internet.MimeMessage;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.internet.MimeMessage;
/**
* @author David update by tegger
*
* TODO To change the template for this generated type comment go to Window -
* Preferences - Java - Code Style - Code Templates
*/
public class Pop3Bean {
private int mailCounter; //邮件计数
private int mailIndex; //邮件编号,即邮件在messages数组中的位置
private int mailDownErrorCounter; //正在下载邮件时,出错的计数器
private boolean[] recordFailure; //记录下载出错的邮件的序号
private int totalRetryTimes; //总共重试次数
private int retryTimeCounter; //记下重试的次数
private boolean otherError; //若是在邮件正式下载之前出错,则置该值为true
private String extension=".eml"; //文件扩展名
private Store store;
private Folder folder;
private Message[] messages;
private Message message;
private Part part;
private String emlName;
private String attachName;
private int allMessageCount;
private int messageCount;
private String dateformat; //默认的日前显示格式
// private String propFile = MailConstants.PROPS_FILE_NAME;//用这个接口类的好处是更改配置文件路径的时候不需要更改每个类
private String protocol="pop3"; //服务协议
private String mailHost; //服务器地址
private String userName; //用户名
private String password; //密码
private String saveAttachPath; //附件下载后的存放目录
private String saveEmlPath="E:\\test\\"; //保存eml文件的路径
public Pop3Bean() throws IOException
{
/* FileProperties fp = new FileProperties(propFile);
fp.load();
protocol = fp.getProperty(MailConstants.RECV_PROTO);
mailHost = fp.getProperty(MailConstants.RECV_HOST);
userName = fp.getProperty(MailConstants.RECV_USER);
password = fp.getProperty(MailConstants.RECV_PASS);
saveAttachPath = fp.getProperty(MailConstants.RECV_ATTACH);
saveEmlPath = fp.getProperty(MailConstants.RECV_ROOT);
dateformat = fp.getProperty("mail.receive.dtfmat");
extension = fp.getProperty("mail.receive.extension");
totalRetryTimes = Integer
.parseInt(fp.getProperty("mail.receive.retry"));*/
}
/**
* 设置邮件主机
*/
public void setMailHost(String mailHost)
{
this.mailHost = mailHost;
}
/**
* 获取邮件主机
*/
public String getMailHost()
{
return this.mailHost;
}
/**
* 设置邮件帐号
*/
public void setUserName(String userName)
{
this.userName = userName;
}
/**
* 获取邮件帐号
*/
public String getUserName()
{
return this.userName;
}
/**
* 设置邮件密码
*/
public void setPassword(String password)
{
this.password = password;
}
/**
* 设置Store
*/
public void setStore(Store store)
{
this.store = store;
}
/**
* 设置邮箱文件夹
*/
public void setFolder(Folder folder)
{
this.folder = folder;
}
/**
* 设置messages数组
*/
public void setMessages(Message[] messages)
{
this.messages = messages;
}
/**
* 设置message
*/
public void setMessage(Message message)
{
this.message = message;
}
public void setCurMessage(int i)
{
this.message = this.messages[i];
}
/**
* 获取message
*/
public Message getMessage()
{
return this.message;
}
/**
* 获取folder中的message数量
*
* @throws MessagingException
*/
public int getAllMessageCount() throws MessagingException
{
this.allMessageCount = folder.getMessageCount();
return allMessageCount;
}
/**
* 设置allMessageCount
*
* @throws MessagingException
*/
private void setAllMessageCount() throws MessagingException
{
this.allMessageCount = this.folder.getMessageCount();
}
/**
* 获取messages中message的数量
*
* @return
*/
public int getMessageCount()
{
this.messageCount = this.messages.length;
return messageCount;
}
/**
* 获得folder中新邮件的数量
*
* @return
* @throws MessagingException
*/
public int getNewMessageCount() throws MessagingException
{
return this.folder.getNewMessageCount();
}
/**
* 获得folder中未读邮件的数量
*
* @return
* @throws MessagingException
*/
public int getUnreadMessageCount() throws MessagingException
{
return this.folder.getUnreadMessageCount();
}
/**
* 获取Part
*/
public Part getPart()
{
return (Part) message;
}
/**
* 设置Part
*/
public void setPart(Part part)
{
this.part = part;
}
/**
* 设置附件存放路径
*/
public void setAttachPath(String attachPath)
{
this.saveAttachPath = attachPath;
}
/**
* 获得附件存放路径
*/
public String getAttachPath()
{
return saveAttachPath;
}
/**
* 设置eml存放路径
*/
public void setEmlPath(String emlPath)
{
this.saveEmlPath = emlPath;
}
/**
* 获得eml存放路径
*/
public String getEmlPath()
{
return saveEmlPath;
}
public void setEmlName(String emlName)
{
this.emlName = emlName;
}
public String getEmlName()
{
return emlName;
}
public void setAttachName(String attachName)
{
this.attachName = attachName;
}
public String getAttachName()
{
return attachName;
}
public void setExtension(String extension)
{
this.extension = extension;
}
public String getExtension()
{
return extension;
}
/**
* 设置日期显示格式
*/
public void setDateFormat(String format) throws Exception
{
this.dateformat = format;
}
/**
* 获取日期显示格式
*/
public String getDateFormat(String format) throws Exception
{
return this.dateformat;
}
/**
* 获得发件人的地址和姓名
*
* @throws Exception
*/
public String getFrom() throws Exception
{
return getFrom(this.message);
}
public String getFrom(Message mimeMessage) throws Exception
{
InternetAddress address[] = (InternetAddress[]) mimeMessage.getFrom();
String from = address[0].getAddress();
if (from == null)
from = "";
String personal = address[0].getPersonal();
if (personal == null)
personal = "";
String fromaddr = personal + "<" + from + ">";
return fromaddr;
}
/**
* 获得邮件的收件人,抄送,和密送的地址和姓名,根据所传递的参数的不同 * "to"----收件人 "cc"---抄送人地址
* "bcc"---密送人地址
*/
public String getTOAddress() throws Exception
{
return getMailAddress("TO", this.message);
}
public String getCCAddress() throws Exception
{
return getMailAddress("CC", this.message);
}
public String getBCCAddress() throws Exception
{
return getMailAddress("BCC", this.message);
}
public String getTOAddress(Message mimeMessage) throws Exception
{
return getMailAddress("TO", mimeMessage);
}
public String getCCAddress(Message mimeMessage) throws Exception
{
return getMailAddress("CC", mimeMessage);
}
public String getBCCAddress(Message mimeMessage) throws Exception
{
return getMailAddress("BCC", mimeMessage);
}
public String getMailAddress(String type) throws Exception
{
return getMailAddress(type, this.message);
}
public String getMailAddress(String type, Message mimeMessage) throws Exception
{
String mailaddr = "";
String addtype = type.toUpperCase();
InternetAddress[] address = null;
if (addtype.equals("TO") || addtype.equals("CC")
|| addtype.equals("BCC"))
{
if (addtype.equals("TO"))
{
address = (InternetAddress[]) mimeMessage
.getRecipients(Message.RecipientType.TO);
}
else if (addtype.equals("CC"))
{
address = (InternetAddress[]) mimeMessage
.getRecipients(Message.RecipientType.CC);
}
else
{
address = (InternetAddress[]) mimeMessage
.getRecipients(Message.RecipientType.BCC);
}
if (address != null)
{
for (int i = 0; i < address.length; i++)
{
String email = address[i].getAddress();
if (email == null)
email = "";
else
{
email = MimeUtility.decodeText(email);
}
String personal = address[i].getPersonal();
if (personal == null)
personal = "";
else
{
personal = MimeUtility.decodeText(personal);
}
String compositeto = personal + "<" + email + ">";
mailaddr += "," + compositeto;
}
mailaddr = mailaddr.substring(1);
}
}
else
{
throw new Exception("Error emailaddr type!");
}
return mailaddr;
}
/**
* 获得邮件主题
*/
public String getSubject() throws MessagingException
{
return getSubject(this.message);
}
public String getSubject(Message mimeMessage) throws MessagingException
{
String subject = "";
try
{
subject = MimeUtility.decodeText(mimeMessage.getSubject());
if (subject == null)
subject = "";
}
catch (Exception exce)
{
}
return subject;
}
/**
* 获得邮件发送日期
*/
public String getSentDate() throws Exception
{
return getSentDate(this.message);
}
public String getSentDate(Message mimeMessage) throws Exception
{
Date sentdate = mimeMessage.getSentDate();
SimpleDateFormat format = new SimpleDateFormat(dateformat);
return format.format(sentdate);
}
/**
* 判断此邮件是否需要回执,如果需要回执返回"true",否则返回"false"
*/
public boolean getReplySign() throws MessagingException
{
return getReplySign(this.message);
}
public boolean getReplySign(Message mimeMessage) throws MessagingException
{
boolean replysign = false;
String needreply[] = mimeMessage
.getHeader("Disposition-Notification-To");
if (needreply != null)
{
replysign = true;
}
return replysign;
}
/**
* 获得此邮件的Message-ID
*/
public String getMessageId() throws MessagingException
{
return getMessageId(this.message);
}
public String getMessageId(Message mimeMessage) throws MessagingException
{
return ( (MimeMessage) mimeMessage).getMessageID();
}
/**
* 初始化出错邮件数组
*
*/
private void setRecordFailure()
{
this.recordFailure = new boolean[getMessageCount()];
}
/**
* 返回出错数组
*
* @return
*/
public boolean[] getRecordFailure()
{
return this.recordFailure;
}
/**
* 判断此邮件是否已读,如果未读返回返回false,反之返回true
*/
public boolean isNew() throws MessagingException
{
return isNew(this.message);
}
/**
* 判断此邮件是否已读,如果未读返回返回false,反之返回true
*/
public boolean isNew(Message mimeMessage) throws MessagingException
{
boolean isnew = false;
Flags flags = mimeMessage.getFlags();
Flags.Flag[] flag = flags.getSystemFlags();
for (int i = 0; i < flag.length; i++)
{
if (flag[i] == Flags.Flag.SEEN)
{
isnew = true;
break;
}
}
return isnew;
}
/**
* 判断此邮件是否包含附件
*/
public boolean isContainAttach() throws Exception
{
return isContainAttach(this.part);
}
/**
* 判断此邮件是否包含附件
*/
public boolean isContainAttach(Part part) throws Exception
{
boolean attachflag = false;
String contentType = part.getContentType();
if (part.isMimeType("multipart/*"))
{
Multipart mp = (Multipart) part.getContent();
for (int i = 0; i < mp.getCount(); i++)
{
BodyPart mpart = mp.getBodyPart(i);
String disposition = mpart.getDisposition();
if ( (disposition != null)
&& ( (disposition.equals(Part.ATTACHMENT)) || (disposition
.equals(Part.INLINE))))
attachflag = true;
else if (mpart.isMimeType("multipart/*"))
{
attachflag = isContainAttach( (Part) mpart);
}
else
{
String contype = mpart.getContentType();
if (contype.toLowerCase().indexOf("application") != -1)
attachflag = true;
if (contype.toLowerCase().indexOf("name") != -1)
attachflag = true;
}
}
}
else if (part.isMimeType("message/rfc822"))
{
attachflag = isContainAttach( (Part) part.getContent());
}
return attachflag;
}
/**
* 连到server,创建folder对象,创建message对象
*/
public void getConn()
{
try
{
this.getStoreFromServer();
this.getFolderFromStore();
}
catch (Exception e)
{
otherError = true;
mailDownErrorCounter++;
System.out.print(e.getLocalizedMessage());
}
}
/**
* 建立Store连接
*/
private Store getStoreFromServer() throws Exception
{
//创建session
Session session = Session.getDefaultInstance(System.getProperties(),
null);
//session.setDebug(true);
//创建store,建立连接
Store store = session.getStore(protocol);
System.out.println("connecting");
store.connect(mailHost, userName, password);
System.out.println("connected successfully");
setStore(store);
return store;
}
/**
* 打开INBox文件夹
*/
private Folder getFolderFromStore()
{
//打开邮件相应文件夹
Folder getFolder;
try
{
getFolder = store.getFolder("INBOX");
getFolder.open(Folder.READ_ONLY);
setFolder(getFolder);
return getFolder;
}
catch (MessagingException e)
{
// TODO Auto-generated catch block
System.err.println("获取Folder失败!");
e.printStackTrace();
}
return null;
}
/**
* 从folder中提取所有的messages
*
* @throws MessagingException
*/
public void getAllMessages() throws MessagingException
{
//从邮件文件夹获取邮件信息
Message[] messages = folder.getMessages();
setMessages(messages);
setRecordFailure(); //初始化出错数组
// setMessageCount();
}
/**
* 获得messageNums数组指定的message
*
* @param messageNums
* @throws MessagingException
*/
public void getMessages(int[] messageNums) throws MessagingException
{
Message[] messages = folder.getMessages(messageNums);
setMessages(messages);
setRecordFailure(); //初始化出错数组
// setMessageCount();
}
/**
* 获得start和end之间的message
*
* @param start
* @param end
* @throws MessagingException
*/
public void getMessages(int start, int end) throws MessagingException
{
Message[] messages = folder.getMessages(start, end);
setMessages(messages);
setRecordFailure(); //初始化出错数组
// setMessageCount();
}
/**
* 关闭连接
*/
public void closeConnection()
{
try
{
messages = null;
message = null;
if (folder.isOpen())
folder.close(true);
store.close();
System.out.println("close");
}
catch (Exception e)
{
System.out.println("关闭和邮件服务器之间连接时出错!");
e.printStackTrace();
}
}
/**
* 获得当前邮件的基本方法 Pop3Bean内部应该调用这个方法 以便在调用函数中加入重试机制
*
* @throws MessagingException
* @throws MessagingException
*
*/
public void getMail() throws Throwable
{ //抛出异常,用以重掷
try
{
saveMessageAs(message);
parseMessage(message);
}
catch (IOException e)
{
// TODO Auto-generated catch block
System.err.println("保存邮件出错,检查保存路径");
throw new IOException("保存邮件出错,检查保存路径");
}
catch (MessagingException e)
{
// TODO Auto-generated catch block
System.err.println("邮件转换出错");
throw new MessagingException("邮件转换出错");
}
catch (Exception e)
{
System.err.println("未知错误");
otherError = true;
e.printStackTrace();
throw new Exception("未知错误");
}
}
/**
* 获得指定的邮件
*
* @param index
*/
public void getMail(int index)
{
mailDownErrorCounter = 0; //邮件下载出错计数器置零
try
{ //获取邮件下载之前的错误
setMessage(messages[index]); //设置当前message
System.out.println("正在获取第" + index + "封邮件. . .");
getMail(); //获取当前message
System.out.println("成功获取第" + index + "封邮件");
}
catch (Throwable e)
{ //获得重掷异常
recordFailure[index] = true;
mailDownErrorCounter++;
System.err.println("下载第" + index + "封邮件时出错");
retry();
}
}
/**
* 获取messages中的所有邮件
*/
public void getAllMail()
{
int mailArrayLength; //将要下载的邮件的数量。若是重试时,则为还未下载的邮件数量
mailArrayLength = getMessageCount();
System.out.println("一共有邮件" + mailArrayLength + "封");
mailDownErrorCounter = 0; //邮件下载出错计数器置零
mailCounter = 0;
for (int index = 0; index < mailArrayLength; index++)
{
try
{
setMessage(messages[index]); //设置当前message
System.out.println("正在获取第" + index + "封邮件. . .");
getMail(); //获取当前message
System.out.println("成功获取第" + index + "封邮件");
mailCounter++;
}
catch (Throwable e)
{
otherError = false;
recordFailure[index] = true;
mailDownErrorCounter++;
System.err.println("下载第" + index + "封邮件时出错");
}
}
System.out.println("成功下载" + mailCounter + "封邮件");
mailCounter = 0;
if (mailDownErrorCounter != 0)
retry();
}
/**
* 保存邮件源文件
*/
public void saveMessageAs(Message message)
{
String oriFileName;
String fileExtend;
try
{
oriFileName = getInfoBetweenBrackets(getMessageId(message)
.toString());
//设置文件后缀名。若是附件则设法取得其文件后缀名作为将要保存文件的后缀名,若是正文部分则用.htm做后缀名
String emlName = oriFileName;
String fileNameWidthExtension = getEmlPath() + oriFileName
+ getExtension();
File storeFile = new File(fileNameWidthExtension);
for (int i = 0; storeFile.exists(); i++)
{
emlName = oriFileName + i;
fileNameWidthExtension = getEmlPath() + emlName
+ getExtension();
storeFile = new File(fileNameWidthExtension);
}
setEmlName(emlName);
System.out.println("storefile's path: " + fileNameWidthExtension);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
message.writeTo(baos);
StringReader in = new StringReader(baos.toString());
saveFile(fileNameWidthExtension, in);
}
catch (MessagingException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/*
* 解析邮件
*/
public void parseMessage(Message message) throws IOException,
MessagingException
{
Object content = message.getContent();
if (content instanceof Multipart)
{
handleMultipart( (Multipart) content);
}
else
{
handlePart(message);
}
}
/*
* 解析Multipart
*/
public void handleMultipart(Multipart multipart) throws MessagingException,
IOException
{
for (int i = 0, n = multipart.getCount(); i < n; i++)
{
handlePart(multipart.getBodyPart(i));
}
}
/*
* 解析指定part,从中提取文件
*/
public void handlePart(Part part) throws MessagingException, IOException
{
String disposition = part.getDisposition(); // Find attachment
String contentType = part.getContentType();
String str;
InputStreamReader sbis = new InputStreamReader(part.getInputStream());
if (disposition == null)
{ // When just body
System.out.println("Null: " + contentType);
// Check if plain
if ( (contentType.length() >= 9)
&& (contentType.toLowerCase().substring(0, 9)
.equals("text/plai")))
{
System.out.println(getAttachPath() + getEmlName() + ".txt");
saveFile(getAttachPath() + getEmlName() + ".txt", sbis);
}
else if ( (contentType.length() >= 8) // Check if html
&& (contentType.toLowerCase().substring(0, 8)
.equals("text/htm")))
{
saveFile(getAttachPath() + getEmlName() + ".html", sbis);
}
else if ( (contentType.length() >= 9) // Check if html
&& (contentType.toLowerCase().substring(0, 9)
.equals("image/gif")))
{
saveFile(getAttachPath() + getEmlName() + ".gif", sbis);
}
else if ( (contentType.length() >= 10)
&& contentType.toLowerCase().substring(0, 10).equals(
"multipart/"))
{ // Check if multipart
System.out.println("multipart body: " + contentType);
Multipart mp = (Multipart) (part.getContent());
handleMultipart(mp);
}
else
{ // Unknown type
System.out.println("Other body: " + contentType);
saveFile(getAttachPath() + getEmlName() + ".txt", sbis);
}
}
else if (disposition.equalsIgnoreCase(Part.ATTACHMENT))
{
System.out.println("Attachment: " + part.getFileName() + " : "
+ contentType);
//outToFile.println("Attachment: " + part.getFileName() + " : "
// + contentType);
saveFile(getAttachPath() + part.getFileName(), sbis);
}
else if (disposition.equalsIgnoreCase(Part.INLINE))
{
System.out.println("Inline: " + part.getFileName() + " : "
+ contentType);
//outToFile.println("Inline: " + part.getFileName() + " : "
// + contentType);
saveFile(getAttachPath() + part.getFileName(), sbis);
}
else
{ // Should never happen
System.out.println("Other: " + disposition);
// outToFile.println("Other: " + disposition);
}
}
public void saveFile(String fileName, Reader input) throws IOException
{
if (fileName == null)
{
fileName = File.createTempFile(getAttachPath() + "xx", ".out")
.getName();
}
// Do no overwrite existing file
File file = new File(fileName);
int lastDot = fileName.lastIndexOf(".");
String extension = fileName.substring(lastDot);
String fullFileName = fileName;
fileName = fileName.substring(0, lastDot);
for (int i = 0; file.exists(); i++)
{
file = new File(fileName + i + extension);
}
FileWriter fos = new FileWriter(file);
BufferedWriter bos = new BufferedWriter(fos);
BufferedReader bis = new BufferedReader(input);
int aByte;
while ( (aByte = bis.read()) != -1)
{
bos.write(aByte);
}
bos.flush();
bos.close();
bis.close();
}
public void readEmlFile(String fileName) throws MessagingException
{
try
{
//TODO readEmlFile
InputStream fis = new FileInputStream(fileName);
Object emlObj = (Object) fis;
Session mailSession = Session.getDefaultInstance(System.getProperties(), null);
MimeMessage msg = new MimeMessage(mailSession, fis);
message = msg;
}
catch (FileNotFoundException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private String getInfoBetweenBrackets(String str) throws Exception
{
int i, j; //用于标识字符串中的"<"和">"的位置
if (str == null)
{
str = "error";
return str;
}
i = str.lastIndexOf("<");
j = str.lastIndexOf(">");
if (i != -1 && j != -1)
str = str.substring(i + 1, j);
return str;
}
//当有邮件无法下载时进行重试
private void retry()
{
mailCounter = 0;
while (retryTimeCounter < totalRetryTimes && mailDownErrorCounter != 0)
{
if (!store.isConnected() || !folder.isOpen())
{
System.err.println("与服务器连接断开,请重新连接");
closeConnection();
return;
}
System.out.println("第" + (retryTimeCounter + 1) + "次重试");
mailDownErrorCounter = 0; //邮件下载出错计数器置零
for (int index = 0; index < getMessageCount(); index++)
{
if (recordFailure[index])
{
try
{
setMessage(messages[index]); //设置当前message
System.out.println("正在获取第" + index + "封邮件. . .");
getMail(); //获取当前message
System.out.println("成功获取第" + index + "封邮件");
mailCounter++;
recordFailure[index] = false;
}
catch (Throwable e)
{
otherError = false;
recordFailure[index] = true;
mailDownErrorCounter++;
System.err.println("重新下载第" + index + "封邮件时出错");
}
}
}
retryTimeCounter++;
}
System.out.println("成功下载" + mailCounter + "封邮件");
mailCounter = 0; //将邮件计数置零
mailDownErrorCounter = 0; //下载错误数量归零
}
public static void main(String[] args) throws Throwable
{
try
{
Pop3Bean mail;
mail = new Pop3Bean();
mail.setUserName("abc");
mail.setMailHost("pop3.sohu.com");
mail.setPassword("***");
mail.setAttachPath("e:/test/");
mail.setExtension(".eml");
mail.setDateFormat("yyyydddd");
mail.getConn();
System.out.println("Count of messages in folder: " + mail.getAllMessageCount());
System.out.println("Count of new messages in folder: " + mail.getNewMessageCount());
System.out.println("Count of unread messages in folder: " + mail.getUnreadMessageCount());
mail.getAllMessages();
System.out.println("Count of loaded messages: " + mail.getMessageCount());
mail.getAllMail();
mail.setCurMessage(0);
System.out.println(mail.getSubject());
mail.closeConnection();
// ReadEml mail = new ReadEml("H:\\My_Soft_Works\\java\\jteam\\jmail\\received\\41C95D0F.008CD1.01099.eml");
}
catch (Exception e)
{
System.out.println("出现未预料的错误!");
e.printStackTrace();
}
}
}