JavaMail實現帶附件的郵件發送

本文實例為大傢分享瞭JavaMail實現帶附件的郵件發送的具體代碼,供大傢參考,具體內容如下

發送純文本的郵件

package com.haiwen.test;
 
import java.util.Date;
import java.util.Properties;
 
import javax.mail.Message.RecipientType;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
 
import org.junit.Test;
 
public class MessageDemo1 {
 
    @Test
    public void testSend() throws Exception {
 
        // 0. 郵件參數
        Properties prop = new Properties();
        prop.put("mail.transport.protocol", "smtp"); // 協議
        prop.put("mail.smtp.host", "smtp.163.com"); // 主機
        // prop.put("mail.smtp.port", 25); // 端口
        prop.put("mail.smtp.auth", "true"); // 用戶密碼認證
        prop.put("mail.debug", "true"); // 調試模式
 
        // 1. 創建一個郵件的會話
        Session session = Session.getDefaultInstance(prop);
        // 2. 創建郵件體對象 (整封郵件對象)
        MimeMessage message = new MimeMessage(session);
        // 3. 設置郵件體參數:
        // 3.1 標題
        message.setSubject("我的第一封郵件");
        // 3.2 郵件發送時間
        message.setSentDate(new Date());
        // 3.3 發件人
        message.setSender(new InternetAddress("[email protected]"));
        // 3.4 接收人
        message.setRecipient(RecipientType.TO, new InternetAddress("xxx.com"));
        // 3.5內容
        message.setText("你好,已經發送成功!  正文...."); // 簡單純文本郵件
        message.saveChanges(); // 保存郵件(可選)
 
        // 4. 發送
        Transport trans = session.getTransport();
        trans.connect("[email protected]", "xxx");
        // 發送郵件
        trans.sendMessage(message, message.getAllRecipients());
        trans.close();
    }
}

MIME組合關系

  • multipart/mixed類型

如果一封郵件中含有附件,那郵件的Content-Type域中必須定義multipart/mixed類型,郵件通過multipart/mixed類型中定義的boundary標識將附件內容同郵件其它內容分成不同的段。

  • multipart/related類型

MIME郵件中除瞭可以攜帶各種附件外,還可以將其它內容以內嵌資源的方式存儲在郵件中。比如我們在發送html格式的郵件內容時,可能使用圖像作為html的背景,html文本會被存儲在alternative段中,而作為背景的圖像則會存儲在multipart/related類型定義的段中。

  • multipart/alternative類型

MIME郵件可以傳送超文本內容,但出於兼容性的考慮,一般在發送超文本格式內容的同時會同時發送一個純文本內容的副本,如果郵件中同時存在純文本和超文本內容,則郵件需要在Content-Type域中定義multipart/alternative類型,郵件通過其boundary中的分段標識將純文本、超文本和郵件的其它內容分成不同的段。

郵件結構

JAF框架

JAF(JavaBeans Activation Framework,JavaBeans激活框架)是一個專用的數據處理框架,它用於封裝數據,並為應用程序提供訪問和操作數據的接口。

JAF的主要作用在於讓Java應用程序知道如何對一個數據源進行查看、編輯和打印等操作。對於通過JAF封裝的數據,應用程序通過JAF提供的接口可以完成如下功能:

  • 訪問數據源中的數據
  • 獲知數據源的數據類型
  • 獲知可對數據進行的各種操作
  • 用戶對數據執行某種操作時,自動創建執行該操作的軟件部件的實例對象

JavaMail API可以利用JAF從某種數據源中讀取數據和獲知數據的MIME類型,並用這些數據生成MIME消息中的消息體和消息類型。

發送帶文本、圖片的郵件

package com.haiwen.test;
 
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.Message.RecipientType;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
 
import org.junit.Test;
 
public class MessageDemo2 {
 
    // 初始化參數
    private static Properties prop;
    // 發件人
    private static InternetAddress sendMan = null;
    static {
        prop = new Properties();
        prop.put("mail.transport.protocol", "smtp"); // 協議
        prop.put("mail.smtp.host", "smtp.163.com"); // 主機
        // prop.put("mail.smtp.port", 25); // 端口
        prop.put("mail.smtp.auth", "true"); // 用戶密碼認證
        prop.put("mail.debug", "true"); // 調試模式
        try {
            sendMan = new InternetAddress("[email protected]");
        } catch (AddressException e) {
            throw new RuntimeException(e);
        }
    }
 
    @Test
    public void testSend() throws Exception {
        // 1. 創建郵件會話
        Session session = Session.getDefaultInstance(prop);
        // 2. 創建郵件對象
        MimeMessage message = new MimeMessage(session);
        // 3. 設置參數:標題、發件人、收件人、發送時間、內容
        message.setSubject("帶圖片郵件");
        message.setSender(sendMan);
        message.setRecipient(RecipientType.TO, new InternetAddress("xxx.com"));
        message.setSentDate(new Date());
 
        /*************** 設置郵件內容: 多功能用戶郵件 (related) *******************/
        // 4.1 構建一個多功能郵件塊
        MimeMultipart related = new MimeMultipart("related");
        // 4.2 構建多功能郵件塊內容 = 左側文本 + 右側圖片資源
        MimeBodyPart content = new MimeBodyPart();
        MimeBodyPart resource = new MimeBodyPart();
 
        // 設置具體內容: a.資源(圖片)
        String filePath = MessageDemo2.class.getResource("mm.png").getPath();
        DataSource ds = new FileDataSource(new File(filePath));
                //使用到瞭JAF框架把磁盤上的文件加到resource
        DataHandler handler = new DataHandler(ds);
        resource.setDataHandler(handler);
        resource.setContentID("mm.png"); // 設置資源名稱,給外鍵引用
 
        // 設置具體內容: b.文本
        content.setContent("<img src='cid:mm.png'/>  好哈哈!", "text/html;charset=UTF-8");
 
        related.addBodyPart(content);
        related.addBodyPart(resource);
 
        /******* 4.3 把構建的復雜郵件快,添加到郵件中 ********/
        message.setContent(related);
 
        // 5. 發送
        Transport trans = session.getTransport();
        trans.connect("[email protected]", "xxx");
        trans.sendMessage(message, message.getAllRecipients());
        trans.close();
    }
}

發送帶文本、圖片、附件的郵件

package com.haiwen.test;
 
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.Message.RecipientType;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
 
import org.junit.Test;
 
public class MessageDemo3 {
 
    // 初始化參數
    private static Properties prop;
    // 發件人
    private static InternetAddress sendMan = null;
    static {
        prop = new Properties();
        prop.put("mail.transport.protocol", "smtp"); // 指定協議
        prop.put("mail.smtp.host", "smtp.163.com"); // 主機 stmp.qq.com
        // prop.put("mail.smtp.port", 25); // 端口
        prop.put("mail.smtp.auth", "true"); // 用戶密碼認證
        prop.put("mail.debug", "true"); // 調試模式
        try {
            sendMan = new InternetAddress("[email protected]");
        } catch (AddressException e) {
            throw new RuntimeException(e);
        }
    }
 
    @Test
    public void testSend() throws Exception {
        // 1. 創建郵件會話
        Session session = Session.getDefaultInstance(prop);
        // 2. 創建郵件對象
        MimeMessage message = new MimeMessage(session);
        // 3. 設置參數:標題、發件人、收件人、發送時間、內容
        message.setSubject("帶圖片郵件");
        message.setSender(sendMan);
        message.setRecipient(RecipientType.TO, new InternetAddress("xxx.com"));
        message.setSentDate(new Date());
 
        /*
         * 帶附件(圖片)郵件開發
         */
        // 構建一個總的郵件塊
        MimeMultipart mixed = new MimeMultipart("mixed");
        // ---> 總郵件快,設置到郵件對象中
        message.setContent(mixed);
        // 左側: (文本+圖片資源)
        MimeBodyPart left = new MimeBodyPart();
        // 右側: 附件
        MimeBodyPart right = new MimeBodyPart();
        // 設置到總郵件塊
        mixed.addBodyPart(left);
        mixed.addBodyPart(right);
 
        /****** 附件 ********/
        String attr_path = this.getClass().getResource("a.docx").getPath();
        DataSource attr_ds = new FileDataSource(new File(attr_path));
        DataHandler attr_handler = new DataHandler(attr_ds);
        right.setDataHandler(attr_handler);
        right.setFileName("a.docx");
 
        /*************** 設置郵件內容: 多功能用戶郵件 (related) *******************/
        // 4.1 構建一個多功能郵件塊
        MimeMultipart related = new MimeMultipart("related");
        // ----> 設置到總郵件快的左側中
        left.setContent(related);
 
        // 4.2 構建多功能郵件塊內容 = 左側文本 + 右側圖片資源
        MimeBodyPart content = new MimeBodyPart();
        MimeBodyPart resource = new MimeBodyPart();
 
        // 設置具體內容: a.資源(圖片)
        String filePath = MessageDemo3.class.getResource("mm.png").getPath();
        DataSource ds = new FileDataSource(new File(filePath));
        DataHandler handler = new DataHandler(ds);
        resource.setDataHandler(handler);
        resource.setContentID("mm.png"); // 設置資源名稱,給外鍵引用
 
        // 設置具體內容: b.文本
        content.setContent("<img src='cid:mm.png'/>  好哈哈!", "text/html;charset=UTF-8");
 
        related.addBodyPart(content);
        related.addBodyPart(resource);
 
        // 5. 發送
        Transport trans = session.getTransport();
        trans.connect("[email protected]", "xxx");
        trans.sendMessage(message, message.getAllRecipients());
        trans.close();
    }
}

以上就是本文的全部內容,希望對大傢的學習有所幫助,也希望大傢多多支持WalkonNet。

推薦閱讀: