閱讀506 返回首頁    go 阿裏雲 go 技術社區[雲棲]


JavaMail學習筆記(三)、使用SMTP協議發送電子郵件(全)

package org.yangxin.study.jm;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
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;
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;

/**
 * 使用SMTP協議發送電子郵件
 */
public class SendMailTest {
	
	// 郵件發送協議
	private final static String PROTOCOL = "smtp";
	
	// SMTP郵件服務器
	private final static String HOST = "smtp.sina.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 = "xyang0917@sina.com";

	// 收件人
	private static String to = "xyang0917@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);
	}

	public static void main(String[] args) throws Exception {
		// 發送文本郵件
		sendTextEmail();
		
		// 發送簡單的html郵件
		sendHtmlEmail();
		
		// 發送帶內嵌圖片的HTML郵件
		sendHtmlWithInnerImageEmail();
		
		// 發送混合組合郵件
		sendMultipleEmail();
		
		// 發送已經生成的eml郵件
		//sendMailForEml();
	}
	
	/**
	 * 發送簡單的文本郵件
	 */
	public static 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("xyang0917", "123456abc");
		// 將message對象傳遞給transport對象,將郵件發送出去
		transport.sendMessage(message, message.getAllRecipients());
		// 關閉連接
		transport.close();
	}
	
	/**
	 * 發送簡單的html郵件
	 */
	public static void sendHtmlEmail() throws Exception {
		// 創建Session實例對象
		Session session = Session.getInstance(props, new MyAuthenticator());
		
		// 創建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郵件
	 */
	public static void sendHtmlWithInnerImageEmail() throws MessagingException {
		// 創建Session實例對象
		Session session = Session.getDefaultInstance(props, new MyAuthenticator());
		
		// 創建郵件內容
		MimeMessage message = new MimeMessage(session);
		// 郵件主題,並指定編碼格式
		message.setSubject("帶內嵌圖片的HTML郵件", "utf-8");	
		// 發件人
		message.setFrom(new InternetAddress(from));
		// 收件人
		message.setRecipients(RecipientType.TO, InternetAddress.parse(to));
		// 抄送
		message.setRecipient(RecipientType.CC, new InternetAddress("java_test@sohu.com"));
		// 密送 (不會在郵件收件人名單中顯示出來)
		message.setRecipient(RecipientType.BCC, new InternetAddress("417067629@qq.com"));
		// 發送時間
		message.setSentDate(new Date());
		
		// 創建一個MIME子類型為“related”的MimeMultipart對象
		MimeMultipart mp = new MimeMultipart("related");
		// 創建一個表示正文的MimeBodyPart對象,並將它加入到前麵創建的MimeMultipart對象中
		MimeBodyPart htmlPart = new MimeBodyPart();
		mp.addBodyPart(htmlPart);
		// 創建一個表示圖片資源的MimeBodyPart對象,將將它加入到前麵創建的MimeMultipart對象中
		MimeBodyPart imagePart = new MimeBodyPart();
		mp.addBodyPart(imagePart);
		
		// 將MimeMultipart對象設置為整個郵件的內容
		message.setContent(mp);
		
		// 設置內嵌圖片郵件體
		DataSource ds = new FileDataSource(new File("resource/firefoxlogo.png"));
		DataHandler dh = new DataHandler(ds);
		imagePart.setDataHandler(dh);
		imagePart.setContentID("firefoxlogo.png");	// 設置內容編號,用於其它郵件體引用
		
		// 創建一個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:firefoxlogo.png\" /></span>","text/html;charset=utf-8");
		htmlMultipart.addBodyPart(htmlBodypart);
		htmlPart.setContent(htmlMultipart);
		
		// 保存並生成最終的郵件內容
		message.saveChanges();
		
		// 發送郵件
		Transport.send(message);
	}
	
	/**
	 * 發送帶內嵌圖片、附件、多收件人(顯示郵箱姓名)、郵件優先級、閱讀回執的完整的HTML郵件
	 */
	public static void sendMultipleEmail() throws Exception {
		String charset = "utf-8";	// 指定中文編碼格式
		// 創建Session實例對象
		Session session = Session.getInstance(props,new MyAuthenticator());
		
		// 創建MimeMessage實例對象
		MimeMessage message = new MimeMessage(session);
		// 設置主題
		message.setSubject("使用JavaMail發送混合組合類型的郵件測試");
		// 設置發送人
		message.setFrom(new InternetAddress(from,"新浪測試郵箱",charset));
		// 設置收件人
		message.setRecipients(RecipientType.TO, 
				new Address[] {
				// 參數1:郵箱地址,參數2:姓名(在客戶端收件隻顯示姓名,而不顯示郵件地址),參數3:姓名中文字符串編碼
				new InternetAddress("java_test@sohu.com", "張三_sohu", charset),
				new InternetAddress("xyang0917@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("田七") + "\" <417067629@qq.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("resource/Earth.bmp");
		DataHandler dh1 = new DataHandler(ds1);
		attach1.setFileName(MimeUtility.encodeText("Earth.bmp"));
		attach1.setDataHandler(dh1);
		
		// 附件2
		DataSource ds2 = new FileDataSource("resource/如何學好C語言.txt");
		DataHandler dh2 = new DataHandler(ds2);
		attach2.setDataHandler(dh2);
		attach2.setFileName(MimeUtility.encodeText("如何學好C語言.txt"));
		
		// 郵件正文(內嵌圖片+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("resource/firefoxlogo.png");
		DataHandler dh3 = new DataHandler(ds3);
		imgPart.setDataHandler(dh3);
		imgPart.setContentID("firefoxlogo.png");
		
		// html郵件內容
		MimeMultipart htmlMultipart = new MimeMultipart("alternative");	
		htmlPart.setContent(htmlMultipart);
		MimeBodyPart htmlContent = new MimeBodyPart();
		htmlContent.setContent(
				"<span style='color:red'>這是我自己用java mail發送的郵件哦!" +
				"<img src='cid:firefoxlogo.png' /></span>"
						, "text/html;charset=gbk");
		htmlMultipart.addBodyPart(htmlContent);
		
		// 保存郵件內容修改
		message.saveChanges();
		
		/*File eml = buildEmlFile(message);
		sendMailForEml(eml);*/
		
		// 發送郵件
		Transport.send(message);
	}
	
	/**
	 * 將郵件內容生成eml文件
	 * @param message 郵件內容
	 */
	public static File buildEmlFile(Message message) throws MessagingException, FileNotFoundException, IOException {
		File file = new File("c:\\" + MimeUtility.decodeText(message.getSubject())+".eml");
		message.writeTo(new FileOutputStream(file));
		return file;
	}
	
	/**
	 * 發送本地已經生成好的email文件
	 */
	public static void sendMailForEml(File eml) throws Exception {
		// 獲得郵件會話
		Session session = Session.getInstance(props,new MyAuthenticator());
		// 獲得郵件內容,即發生前生成的eml文件
		InputStream is = new FileInputStream(eml);
		MimeMessage message = new MimeMessage(session,is);
		//發送郵件
		Transport.send(message);
	}
	
	/**
	 * 向郵件服務器提交認證信息
	 */
	static class MyAuthenticator extends Authenticator {
		
		private String username = "xyang0917";
		
		private String password = "123456abc";
		
		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);
		}
	}
}

測試結果:


1、發送文本郵件



2、發送簡單的html郵件


3、發送帶內嵌圖片的HTML郵件


4、發送混合組合郵件


最後更新:2017-04-02 16:47:43

  上一篇:go android Fragments詳解三:實現Fragment的界麵
  下一篇:go Google Chrome快捷鍵 -- Windows 鍵盤快捷鍵