Javamail 收郵件

NO IMAGE

最近看了不少資料 寫了 javamail 使用IMAP收發郵件,使用IMAP 而不用POP3 具體好處就不多少了,看程式碼吧。這個是用EJB實現的,不想用EJB的 直接去掉標註就好了

對各種內容格式都有處理,不過對於html中附帶圖片之類的嵌入資源沒做處理。有需要的請補充,哪寫的不好請拍磚。

 

  1. /**
  2.  * 
  3.  */
  4. package com.tsts.oa.service.impl;
  5. import java.util.ArrayList;
  6. import java.util.HashMap;
  7. import java.util.List;
  8. import java.util.Properties;
  9. import javax.ejb.Remote;
  10. import javax.ejb.Stateful;
  11. import javax.mail.Address;
  12. import javax.mail.BodyPart;
  13. import javax.mail.Flags;
  14. import javax.mail.Folder;
  15. import javax.mail.Message;
  16. import javax.mail.Multipart;
  17. import javax.mail.Session;
  18. import javax.mail.Store;
  19. import javax.mail.URLName;
  20. import javax.mail.internet.InternetAddress;
  21. import com.tsts.oa.bean.AttachmentInfo;
  22. import com.tsts.oa.bean.Email;
  23. import com.tsts.oa.service.EmailService;
  24. /**
  25.  * @author sunyanan
  26.  * 
  27.  */
  28. @Stateful
  29. @Remote(EmailService.class)
  30. public class EmailServiceBean implements EmailService {
  31.     private Session session;
  32.     private Store store;
  33.     private Folder folder;
  34.     public List<Email> getEmailList(String userName, String password,
  35.             String folderName) throws Exception {
  36.         login(userName, password, folderName);
  37.         Message[] messages = folder.getMessages();
  38.         List<Email> emails = new ArrayList<Email>(messages.length);
  39.         for (int i = 0; i < messages.length; i ) {
  40.             Message message = messages[i];
  41.             Email email = new Email();
  42.             email.setHasSeen(message.isSet(Flags.Flag.SEEN));
  43.             email.setMsgNum(message.getMessageNumber());
  44.             email.setReceiveDate(message.getReceivedDate());
  45.             email.setSenderAddress(formatAddresses(message.getFrom()));
  46.             email.setSubject(message.getSubject());
  47.             email.setSize(message.getSize());
  48.             emails.add(email);
  49.         }
  50.         logout();
  51.         return emails;
  52.     }
  53.     public Email findEmailByNum(String userName, String password,
  54.             String folderName, int msgNum) throws Exception {
  55.         login(userName, password, folderName);
  56.         Email email = null;
  57.         
  58.         Message message = folder.getMessage(msgNum);
  59.         if (message != null) {
  60.             //message.setFlag(Flags.Flag.SEEN, true);
  61.             email = new Email();
  62.             email.setHasSeen(message.isSet(Flags.Flag.SEEN));
  63.             email.setMsgNum(message.getMessageNumber());
  64.             email.setReceiveDate(message.getReceivedDate());
  65.             email.setSenderAddress(formatAddresses(message.getFrom()));
  66.             email.setSubject(message.getSubject());
  67.             email.setSize(message.getSize());
  68.             email.setContent(getContent(message));
  69.             email.setAttachments(getAttachmentInfo(message));
  70.         }
  71.         logout();
  72.         return email;
  73.     }
  74.     public byte[] getAttachment(String userName, String password,
  75.             String folderName, int msgNum, int attchmentId) throws Exception {
  76.         login(userName, password, folderName);
  77.         
  78.         byte[] is = null;
  79.         Message message = folder.getMessage(msgNum);
  80.         Multipart part = (Multipart) message.getContent();
  81.         
  82.         if(part.getCount() >= attchmentId ){
  83.             is = new byte[part.getBodyPart(attchmentId).getSize()];
  84.             part.getBodyPart(attchmentId).getInputStream().read(is);
  85.         }
  86.         
  87.         logout();
  88.         return is;
  89.     }
  90.     /**
  91.      * 得到message的主題內容
  92.      * 
  93.      * @param message
  94.      * @return
  95.      */
  96.     private String getContent(Message message) throws Exception {
  97.         StringBuffer str = new StringBuffer();
  98.         // 純文字
  99.         if (message.isMimeType(“text/plain”))
  100.             str.append(message.getContent().toString());
  101.         // 不帶附件的html內容
  102.         if (message.isMimeType(“multipart/alternative”)) {
  103.             Multipart part = (Multipart) message.getContent();
  104.             str.append(part.getBodyPart(1).getContent().toString());
  105.         }
  106.         // 不帶附件但是內嵌資源的html內容郵件
  107.         if (message.isMimeType(“multipart/related”)) {
  108.             Multipart part = (Multipart) message.getContent();
  109.             Multipart cpart = (Multipart) part.getBodyPart(0).getContent();
  110.             str.append(cpart.getBodyPart(1).getContent().toString());
  111.         }
  112.         // 帶附件的郵件內容
  113.         if (message.isMimeType(“multipart/mixed”)) {
  114.             Multipart part = (Multipart) message.getContent();
  115.             // 純文字
  116.             if (part.getBodyPart(0).isMimeType(“text/plain”)) {
  117.                 str.append(part.getBodyPart(0).getContent());
  118.             }
  119.             // html
  120.             if (part.getBodyPart(0).isMimeType(“multipart/alternative”)) {
  121.                 Multipart cpart = (Multipart) part.getBodyPart(0).getContent();
  122.                 str.append(cpart.getBodyPart(1).getContent());
  123.             }
  124.         }
  125.         return str.toString();
  126.     }
  127.     private HashMap<String, AttachmentInfo> getAttachmentInfo(Message message) throws Exception {
  128.         if (message.isMimeType(“multipart/mixed”)) {
  129.             Multipart part = (Multipart) message.getContent();
  130.             int count = part.getCount();
  131.             HashMap<String, AttachmentInfo> map = new HashMap<String, AttachmentInfo>();
  132.             for (int i = 1; i < count;  i) {
  133.                 BodyPart bpart = part.getBodyPart(i);
  134.                 AttachmentInfo a = new AttachmentInfo();
  135.                 a.setContentType(bpart.getContentType());
  136.                 a.setFileName(bpart.getFileName());
  137.                 a.setSize(bpart.getSize());
  138.                 map.put(String.valueOf(i), a);
  139.             }
  140.             return map;
  141.         }
  142.         return null;
  143.     }
  144.     /**
  145.      * 登入郵箱
  146.      * 
  147.      * @param userName
  148.      *            使用者名稱
  149.      * @param password
  150.      *            密碼
  151.      * @param folderName
  152.      *            登入的郵箱資料夾名字
  153.      * @throws Exception
  154.      */
  155.     private void login(String userName, String password, String folderName)
  156.             throws Exception {
  157.         Properties props = new Properties();
  158.         props.put(“mail.smtp.host”, “mail.tsts168.com”);
  159.         props.put(“mail.smtp.auth”, “true”);
  160.         URLName urlName = new URLName(“imap”, “mail.tsts168.com”, -1,
  161.                 folderName, userName, password);
  162.         this.session = Session.getInstance(props);
  163.         this.store = session.getStore(urlName);
  164.         this.store.connect();
  165.         this.folder = store.getFolder(folderName);
  166.         this.folder.open(Folder.READ_ONLY);
  167.     }
  168.     /**
  169.      * 退出登入
  170.      * 
  171.      * @throws Exception
  172.      */
  173.     private void logout() throws Exception {
  174.         this.store.close();
  175.     }
  176.     /**
  177.      * Utility method for formatting msg header addresses.
  178.      */
  179.     private String formatAddresses(Address[] addrs) {
  180.         if (addrs == null)
  181.             return “”;
  182.         StringBuffer strBuf = new StringBuffer(getDisplayAddress(addrs[0]));
  183.         for (int i = 1; i < addrs.length; i ) {
  184.             strBuf.append(“, “).append(getDisplayAddress(addrs[i]));
  185.         }
  186.         return strBuf.toString();
  187.     }
  188.     /**
  189.      * Utility method which returns a string suitable for msg header display.
  190.      */
  191.     private String getDisplayAddress(Address a) {
  192.         String pers = null;
  193.         String addr = null;
  194.         if (a instanceof InternetAddress
  195.                 && ((pers = ((InternetAddress) a).getPersonal()) != null)) {
  196.             addr = pers   ”  ”   “<”   ((InternetAddress) a).getAddress()
  197.                       “>”;
  198.         } else
  199.             addr = a.toString();
  200.         return addr;
  201.     }
  202. }