java收_用java收邮件

用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 + "";

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 + "";

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();

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值