1、傳輸協議:
-
SMTP協議
處理用戶郵件發送的請求。
-
POP3協議
處理用戶郵件接收請的求。
2、導包:
mail-1.4.7.jar
activation-1.1.1.jar
3、過程:

4、代碼:
import com.sun.mail.util.MailSSLSocketFactory; import javax.mail.*; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import java.util.Properties; public class sendMail01 { //簡單郵件:純文本內容 //復雜郵件:文本+圖片+附件 //要發送郵件需要獲取協議,開啟POP3和SMTP服務 public static void main(String[] args) throws Exception { Properties prop = new Properties();//創建一封郵件 //以下三項的Key的值都是固定的 prop.setProperty("mail.host","smtp.qq.com");//設置郵件服務器 prop.setProperty("mail.transport.protocol","smtp");//設置郵件發送協議 prop.setProperty("mail.smtp.auth","true");//需要驗證用戶名和密碼 //如果是QQ郵箱,還要設置SSL加密,加上以下代碼即可 MailSSLSocketFactory sf = new MailSSLSocketFactory(); sf.setTrustAllHosts(true); prop.put("mail.smtp.ssl.enable","true"); prop.put("mail.smtp.ssl.socketFactory",sf); //==========使用JavaMail發送郵件的6個步驟====== //1、創建定義整個應用程序所需要的環境信息的Session對象 Session session = Session.getDefaultInstance(prop, new Authenticator() { public PasswordAuthentication getPasswordAuthentication(){ //發件人郵箱的用戶名和授權碼(只有qq是授權碼,其它的是密碼) return new PasswordAuthentication("1612893803@qq.com","授權碼"); } }); //開啟Session的debug模式,這樣就可以查看到程序發送Email的運行狀態 session.setDebug(true); //2、通過Session得到transport對象 Transport ts = session.getTransport(); //3、使用郵箱的用戶名和授權碼連上郵件服務器 ts.connect("SMTP.qq.com","1612893803@qq.com","授權碼"); //4、創建郵件 //創建郵件對象 MimeMessage message = new MimeMessage(session); //指明郵件的發件人 message.setFrom(new InternetAddress("1612893803@qq.com")); //指明郵件的收件人 message.setRecipient(Message.RecipientType.TO,new InternetAddress("212694926@qq.com")); //郵件的標題 message.setSubject("只是一個普通的純文本郵件"); //郵件的文本內容 message.setContent("你好哇,我來了!","text/html;charset=UTF-8"); //5、發送郵件 ts.sendMessage(message,message.getAllRecipients()); //6、關閉連接 ts.close(); } }
5、帶附件:
附件格式包含關系:

import com.sun.mail.util.MailSSLSocketFactory; import javax.activation.DataHandler; import javax.activation.FileDataSource; import javax.mail.*; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; import java.util.Properties; public class sendMail02 { //簡單郵件:純文本內容 //復雜郵件:文本+圖片+附件 /* *MimeMessage類表示整封郵件。 *MimeBodyPart類表示郵件的一個MIME消息。 *MimeMultipart類表示一個由多個MIME消息組合成的組合MIME消息。 */ //要發送郵件需要獲取協議,開啟POP3和SMTP服務 public static void main(String[] args) throws Exception { Properties prop = new Properties();//創建一封郵件 //以下三項的Key的值都是固定的 prop.setProperty("mail.host","smtp.qq.com");//設置郵件服務器 prop.setProperty("mail.transport.protocol","smtp");//設置郵件發送協議 prop.setProperty("mail.smtp.auth","true");//需要驗證用戶名和密碼 //如果是QQ郵箱,還要設置SSL加密,加上以下代碼即可 MailSSLSocketFactory sf = new MailSSLSocketFactory(); sf.setTrustAllHosts(true); prop.put("mail.smtp.ssl.enable","true"); prop.put("mail.smtp.ssl.socketFactory",sf); //==========使用JavaMail發送郵件的6個步驟====== //變量名字定義的有點亂,不想改了。將就下吧 //1、創建定義整個應用程序所需要的環境信息的Session對象 Session session = Session.getDefaultInstance(prop, new Authenticator() { public PasswordAuthentication getPasswordAuthentication(){ //發件人郵箱的用戶名和授權碼 return new PasswordAuthentication("1612893803@qq.com","授權碼"); } }); //開啟Session的debug模式,這樣就可以查看到程序發送Email的運行狀態 session.setDebug(true); //2、通過Session得到transport對象 Transport ts = session.getTransport(); //3、使用郵箱的用戶名和授權碼連上郵件服務器 ts.connect("SMTP.qq.com","1612893803@qq.com","授權碼"); //4、創建郵件 //創建郵件對象 MimeMessage message = new MimeMessage(session); //指明郵件的發件人 message.setFrom(new InternetAddress("1612893803@qq.com")); //指明郵件的收件人 message.setRecipient(Message.RecipientType.TO,new InternetAddress("212694926@qq.com")); //郵件的標題 message.setSubject("這是一個有文本、圖片、附件的郵件"); //郵件的內容 //================================================= //准備圖片數據 DataHandler:處理除文本外的數據 MimeBodyPart image = new MimeBodyPart(); DataHandler dh = new DataHandler(new FileDataSource("C:\\Users\\Think\\Documents\\image-20200220200136289.png")); image.setDataHandler(dh); image.setContentID("xx.png");//設置圖片ID //ContentID用於為“multipart/related”組合消息中的內嵌資源指定一個唯一標識號,在HTML格式的正文中可以使用這個唯一標識號來引用該內嵌資源。 //注意,在引用Content-ID頭字段標識的內嵌資源時,要在資源的唯一標識號前面加上“cid:”,以說明要采用唯一標識號對資源進行引用。 //准備正文數據 MimeBodyPart text = new MimeBodyPart(); text.setContent("這是一個帶圖片、文本、附件<img src='cid:xx.png'>的郵件","text/html;charset=UTF-8"); //准備附件數據 MimeBodyPart accessory = new MimeBodyPart(); DataHandler dh2 = new DataHandler(new FileDataSource("C:\\Users\\Think\\Pictures\\Saved Pictures\\illust_70110900_20191209_012234.jpg")); accessory.setDataHandler(dh2); accessory.setFileName(MimeUtility.encodeText("yan"));//給附件一個名字,發過去顯示的就是這個設定的名字||MimeUtility.encodeText("")解決附件發送過去亂碼; //*****************************!!!!!!!********************** /* MimeBodyPart:表示復雜郵件的一個組成部分,它可以表示文本,附件,圖片 DataHandler:表示可以讀取圖片或附件 MimeMultipart:表示二個郵件組成部分的關系,文本和圖片的關系是"related"關系 Content-ID:表示圖片的編號 related:圖片|| mixed:附件 */ //*****************************!!!!!!!********************** //拼接圖片和文本 MimeMultipart mm = new MimeMultipart(); mm.addBodyPart(text); mm.addBodyPart(image); mm.setSubType("related"); //將文本+圖片封裝成郵件的組成部分,即將關系看作成一個部分 MimeBodyPart context = new MimeBodyPart(); context.setContent(mm); //把附件也加上 MimeMultipart file = new MimeMultipart(); file.addBodyPart(context); file.addBodyPart(accessory); file.setSubType("mixed"); //放到消息中 message.setContent(file);//把編輯好的內容放入消息中 message.saveChanges();//保存修改! //================================================= //5、發送郵件 ts.sendMessage(message,message.getAllRecipients());//message:發送的消息||message.getAllRecipients():獲取保存在里面的地址 //6、關閉連接 ts.close(); } //對於,復雜類型的郵件,位置關系特別注意和加入的順利要一致 }
