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