45fan.com - 路饭网

搜索: 您的位置主页 > 电脑频道 > 电脑教程 > 阅读资讯:通过javamail收mail的方法

通过javamail收mail的方法

2016-09-06 08:30:38 来源:www.45fan.com 【

通过javamail收mail的方法

java文件为
pop3Bean.java (连接邮件服务器、解析邮件内容、下载邮件)
MailConstants.java(协议、服务器名称、用户名、密码、附件下载目录、邮件下载目录,重新连接次数等)
Pop3BeanTest.java(测试接收邮件)
package javaMails.good;

import java.io.*;
import java.text.*;
import java.util.*;
import javax.mail.*;
import javax.mail.internet.*;

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; //文件扩展名

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; //服务协议

private String mailHost; //服务器地址

private String userName; //用户名

private String password; //密码

private String saveAttachPath; //附件下载后的存放目录

private String saveEmlPath;//保存eml文件的路径

public Pop3Bean() throws IOException {
// jacky modify
protocol = MailConstants.RECV_PROTO;
mailHost = MailConstants.RECV_HOST;
userName = MailConstants.RECV_USER;
password = MailConstants.RECV_PASS;
saveAttachPath = MailConstants.RECV_ATTACH;
saveEmlPath = MailConstants.RECV_ROOT;
dateformat = MailConstants.MAIL_REC_DFFORMT;
extension = MailConstants.MAIL_REC_EXTENSION;
totalRetryTimes = MailConstants.MAIL_REC_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;
}

/**
* 获取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++;
}
}

/**
* 建立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_WRITE);
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 Message[] getAllMessages() throws MessagingException {
//从邮件文件夹获取邮件信息
Message[] messages = folder.getMessages();
setMessages(messages);
setRecordFailure();//初始化出错数组
// setMessageCount();
return messages;
}

/**
* 获得messageNums数组指定的message
*
* @param messageNums
* @throws MessagingException
*/
public Message[] getMessages(int[] messageNums) throws MessagingException {
Message[] messages = folder.getMessages(messageNums);
setMessages(messages);
setRecordFailure();//初始化出错数组
// setMessageCount();
return messages;
}

/**
* 获得start和end之间的message
*
* @param start
* @param end
* @throws MessagingException
*/
public Message[] getMessages(int start, int end) throws MessagingException {
Message[] messages = folder.getMessages(start, end);
setMessages(messages);
setRecordFailure();//初始化出错数组
// setMessageCount();
return messages;
}

/**
* 关闭连接
*/
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+1) + "封邮件. . .");
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) {
System.out.println("parseMessage....多附档部分");
handleMultipart((Multipart) content);
} else {
System.out.println("parseMessage....单附档部分");
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 {
System.out.println("解析part开始.......... handlePart");
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("part部署disposition 为 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 gif
&& (contentType.toLowerCase().substring(0, 9)
.equals("image/gif"))) {
saveFile(getAttachPath() + getEmlName() + ".gif", part.getInputStream());
}else if ((contentType.length() >= 9) // Check if jpeg
&& (contentType.toLowerCase().substring(0, 9)
.equals("image/jpe"))) {
saveFile(getAttachPath() + getEmlName() + ".jpg", part.getInputStream());
}
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(Part.ATTACHMENT+".. Attachment: " + part.getFileName() + " : "
+ contentType);
//outToFile.println("Attachment: " + part.getFileName() + " : "
// + contentType);
saveFile(getAttachPath() + part.getFileName(), part.getInputStream());
} else if (disposition.equalsIgnoreCase(Part.INLINE)) {
System.out.println(Part.INLINE+".. 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(".");
System.out.println("文件名称为: "+fileName+">>后缀。位置为: "+lastDot);
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();
}

private void saveFile(String fileName, InputStream in) throws IOException
{
//String temp=part.getFileName();//得到未经处理的附件名字
//temp= MimeUtility.decodeWord(temp);
// String s=temp.substring(11,temp.indexOf("?=")-1);//去到header和footer

//文件名一般都经过了base64编码,下面是解码
// String fileName=this.base64Decoder(temp);
System.out.println("有附件:"+fileName);

FileOutputStream writer=new FileOutputStream(new File(fileName));
byte[] content=new byte[255];
int read=0;
while((read=in.read(content))!=-1)
{
writer.write(content);
}
writer.close();
in.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+1) + "封邮件");
mailCounter++;
recordFailure[index] = false;
} catch (Throwable e) {
otherError = false;
recordFailure[index] = true;
mailDownErrorCounter++;
System.err.println("重新下载第" + index + "封邮件时出错");
}
}
}
retryTimeCounter++;
}
System.out.println("成功下载" + mail


本文地址:http://www.45fan.com/dnjc/73099.html
Tags: Java Mail Javamail
编辑:路饭网
关于我们 | 联系我们 | 友情链接 | 网站地图 | Sitemap | App | 返回顶部