javaMail 郵件發送和接收示例,支持正文圖片、html、附件(轉)


 轉自:https://blog.csdn.net/star_fly4/article/details/52037587

一、RFC882文檔簡單說明

  RFC882文檔規定了如何編寫一封簡單的郵件(純文本郵件),一封簡單的郵件包含郵件頭和郵件體兩個部分,郵件頭和郵件體之間使用空行分隔。

  郵件頭包含的內容有:

  1. from字段   --用於指明發件人
  2. to字段       --用於指明收件人
  3. subject字段  --用於說明郵件主題
  4. cc字段      -- 抄送,將郵件發送給收件人的同時抄送給另一個收件人,收件人可以看到郵件抄送給了誰
  5. bcc字段    -- 密送,將郵件發送給收件人的同時將郵件秘密發送給另一個收件人,收件人無法看到郵件密送給了

二、MIME協議簡單介紹

  在我們的實際開發當中,一封郵件既可能包含圖片,又可能包含有附件,在這樣的情況下,RFC882文檔規定的郵件格式就無法滿足要求了。

  MIME協議是對RFC822文檔的升級和補充,它描述了如何生產一封復雜的郵件。通常我們把MIME協議描述的郵件稱之為MIME郵件。MIME協議描述的數據稱之為MIME消息。
  對於一封復雜郵件,如果包含了多個不同的數據,MIME協議規定了要使用分隔線對多段數據進行分隔,並使用Content-Type頭字段對數據的類型、以及多個數據之間的關系進行描述。

三、使用JavaMail創建郵件和發送郵件圖解

  JavaMail創建的郵件是基於MIME協議的。因此可以使用JavaMail創建出包含圖片,包含附件的復雜郵件。

 

 

四、郵件發送代碼

 

1 導入開發包mail.jar  下載地址

package cjr.javamail;
 
import java.io.File;
import java.util.Date;
import java.util.Properties;
 
import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.Address;
import javax.mail.Authenticator;
import javax.mail.Message.RecipientType;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimeUtility;
 
import org.junit.Test;
 
public class SendEmail {
    
    // 郵件發送協議  
    private final static String PROTOCOL = "smtp";  
      
    // SMTP郵件服務器  
    private final static String HOST = "smtp.163.com";  
      
    // SMTP郵件服務器默認端口  
    private final static String PORT = "25";  
      
    // 是否要求身份認證  
    private final static String IS_AUTH = "true";  
      
    // 是否啟用調試模式(啟用調試模式可打印客戶端與服務器交互過程時一問一答的響應消息)  
    private final static String IS_ENABLED_DEBUG_MOD = "true";  
      
    // 發件人  
    private static String from = "chenxingxing745@163.com";  
    private static String verification_code = "cx*******29"; 
  
    // 收件人  
    private static String to = "chenjiaren745@163.com";  
      
    // 初始化連接郵件服務器的會話信息  
    private static Properties props = null;  
      
    static {  
        props = new Properties();  
        props.setProperty("mail.transport.protocol", PROTOCOL);  
        props.setProperty("mail.smtp.host", HOST);  
        props.setProperty("mail.smtp.port", PORT);  
        props.setProperty("mail.smtp.auth", IS_AUTH);  
        props.setProperty("mail.debug",IS_ENABLED_DEBUG_MOD);  
    }
    
     /** 
     * 發送簡單的文本郵件 
     */  
    @Test
    public void sendTextEmail() throws Exception {  
        // 創建Session實例對象  
        Session session = Session.getDefaultInstance(props);  
          
        // 創建MimeMessage實例對象  
        MimeMessage message = new MimeMessage(session);  
        // 設置發件人  
        message.setFrom(new InternetAddress(from));  
        // 設置郵件主題  
        message.setSubject("使用javamail發送簡單文本郵件");  
        // 設置收件人  
        message.setRecipient(RecipientType.TO, new InternetAddress(to));  
        // 設置發送時間  
        message.setSentDate(new Date());  
        // 設置純文本內容為郵件正文  
        message.setText("使用POP3協議發送文本郵件測試!!!");  
        // 保存並生成最終的郵件內容  
        message.saveChanges();  
          
        // 獲得Transport實例對象  
        Transport transport = session.getTransport();  
        // 打開連接  
        transport.connect("chenxingxing745", "cx*******9");  
        // 將message對象傳遞給transport對象,將郵件發送出去  
        transport.sendMessage(message, message.getAllRecipients());  
        // 關閉連接  
        transport.close();  
    }  
 
    /** 
     * 發送簡單的html郵件 
     */  
    @Test
    public void sendHtmlEmail() throws Exception {  
        // 創建Session實例對象  
        Session session = Session.getInstance(props, new MyAuthenticator(from,verification_code));  
          
        // 創建MimeMessage實例對象  
        MimeMessage message = new MimeMessage(session);  
        // 設置郵件主題  
        message.setSubject("html郵件主題");  
        // 設置發送人  
        message.setFrom(new InternetAddress(from));  
        // 設置發送時間  
        message.setSentDate(new Date());  
        // 設置收件人  
        message.setRecipients(RecipientType.TO, InternetAddress.parse(to));  
        // 設置html內容為郵件正文,指定MIME類型為text/html類型,並指定字符編碼為gbk  
        message.setContent("<span style='color:red;'>html郵件測試...</span>","text/html;charset=gbk");  
          
        // 保存並生成最終的郵件內容  
        message.saveChanges();  
          
        // 發送郵件  
        Transport.send(message);  
    }
    
    /** 
     * 發送帶內嵌圖片的HTML郵件 
     */
    @Test
    public void sendHtmlWithInnerImageEmail() throws MessagingException {  
        // 創建Session實例對象  
        Session session = Session.getDefaultInstance(props, new MyAuthenticator(from,verification_code));  
          
        // 創建郵件內容  
        MimeMessage message = new MimeMessage(session);  
        // 郵件主題,並指定編碼格式  
        message.setSubject("帶內嵌圖片的HTML郵件", "utf-8");      
        // 發件人  
        message.setFrom(new InternetAddress(from));  
        // 收件人  
        message.setRecipients(RecipientType.TO, InternetAddress.parse(to));  
        message.setSentDate(new Date());  
          
        // 創建一個MIME子類型為“related”的MimeMultipart對象  
        MimeMultipart mp = new MimeMultipart("related");  
        // 創建一個表示正文的MimeBodyPart對象,並將它加入到前面創建的MimeMultipart對象中  
        MimeBodyPart htmlPart = new MimeBodyPart();  
        mp.addBodyPart(htmlPart);  
        // 將MimeMultipart對象設置為整個郵件的內容  
        message.setContent(mp); 
        
        // 創建一個表示圖片資源的MimeBodyPart對象,將將它加入到前面創建的MimeMultipart對象中  
        MimeBodyPart imagePart = new MimeBodyPart();
        MimeBodyPart imagePart1 = new MimeBodyPart();
        mp.addBodyPart(imagePart);  
        mp.addBodyPart(imagePart1);
          
         
          
        // 設置內嵌圖片郵件體  
        DataSource ds = new FileDataSource(new File("src/psb.jpg"));  
        DataHandler dh = new DataHandler(ds);  
        imagePart.setDataHandler(dh);  
        imagePart.setContentID("psb.jpg");  // 設置內容編號,用於其它郵件體引用  
        
        DataSource ds1 = new FileDataSource(new File("src/loading.gif"));  
        DataHandler dh1 = new DataHandler(ds1);  
        imagePart1.setDataHandler(dh1);  
        imagePart1.setContentID("loading.gif");  // 設置內容編號,用於其它郵件體引用  
        
          
        // 創建一個MIME子類型為"alternative"的MimeMultipart對象,並作為前面創建的htmlPart對象的郵件內容  
        MimeMultipart htmlMultipart = new MimeMultipart("alternative");  
        // 創建一個表示html正文的MimeBodyPart對象  
        MimeBodyPart htmlBodypart = new MimeBodyPart();  
        // 其中cid=androidlogo.gif是引用郵件內部的圖片,即imagePart.setContentID("androidlogo.gif");方法所保存的圖片  
        htmlBodypart.setContent("<span style='color:red;'>這是帶內嵌圖片的HTML郵件哦!!!<img src=\"cid:psb.jpg\" /></span>多張圖片<img src=\"cid:psb.jpg\" />側認<img src=\"cid:loading.gif\" />識","text/html;charset=utf-8");  
        htmlMultipart.addBodyPart(htmlBodypart);  
        htmlPart.setContent(htmlMultipart);  
          
        // 保存並生成最終的郵件內容  
        message.saveChanges();  
          
        // 發送郵件  
        Transport.send(message);  
    }
    
    
    /** 
     * 發送帶內嵌圖片、附件、多收件人(顯示郵箱姓名)、郵件優先級、閱讀回執的完整的HTML郵件 
     */  
    @Test
    public  void sendMultipleEmail() throws Exception {  
        String charset = "utf-8";   // 指定中文編碼格式  
        // 創建Session實例對象  
        Session session = Session.getInstance(props,new MyAuthenticator(from,verification_code));  
          
        // 創建MimeMessage實例對象  
        MimeMessage message = new MimeMessage(session);  
        // 設置主題  
        message.setSubject("使用JavaMail發送混合組合類型的郵件測試");  
        // 設置發送人  
        message.setFrom(new InternetAddress(from,"163測試郵箱",charset));  
        // 設置收件人  
        message.setRecipients(RecipientType.TO,   
                new Address[] {  
                // 參數1:郵箱地址,參數2:姓名(在客戶端收件只顯示姓名,而不顯示郵件地址),參數3:姓名中文字符串編碼  
                new InternetAddress("517697206@qq.com", "張三_qq", charset),  
                new InternetAddress("chenjiaren745@163.com", "李四_163", charset),  
            }  
        );  
        // 設置抄送  
        //message.setRecipient(RecipientType.CC, new InternetAddress("xyang0917@gmail.com","王五_gmail",charset));  
        // 設置密送  
        //message.setRecipient(RecipientType.BCC, new InternetAddress("xyang0917@qq.com", "趙六_QQ", charset));  
        // 設置發送時間  
        message.setSentDate(new Date());  
        // 設置回復人(收件人回復此郵件時,默認收件人)  
        message.setReplyTo(InternetAddress.parse("\"" + MimeUtility.encodeText("田七") + "\" <chenxingxing745@163.com>"));  
        // 設置優先級(1:緊急   3:普通    5:低)  
        message.setHeader("X-Priority", "1");  
        // 要求閱讀回執(收件人閱讀郵件時會提示回復發件人,表明郵件已收到,並已閱讀)  
        message.setHeader("Disposition-Notification-To", from);  
          
        // 創建一個MIME子類型為"mixed"的MimeMultipart對象,表示這是一封混合組合類型的郵件  
        MimeMultipart mailContent = new MimeMultipart("mixed");   
        message.setContent(mailContent);  
          
        // 附件  
        MimeBodyPart attach1 = new MimeBodyPart();  
        MimeBodyPart attach2 = new MimeBodyPart();  
        // 內容  
        MimeBodyPart mailBody = new MimeBodyPart();  
          
        // 將附件和內容添加到郵件當中  
        mailContent.addBodyPart(attach1);  
        mailContent.addBodyPart(attach2);  
        mailContent.addBodyPart(mailBody);  
          
        // 附件1(利用jaf框架讀取數據源生成郵件體)  
        DataSource ds1 = new FileDataSource("src/loading.gif");  
        DataHandler dh1 = new DataHandler(ds1);  
        attach1.setFileName(MimeUtility.encodeText("loading.gif"));  
        attach1.setDataHandler(dh1);  
          
        // 附件2  
        DataSource ds2 = new FileDataSource("src/車.png");  
        DataHandler dh2 = new DataHandler(ds2);  
        System.out.println("======================"+dh2.getName()+"====================");
        attach2.setDataHandler(dh2);  
        attach2.setFileName(MimeUtility.encodeText(dh2.getName()));  
          
        // 郵件正文(內嵌圖片+html文本)  
        MimeMultipart body = new MimeMultipart("related");  //郵件正文也是一個組合體,需要指明組合關系  
        mailBody.setContent(body);  
          
        // 郵件正文由html和圖片構成  
        MimeBodyPart imgPart = new MimeBodyPart();  
        MimeBodyPart htmlPart = new MimeBodyPart();  
        body.addBodyPart(imgPart);  
        body.addBodyPart(htmlPart);  
          
        // 正文圖片  
        DataSource ds3 = new FileDataSource("src/psb.jpg");  
        DataHandler dh3 = new DataHandler(ds3);  
        imgPart.setDataHandler(dh3);  
        imgPart.setContentID("psb.jpg");  
          
        // html郵件內容  
        MimeMultipart htmlMultipart = new MimeMultipart("alternative");   
        htmlPart.setContent(htmlMultipart);  
        MimeBodyPart htmlContent = new MimeBodyPart();  
        htmlContent.setContent(  
                "<span style='color:red'>這是我自己用java mail發送的郵件哦!" +  
                "<img src='cid:psb.jpg' /></span> 復雜郵件"  
                        , "text/html;charset=gbk");  
        htmlMultipart.addBodyPart(htmlContent);  
          
        // 保存郵件內容修改  
        message.saveChanges();  
          
        // 發送郵件  
        Transport.send(message);  
    }
    
}
 
/** 
 * 向郵件服務器提交認證信息 
 */  
class MyAuthenticator extends Authenticator {  
      
    private String username = "chenxingxing745";  
      
    private String password = "<span style="line-height: 20.8px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;">cx*******29</span>";  
      
    public MyAuthenticator() {  
        super();  
    }  
 
    public MyAuthenticator(String username, String password) {  
        super();  
        this.username = username;  
        this.password = password;  
    }  
 
    @Override  
    protected PasswordAuthentication getPasswordAuthentication() {  
          
        return new PasswordAuthentication(username, password);  
    }  
} 
 

五、郵件接收解析

package cjr.javamail;
 
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Properties;
 
import javax.mail.Address;
import javax.mail.BodyPart;
import javax.mail.Flags;
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 javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimeUtility;
 
import org.junit.Test;
 
public class ReceiveMail {
    private static final String PROTOCOL = "pop3"; 
    private static final String USERNAME = "chenjiaren745@163.com";  
    private static final String LOGINPASS = "<span style="line-height: 20.8px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;">cx*******29</span><span style="line-height: 20.8px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;">"; </span>
    private static final String DIR = "D:\\mailTemp\\";
    
    // 初始化連接郵件服務器的會話信息  
    private  static  Properties props = null; 
    static{
        props = new Properties();  
        props.setProperty("mail.store.protocol", "pop3");       // 協議  
        props.setProperty("mail.pop3.port", "110");             // 端口  
        props.setProperty("mail.pop3.host", "pop3.163.com");    // pop3服務器
        File dir = new File(DIR);
        System.out.println(!dir.exists());
        if(!dir.exists())
            dir.mkdirs();
        System.out.println(dir.isDirectory());
    }
    
    @Test
    public void receive() throws Exception {  
          
        // 創建Session實例對象  
        Session session = Session.getInstance(props);  
        Store store = session.getStore(PROTOCOL);  
        store.connect(USERNAME, LOGINPASS);  
          
        // 獲得收件箱  
        Folder folder = store.getFolder("INBOX");  
        /* Folder.READ_ONLY:只讀權限 
         * Folder.READ_WRITE:可讀可寫(可以修改郵件的狀態) 
         */  
        folder.open(Folder.READ_WRITE); //打開收件箱  
          
        // 由於POP3協議無法獲知郵件的狀態,所以getUnreadMessageCount得到的是收件箱的郵件總數  
        System.out.println("未讀郵件數: " + folder.getUnreadMessageCount());  
          
        // 由於POP3協議無法獲知郵件的狀態,所以下面得到的結果始終都是為0  
        System.out.println("刪除郵件數: " + folder.getDeletedMessageCount());  
        System.out.println("新郵件: " + folder.getNewMessageCount());  
          
        // 獲得收件箱中的郵件總數  
        System.out.println("郵件總數: " + folder.getMessageCount());  
          
        // 得到收件箱中的所有郵件,並解析  
        Message[] messages = folder.getMessages();  
        parseMessage(messages);  
          
        //釋放資源  
        folder.close(true);  
        store.close();  
    } 
    
    /** 
     * 解析郵件 
     * @param messages 要解析的郵件列表 
     */  
    public  void parseMessage(Message ...messages) throws MessagingException, IOException {  
        if (messages == null || messages.length < 1)   
            throw new MessagingException("未找到要解析的郵件!");  
          
        // 解析所有郵件  
        for (int i = 0, count = messages.length; i < count; i++) {  
            MimeMessage msg = (MimeMessage) messages[i];  
            System.out.println("------------------解析第" + msg.getMessageNumber() + "封郵件-------------------- ");  
            System.out.println("主題: " + getSubject(msg));  
            System.out.println("發件人: " + getFrom(msg));  
            System.out.println("收件人:" + getReceiveAddress(msg, null));  
            System.out.println("發送時間:" + getSentDate(msg, null));  
            System.out.println("是否已讀:" + isSeen(msg));  
            System.out.println("郵件優先級:" + getPriority(msg));  
            System.out.println("是否需要回執:" + isReplySign(msg));  
            System.out.println("郵件大小:" + msg.getSize() * 1024 + "kb");  
            boolean isContainerAttachment = isContainAttachment(msg);  
            System.out.println("是否包含附件:" + isContainerAttachment);  
            if (isContainerAttachment) {  
                saveAttachment(msg, DIR + msg.getSubject() + "_"); //保存附件  
            }   
            StringBuffer content = new StringBuffer(30);  
            getMailTextContent(msg, content);  
            System.out.println("郵件正文:" + (content.length() > 100 ? content.substring(0,100) + "..." : content));  
            System.out.println("------------------第" + msg.getMessageNumber() + "封郵件解析結束-------------------- ");  
            System.out.println();  
        }  
    }
    
    /** 
     * 獲得郵件主題 
     * @param msg 郵件內容 
     * @return 解碼后的郵件主題 
     */  
    public static String getSubject(MimeMessage msg) throws UnsupportedEncodingException, MessagingException {  
        return MimeUtility.decodeText(msg.getSubject());  
    }  
      
    /** 
     * 獲得郵件發件人 
     * @param msg 郵件內容 
     * @return 姓名 <Email地址> 
     * @throws MessagingException 
     * @throws UnsupportedEncodingException  
     */  
    public static String getFrom(MimeMessage msg) throws MessagingException, UnsupportedEncodingException {  
        String from = "";  
        Address[] froms = msg.getFrom();  
        if (froms.length < 1)  
            throw new MessagingException("沒有發件人!");  
          
        InternetAddress address = (InternetAddress) froms[0];  
        String person = address.getPersonal();  
        if (person != null) {  
            person = MimeUtility.decodeText(person) + " ";  
        } else {  
            person = "";  
        }  
        from = person + "<" + address.getAddress() + ">";  
          
        return from;  
    }  
      
    /** 
     * 根據收件人類型,獲取郵件收件人、抄送和密送地址。如果收件人類型為空,則獲得所有的收件人 
     * <p>Message.RecipientType.TO  收件人</p> 
     * <p>Message.RecipientType.CC  抄送</p> 
     * <p>Message.RecipientType.BCC 密送</p> 
     * @param msg 郵件內容 
     * @param type 收件人類型 
     * @return 收件人1 <郵件地址1>, 收件人2 <郵件地址2>, ... 
     * @throws MessagingException 
     */  
    public static String getReceiveAddress(MimeMessage msg, Message.RecipientType type) throws MessagingException {  
        StringBuffer receiveAddress = new StringBuffer();  
        Address[] addresss = null;  
        if (type == null) {  
            addresss = msg.getAllRecipients();  
        } else {  
            addresss = msg.getRecipients(type);  
        }  
          
        if (addresss == null || addresss.length < 1)  
            throw new MessagingException("沒有收件人!");  
        for (Address address : addresss) {  
            InternetAddress internetAddress = (InternetAddress)address;  
            receiveAddress.append(internetAddress.toUnicodeString()).append(",");  
        }  
          
        receiveAddress.deleteCharAt(receiveAddress.length()-1); //刪除最后一個逗號  
          
        return receiveAddress.toString();  
    }  
      
    /** 
     * 獲得郵件發送時間 
     * @param msg 郵件內容 
     * @return yyyy年mm月dd日 星期X HH:mm 
     * @throws MessagingException 
     */  
    public static String getSentDate(MimeMessage msg, String pattern) throws MessagingException {  
        Date receivedDate = msg.getSentDate();  
        if (receivedDate == null)  
            return "";  
          
        if (pattern == null || "".equals(pattern))  
            pattern = "yyyy年MM月dd日 E HH:mm ";  
          
        return new SimpleDateFormat(pattern).format(receivedDate);  
    }  
      
    /** 
     * 判斷郵件中是否包含附件 
     * @param msg 郵件內容 
     * @return 郵件中存在附件返回true,不存在返回false 
     * @throws MessagingException 
     * @throws IOException 
     */  
    public static boolean isContainAttachment(Part part) throws MessagingException, IOException {  
        boolean flag = false;  
        if (part.isMimeType("multipart/*")) {  
            MimeMultipart multipart = (MimeMultipart) part.getContent();  
            int partCount = multipart.getCount();  
            for (int i = 0; i < partCount; i++) {  
                BodyPart bodyPart = multipart.getBodyPart(i);  
                String disp = bodyPart.getDisposition();  
                if (disp != null && (disp.equalsIgnoreCase(Part.ATTACHMENT) || disp.equalsIgnoreCase(Part.INLINE))) {  
                    flag = true;  
                } else if (bodyPart.isMimeType("multipart/*")) {  
                    flag = isContainAttachment(bodyPart);  
                } else {  
                    String contentType = bodyPart.getContentType();  
                    if (contentType.indexOf("application") != -1) {  
                        flag = true;  
                    }    
                      
                    if (contentType.indexOf("name") != -1) {  
                        flag = true;  
                    }   
                }  
                  
                if (flag) break;  
            }  
        } else if (part.isMimeType("message/rfc822")) {  
            flag = isContainAttachment((Part)part.getContent());  
        }  
        return flag;  
    }  
      
    /**  
     * 判斷郵件是否已讀  
     * @param msg 郵件內容  
     * @return 如果郵件已讀返回true,否則返回false  
     * @throws MessagingException   
     */  
    public static boolean isSeen(MimeMessage msg) throws MessagingException {  
        return msg.getFlags().contains(Flags.Flag.SEEN);  
    }  
      
    /** 
     * 判斷郵件是否需要閱讀回執 
     * @param msg 郵件內容 
     * @return 需要回執返回true,否則返回false 
     * @throws MessagingException 
     */  
    public static boolean isReplySign(MimeMessage msg) throws MessagingException {  
        boolean replySign = false;  
        String[] headers = msg.getHeader("Disposition-Notification-To");  
        if (headers != null)  
            replySign = true;  
        return replySign;  
    }  
      
    /** 
     * 獲得郵件的優先級 
     * @param msg 郵件內容 
     * @return 1(High):緊急  3:普通(Normal)  5:低(Low) 
     * @throws MessagingException  
     */  
    public  String getPriority(MimeMessage msg) throws MessagingException {  
        String priority = "普通";  
        String[] headers = msg.getHeader("X-Priority");  
        if (headers != null) {  
            String headerPriority = headers[0];  
            if (headerPriority.indexOf("1") != -1 || headerPriority.indexOf("High") != -1)  
                priority = "緊急";  
            else if (headerPriority.indexOf("5") != -1 || headerPriority.indexOf("Low") != -1)  
                priority = "低";  
            else  
                priority = "普通";  
        }  
        return priority;  
    }   
      
    /** 
     * 獲得郵件文本內容 
     * @param part 郵件體 
     * @param content 存儲郵件文本內容的字符串 
     * @throws MessagingException 
     * @throws IOException 
     */  
    public  void getMailTextContent(Part part, StringBuffer content) throws MessagingException, IOException {  
        //如果是文本類型的附件,通過getContent方法可以取到文本內容,但這不是我們需要的結果,所以在這里要做判斷  
        boolean isContainTextAttach = part.getContentType().indexOf("name") > 0;   
        if (part.isMimeType("text/*") && !isContainTextAttach) {  
            content.append(part.getContent().toString());  
        } else if (part.isMimeType("message/rfc822")) {   
            getMailTextContent((Part)part.getContent(),content);  
        } else if (part.isMimeType("multipart/*")) {  
            Multipart multipart = (Multipart) part.getContent();  
            int partCount = multipart.getCount();  
            for (int i = 0; i < partCount; i++) {  
                BodyPart bodyPart = multipart.getBodyPart(i);  
                getMailTextContent(bodyPart,content);  
            }  
        }  
    }  
      
    /**  
     * 保存附件  
     * @param part 郵件中多個組合體中的其中一個組合體  
     * @param destDir  附件保存目錄  
     * @throws UnsupportedEncodingException  
     * @throws MessagingException  
     * @throws FileNotFoundException  
     * @throws IOException  
     */  
    public  void saveAttachment(Part part, String destDir) throws UnsupportedEncodingException, MessagingException,  
            FileNotFoundException, IOException {  
        if (part.isMimeType("multipart/*")) {  
            Multipart multipart = (Multipart) part.getContent();    //復雜體郵件  
            //復雜體郵件包含多個郵件體  
            int partCount = multipart.getCount();  
            for (int i = 0; i < partCount; i++) {  
                //獲得復雜體郵件中其中一個郵件體  
                BodyPart bodyPart = multipart.getBodyPart(i);  
                //某一個郵件體也有可能是由多個郵件體組成的復雜體  
                String disp = bodyPart.getDisposition();  
                if (disp != null && (disp.equalsIgnoreCase(Part.ATTACHMENT) || disp.equalsIgnoreCase(Part.INLINE))) {  
                    InputStream is = bodyPart.getInputStream();  
                    saveFile(is, destDir, decodeText(bodyPart.getFileName()));  
                } else if (bodyPart.isMimeType("multipart/*")) {  
                    saveAttachment(bodyPart,destDir);  
                } else {  
                    String contentType = bodyPart.getContentType();  
                    if (contentType.indexOf("name") != -1 || contentType.indexOf("application") != -1) {  
                        saveFile(bodyPart.getInputStream(), destDir, decodeText(bodyPart.getFileName()));  
                    }  
                }  
            }  
        } else if (part.isMimeType("message/rfc822")) {  
            saveAttachment((Part) part.getContent(),destDir);  
        }  
    }  
      
    /**  
     * 讀取輸入流中的數據保存至指定目錄  
     * @param is 輸入流  
     * @param fileName 文件名  
     * @param destDir 文件存儲目錄  
     * @throws FileNotFoundException  
     * @throws IOException  
     */  
    private  void saveFile(InputStream is, String destDir, String fileName)  
            throws FileNotFoundException, IOException {  
        BufferedInputStream bis = new BufferedInputStream(is);  
        BufferedOutputStream bos = new BufferedOutputStream(  
                new FileOutputStream(new File(destDir + fileName)));  
        int len = -1;  
        while ((len = bis.read()) != -1) {  
            bos.write(len);  
            bos.flush();  
        }  
        bos.close();  
        bis.close();  
    }  
      
    /** 
     * 文本解碼 
     * @param encodeText 解碼MimeUtility.encodeText(String text)方法編碼后的文本 
     * @return 解碼后的文本 
     * @throws UnsupportedEncodingException 
     */  
    public  String decodeText(String encodeText) throws UnsupportedEncodingException {  
        if (encodeText == null || "".equals(encodeText)) {  
            return "";  
        } else {  
            return MimeUtility.decodeText(encodeText);  
        }  
    }  
}
注意:
1  getUnreadMessageCount 獲取未讀郵件數量,getNewMessageCount 獲取新郵件數量   獲取值和實際值不一致。 目前測試時未讀郵件數量等於總郵件數量,新郵件數量等於0 ,實際是有已讀郵件,未讀郵件, 產生原因待查。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM