浏览 3025 次
锁定老帖子 主题:javamail收取信件
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-02-25
最后修改:2009-02-25
懒得存数据库了,就写文件了. 另没有解决multipart中只取text/html或者text/plain的问题. 长时间潜水,第一次在je发表东西,自己纪念下. package com.hcycom.lan.test; import java.io.BufferedReader; import java.io.File; import java.io.FileOutputStream; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashSet; import java.util.Properties; import javax.mail.Address; import javax.mail.BodyPart; import javax.mail.Folder; import javax.mail.MessagingException; import javax.mail.Multipart; import javax.mail.NoSuchProviderException; import javax.mail.Part; import javax.mail.Session; import javax.mail.Store; import javax.mail.Message.RecipientType; import javax.mail.event.StoreEvent; import javax.mail.event.StoreListener; import javax.mail.internet.ContentType; import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; import javax.mail.internet.MimeUtility; import javax.mail.internet.ParseException; import com.sun.mail.pop3.POP3Folder; public class ShowMail { private static final String D_MAIL = "D:/mail/"; private static final String BR = "\n"; public static String replaceGB2312ToGBK(String source) { if (source == null) { return null; } if (source.toLowerCase().indexOf("?gb2312?") != -1) { source = source.replaceAll("\\?[gG][bB]2312\\?", "?gbk?"); } return source; } /** * @param args */ public static void main(String[] args) { new ShowMail().show(); } private void show() { Properties prop = System.getProperties(); Session session = Session.getDefaultInstance(prop); try { Store store = session.getStore("pop3"); store.addStoreListener(new StoreListener() { public void notification(StoreEvent e) { switch (e.getMessageType()) { case StoreEvent.ALERT: System.out.println("alert : " + e.getMessage()); break; case StoreEvent.NOTICE: System.out.println("notice : " + e.getMessage()); break; } } }); store.connect("pop.163.com", "i2534", "password"); if (store.isConnected()) { POP3Folder inbox = (POP3Folder) store.getFolder("INBOX"); if (inbox.exists()) { inbox.open(Folder.READ_ONLY); File dir = new File(D_MAIL); if (!dir.exists()) { dir.mkdirs(); } File uids = new File(dir, "uids"); HashSet set = new HashSet(); HashSet newUids = new HashSet(); if (uids.exists()) { BufferedReader br = new BufferedReader(new FileReader( uids)); String line = null; while ((line = br.readLine()) != null) { set.add(line); } br.close(); } int nCount = inbox.getMessageCount(); System.out.println("Inbox contains " + nCount + " messages."); for (int i = 1; i <= nCount; i++) { System.out.println("now accept " + i); MimeMessage msg = (MimeMessage) inbox.getMessage(i); String uid = inbox.getUID(msg); if (set.contains(uid)) { System.out .println("this message is already exists.skip to next."); continue; } File mail = File.createTempFile(new SimpleDateFormat( "yyyyMMdd_").format(new Date()), ".mail", dir); FileWriter fw = new FileWriter(mail, true); newUids.add(uid); fw.write("UID : " + uid); fw.write(BR); String subject = msg.getHeader("Subject", null); fw .write("Subject : " + MimeUtility .decodeText(replaceGB2312ToGBK(subject))); fw.write(BR); fw.write("Send Date : " + new SimpleDateFormat("yyyy-MM-dd HH:mm") .format(msg.getSentDate())); fw.write(BR); fw.write("From : "); dumpAddresses(msg.getFrom(), fw); fw.write(BR); fw.write("To : "); dumpAddresses(msg.getRecipients(RecipientType.TO), fw); fw.write(BR); fw.write("CC : "); dumpAddresses(msg.getRecipients(RecipientType.CC), fw); fw.write(BR); fw.write("Content type : " + msg.getContentType()); fw.write(BR); parts(msg, fw); fw.flush(); fw.close(); System.out.println("accept over."); } if (!newUids.isEmpty()) { FileWriter fw = new FileWriter(uids, true); for (String s : newUids) { fw.write(s); fw.write(BR); } fw.flush(); fw.close(); } } inbox.close(false); } store.close(); } catch (NoSuchProviderException e) { e.printStackTrace(); } catch (MessagingException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } private void dumpAddresses(Address[] addresses, FileWriter fw) throws UnsupportedEncodingException, IOException { if (addresses == null || fw == null) { return; } for (Address address : addresses) { fw.write(MimeUtility.decodeText(replaceGB2312ToGBK(address .toString()))); fw.write(";"); } } private static void parts(Part part, FileWriter fw) { if (part == null || fw == null) { return; } try { Object content = part.getContent(); if (content instanceof Multipart) { MimeMultipart mmp = (MimeMultipart) content; for (int index = 0; index < mmp.getCount(); index++) { parts(mmp.getBodyPart(index), fw); } } else if (content instanceof InputStream) { MimeBodyPart mbp = (MimeBodyPart) part; String contentType = mbp.getContentType(); String name = getFileName(contentType); fw.write("File name : " + name); String cid = null; if ((cid = mbp.getContentID()) != null) { fw.write(" (cid : " + cid + ")"); } String disposition = null; if ((disposition = mbp.getDisposition()) != null) { fw.write(" (disposition : " + disposition + ")"); } fw.write(BR); File file = new File(D_MAIL + name); FileOutputStream fos = new FileOutputStream(file); InputStream is = (InputStream) content; int i = -1; while ((i = is.read()) != -1) { fos.write(i); } fos.flush(); fos.close(); } else if (content instanceof String) { fw.write("----------- part begin -------------"); fw.write(BR); if (part instanceof BodyPart) { MimeBodyPart mbp = (MimeBodyPart) part; String contentType = mbp.getContentType(); String language = getCharset(contentType); String encoding = mbp.getEncoding(); fw.write("Content type : " + contentType); fw.write(BR); if (encoding != null) { fw.write("Encoding : " + encoding); fw.write(BR); } if (mbp.getRawInputStream() != null && encoding != null) { InputStream is = MimeUtility.decode(mbp .getRawInputStream(), encoding); InputStreamReader isr = new InputStreamReader(is, language); BufferedReader br = new BufferedReader(isr); String line = null; StringBuilder sb = new StringBuilder(); while ((line = br.readLine()) != null) { sb.append(line).append(BR); } fw.write(sb.toString()); fw.write(BR); } } else { fw.write((String) content); fw.write(BR); } fw.write("----------- part end -------------"); fw.write(BR); } } catch (MessagingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } private static String getCharset(String contentType) { String language = null; try { ContentType ct = new ContentType(contentType); language = ct.getParameter("charset"); } catch (ParseException e) { e.printStackTrace(); } if (language == null) { language = MimeUtility.getDefaultJavaCharset(); } if (language.equalsIgnoreCase("gb2312")) { language = "gbk"; } return language; } private static String getFileName(String contentType) { String name = null; try { ContentType ct = new ContentType(contentType); name = ct.getParameter("name"); } catch (ParseException e1) { e1.printStackTrace(); } if (name == null) { name = new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date()); } try { name = MimeUtility.decodeText(replaceGB2312ToGBK(name)); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return name; } } 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |