package com.sand.utils; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.Map; import java.util.Set; import javax.mail.Folder; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.Multipart; import javax.mail.Part; import javax.mail.Session; import javax.mail.Store; import org.apache.commons.io.FileUtils; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.time.DateUtils; import org.apache.log4j.Logger; import com.sand.enums.OS; import com.sand.enums.Project; public class MailHelper { /** 存放邮件的文件夹 */ public static final Map<OS, File> OS_BASE_DIR = new HashMap<OS, File>(); static { OS_BASE_DIR.put(OS.WINDOWS, new File("D://mails")); OS_BASE_DIR.put(OS.LINUX, new File("/home/ripa/mails")); OS_BASE_DIR.put(OS.AIX, new File("/home/ripa/mails")); } /** 日志 */ private Logger log = Logger.getLogger(getClass()); private String smtp; private String email; private String password; private Session session; private Store store; private Folder folder; /** * 构造方法 */ public MailHelper() { }; /** * 构造方法 * * @param smtp * @param email * @param password */ public MailHelper(String smtp, String email, String password) { this.smtp = smtp; this.email = email; this.password = password; session = getSession(); }; /** * 得到Session * * @return */ private Session getSession() { return Session.getInstance(System.getProperties(), null); } /*** * 得到邮件序列 * * @return * @throws Exception */ public Message[] getMessages() throws Exception { store = session.getStore("pop3"); store.connect(smtp, email, password); folder = store.getFolder("INBOX"); // 定义成读写 folder.open(Folder.READ_ONLY);// 还可以定义成其他类型 return folder.getMessages(); } /* * 关闭Store和Folder */ public void close() { if (folder != null) { try { folder.close(false); } catch (MessagingException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if (store != null) { try { store.close(); } catch (MessagingException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } /** * 处理附件 * * @param path * @param multipart * @throws MessagingException * @throws IOException */ public void handleMultipart(String path, Multipart multipart) throws MessagingException, IOException { for (int i = 0, n = multipart.getCount(); i < n; i++) { // 具体处理 handlePart(path, multipart.getBodyPart(i)); } } /** * 处理附件 附件的getDisposition如果返回 Part.ATTACHMENT和Part.INLINE则保存 * * @param path * @param part * --BodyPart类实现的接口类 * @throws MessagingException * @throws IOException */ public void handlePart(String path, Part part) throws MessagingException, IOException { String disposition = part.getDisposition();// 部署类型 String contentType = part.getContentType();// 类型字段O if (disposition == null) { log.info("Null:" + contentType); if ((contentType.length() >= 10) && (contentType.toLowerCase().substring(0, 10) .equals("text/plain"))) { part.writeTo(System.out); } else { log.info("Other body:" + contentType); part.writeTo(System.out); } } else if (disposition.equalsIgnoreCase(Part.ATTACHMENT)) { log.info("Attachment:" + part.getFileName() + ":" + contentType); saveFile(path, part.getFileName(), part.getInputStream()); } else if (disposition.equalsIgnoreCase(Part.INLINE)) { log.info("Inline:" + part.getFileName() + ":" + contentType); saveFile(path, part.getFileName(), part.getInputStream()); } else { log.info("Other:" + disposition); } } /** * 下载文件到指定目录 * * @param path指定目录 * @param filename文件名 * @param input输入流 * @throws IOException */ public void saveFile(String path, String filename, InputStream input) throws IOException { if (filename == null) { log.debug("no attachment"); System.out.println("no attachment"); } File file = new File(path + File.separator + filename); for (int i = 1; file.exists(); i++) {// 如果已经存在相同文件名的 file = new File(path + File.separator + filename + i); } FileOutputStream fos = new FileOutputStream(file); BufferedOutputStream bos = new BufferedOutputStream(fos); BufferedInputStream bis = new BufferedInputStream(input); int bit; while ((bit = bis.read()) != -1) { bos.write(bit);// 写入 } bos.flush(); bos.close(); bis.close(); } /** * 获取存放上传数据文件的目录[${BASE_DIR}/${Project}/${yyyyMMdd}//] yyyyMMdd为邮件主题的后6位 * * @return * @throws IOException */ public File getDataDir(String date) throws Exception { // 获取当前操作系统的名称 String osname = System.getProperty("os.name").trim(); if (StringUtils.isNotBlank(osname)) { File baseDir = OS_BASE_DIR.get(OS.instance(osname)); if (baseDir != null && baseDir.exists()) { // 存在 // 拼装目录路径 StringBuilder dirName = new StringBuilder(); dirName.append(Project.SHANGHAI_BOC).append(File.separator) .append("上海交行直联").append("20").append(date); File dataDir = new File(baseDir, dirName.toString()); // 如果目录不存在,则强制创建一个 if (!dataDir.exists()) { FileUtils.forceMkdir(dataDir); } return dataDir; } else { throw new IOException("BaseDir[" + baseDir + "] not exists!"); } } else { throw new IOException("Unknown OS!"); } } /** * 下载交易数据到不同的文件夹,并且将文件夹传递过来 * * @return * @throws Exception */ public Set<String> downlodMail() throws Exception { Set<String> s = new HashSet<String>(); Message[] msgs = getMessages(); for (int i = 0; i < msgs.length; i++) { log.info((i + 1) + ":" + msgs.length); // System.out.println((i + 1) + ":" + msgs.length); Date sendDate = msgs[i].getSentDate(); Date today = new Date(); if (DateUtils.isSameDay(today, sendDate)) {// 如果发送日期是当天的邮件,就收取,否则就不收取 String filename = msgs[i].getSubject(); String date = filename.substring(filename.length() - 6, filename.length()); String path = getDataDir(date).getAbsolutePath(); s.add(path); Object content = msgs[i].getContent(); log.debug("mail Subject:" + msgs[i].getSubject()); if (content instanceof Multipart) { // System.out.println((i + 1) + ":" + msgs.length); handleMultipart(path, (Multipart) content); } } } close(); return s; } public static void main(String[] args) throws Exception { MailHelper mh = new MailHelper("mail.***.com.cn", "data.shbocm@***com.cn", "123456"); Set<String> s = mh.downlodMail(); for (Iterator<String> it = s.iterator(); it.hasNext();) { System.out.println(it.next()); } } }