一、RFC882文檔簡單說明
RFC882文檔規定了如何編寫一封簡單的郵件(純文本郵件),一封簡單的郵件包含郵件頭和郵件體兩個部分,郵件頭和郵件體之間使用空行分隔。
郵件頭包含的內容有:
from字段? --用于指明發件人
to字段? ????--用于指明收件人
subject字段??--用于說明郵件主題
cc字段? ???-- 抄送,將郵件發送給收件人的同時抄送給另一個收件人,收件人可以看到郵件抄送給了誰
bcc字段? ?-- 密送,將郵件發送給收件人的同時將郵件秘密發送給另一個收件人,收件人無法看到郵件密送給了誰
郵件體指的就是郵件的具體內容。
二、MIME協議簡單介紹
在我們的實際開發當中,一封郵件既可能包含圖片,又可能包含有附件,在這樣的情況下,RFC882文檔規定的郵件格式就無法滿足要求了。
MIME協議是對RFC822文檔的升級和補充,它描述了如何生產一封復雜的郵件。通常我們把MIME協議描述的郵件稱之為MIME郵件。MIME協議描述的數據稱之為MIME消息。
對于一封復雜郵件,如果包含了多個不同的數據,MIME協議規定了要使用分隔線對多段數據進行分隔,并使用Content-Type頭字段對數據的類型、以及多個數據之間的關系進行描述。
三、使用JavaMail創建郵件和發送郵件
JavaMail創建的郵件是基于MIME協議的。因此可以使用JavaMail創建出包含圖片,包含附件的復雜郵件。
3.1、JavaMail API的簡單介紹
四、開發前的準備
4.1、確保QQ郵箱已經授權
去到QQ郵箱首頁——>設置——>賬戶,滾動條拉到最下邊,確保紅框內開啟授權。
4.2、選擇合適的Jar包
在Java SE環境下開發,使用最新版的JavaMail.jar(目前最新的是1.6.2版本)會報錯,錯誤原因和解決辦法網上也都有。但為了不那么麻煩,大家可以用版本較舊一點的Jar包,這樣就不會報錯了(本測試程序使用的Jar,https://mvnrepository.com/artifact/javax.mail/mail/1.4.7)。
4.3、發送簡單的郵件(純文本)
import java.util.Date;
import java.util.Properties;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
/**
* 只發送簡單的文本
* @author Snail
*
*/
public class SimpleEmail {
public static void main(String[] args) throws Exception {
Session session = Session.getInstance(getConfig());
// 開啟日志提示
session.setDebug(true);
MimeMessage mm = createMail(session, "1801888312@qq.com", "202132061@qq.com");
// 建立鏈接對象
Transport ts = session.getTransport();
ts.connect("你的QQ郵箱號碼", "前邊獲取的授權碼");
// 發送郵件
ts.sendMessage(mm, mm.getAllRecipients());
// 關閉鏈接
ts.close();
}
private static Properties getConfig() {
Properties props = new Properties();
// 使用的協議
props.setProperty("mail.transport.protocol", "smtp");
// 郵箱的 SMTP 服務器地址(百度搜:qq郵箱的POP服務器地址是什么)
props.setProperty("mail.smtp.host", "smtp.qq.com");
// 郵箱的服務器端口
props.setProperty("mail.smtp.port", "465");
// 是否需要驗證用戶名密碼
props.setProperty("mail.smtp.auth", "true");
// QQ郵箱的話需要進行SSL認證(javax.net.ssl.SSLSocketFactory這個類是jdk自帶的支持ssl認證)
props.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
// 沒經過SSL認證的請求,不予處理
props.setProperty("mail.smtp.socketFactory.fallback", "false");
// SSL認證的端口號(一般和郵箱服務器端口號一致)
props.setProperty("mail.smtp.socketFactory.port", "465");
return props;
}
private static MimeMessage createMail(Session session, String from, String to) throws Exception {
// 郵件:收件人,發件人,標題,內容(附件,圖片)
MimeMessage mm = new MimeMessage(session);
// 發件人地址,發件人名字,字符編碼
mm.setFrom(new InternetAddress(from, "發件人名字", "UTF-8"));
// 設置收件人,TO:普通收件人 CC:抄送 BCC:密送
// cc字段 -- 抄送,將郵件發送給收件人的同時抄送給另一個收件人,收件人可以看到郵件抄送給了誰
// bcc字段 -- 密送,將郵件發送給收件人的同時將郵件秘密發送給另一個收件人,收件人無法看到郵件密送給了誰
mm.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(to, "普通收件人", "UTF-8"));
// 設置發送日期
mm.setSentDate(new Date());
// 設置標題
mm.setSubject("這是標題", "UTF-8");
// 正文內容
mm.setContent("
郵件的內容哦!可以寫HTML代碼的呢!
", "text/html;charset=UTF-8");// 保存郵件
mm.saveChanges();
return mm;
}
}
4.4、發送帶圖片的郵件
Main方法和getConfig方法和前邊的一樣,只是createMail方法稍微有些改動,下面只貼出createMail方法中的代碼。注:dog.jpg是項目src目錄下存放的一張圖片。
private static MimeMessage createMail(Session session, String from, String to) throws Exception {
// 郵件:收件人,發件人,標題,內容(附件,圖片)
MimeMessage mm = new MimeMessage(session);
// 發件人地址,發件人名字,字符編碼
mm.setFrom(new InternetAddress(from, "發件人名字", "UTF-8"));
// 設置收件人,TO:普通收件人 CC:抄送 BCC:密送
mm.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(to, "普通收件人", "UTF-8"));
// 設置發送日期
mm.setSentDate(new Date());
// 設置標題
mm.setSubject("我愛中國", "UTF-8");
// 設置文字內容
MimeBodyPart text = new MimeBodyPart();
text.setContent("
圖片可愛嗎?
", "text/html;charset=utf-8");// 設置圖片
// 挖個坑
MimeBodyPart image = new MimeBodyPart();
// 拿來蘿卜
DataHandler dh=new DataHandler(new FileDataSource("src/dog.jpg"));
// 把蘿卜種進去
image.setDataHandler(dh);
// 給蘿卜起個名字,供前邊的cid使用
image.setContentID("picture");
// 再聲明一個容器
MimeMultipart mp=new MimeMultipart();
// 把文字內容放進去
mp.addBodyPart(text);
// 把圖片內容放進去
mp.addBodyPart(image);
// 聲明兩者的關系
mp.setSubType("related");
// 把MimeMultipart放入到MimeMessage中
mm.setContent(mp);
// 保存郵件
mm.saveChanges();
return mm;
}
4.5、發送帶附件的郵件
private static MimeMessage createMail(Session session, String from, String to) throws Exception {
// 郵件:收件人,發件人,標題,內容(附件,圖片)
MimeMessage mm = new MimeMessage(session);
// 發件人地址,發件人名字,字符編碼
mm.setFrom(new InternetAddress(from, "發件人名字", "UTF-8"));
// 設置收件人,TO:普通收件人 CC:抄送 BCC:密送
mm.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(to, "普通收件人", "UTF-8"));
// 設置發送日期
mm.setSentDate(new Date());
// 設置標題
mm.setSubject("我愛中國", "UTF-8");
// 設置文字內容
MimeBodyPart text = new MimeBodyPart();
text.setContent("
這次給你發一個附件
", "text/html;charset=utf-8");// 設置附件
// 挖個坑
MimeBodyPart file = new MimeBodyPart();
// 拿來蘿卜
DataHandler dh = new DataHandler(new FileDataSource("src/dog.jpg"));
// 把蘿卜種進去
file.setDataHandler(dh);
// 給蘿卜起個名字
file.setFileName(dh.getName());
// 再聲明一個容器
MimeMultipart mp = new MimeMultipart();
// 把文字內容放進去
mp.addBodyPart(text);
// 把附件放進去
mp.addBodyPart(file);
// 聲明兩者的關系
mp.setSubType("mixed");
// 把MimeMultipart放入到MimeMessage中
mm.setContent(mp);
// 保存郵件
mm.saveChanges();
return mm;
}
可以看出,與發送圖片只是稍微有點不同,主要不同點為 mp.setSubType()中的參數和圖片的cid以及附件的filename。
4.6、發送帶圖片和附件的郵件
private static MimeMessage createMail(Session session, String from, String to) throws Exception {
// 郵件:收件人,發件人,標題,內容(附件,圖片)
MimeMessage mm = new MimeMessage(session);
// 發件人地址,發件人名字,字符編碼
mm.setFrom(new InternetAddress(from, "發件人名字", "UTF-8"));
// 設置收件人,TO:普通收件人 CC:抄送 BCC:密送
mm.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(to, "普通收件人", "UTF-8"));
// 設置發送日期
mm.setSentDate(new Date());
// 設置標題
mm.setSubject("正文,圖片,附件", "UTF-8");
// 設置文字內容
MimeBodyPart text = new MimeBodyPart();
text.setContent("
這次既有附件,又有圖片
", "text/html;charset=utf-8");// 挖個坑
MimeBodyPart image = new MimeBodyPart();
// 拿來蘿卜
DataHandler dh = new DataHandler(new FileDataSource("src/dog.jpg"));
// 把蘿卜種進去
image.setDataHandler(dh);
// 給蘿卜起個名字,供前邊的cid使用
image.setContentID("dog");
// 設置附件
MimeBodyPart file = new MimeBodyPart();
dh = new DataHandler(new FileDataSource("src/dog.jpg"));
file.setDataHandler(dh);
file.setFileName(dh.getName());
// 再聲明一個容器
MimeMultipart mp = new MimeMultipart();
// 把文字內容放進去
mp.addBodyPart(text);
// 把圖片放進去
mp.addBodyPart(image);
// 聲明兩者的關系
mp.setSubType("related");
MimeBodyPart text_image = new MimeBodyPart();
text_image.setContent(mp);
MimeMultipart mp1 = new MimeMultipart();
mp1.addBodyPart(text_image);
mp1.addBodyPart(file);
mp1.setSubType("mixed");
// 把MimeMultipart放入到MimeMessage中
mm.setContent(mp1);
// 保存郵件
mm.saveChanges();
return mm;
}
五、致謝
本文只是簡單的講了下一些理論和實戰知識,如果想更加深入地了解相關知識的話,下面一些鏈接或許會幫助到你。本文也對于下邊的文章有所參考,巧合的是,這些文章的作者都是同一個人,非常感謝這些文章的作者——孤傲蒼狼!該博主的其他文章質量也特別高,推薦大家去看看哦!。