????????眾所周知,Email就是郵件,在科技高速發(fā)展的今天我們也使用了非常之久的電子郵件,我們熟知的郵件有自己的QQ郵箱、網(wǎng)易郵箱大師還有Outlook等都是用來發(fā)送郵件的,而用Java程序也是可以用來發(fā)送郵件的。
郵件
首先我們先對比一下傳統(tǒng)的郵件信息是如何發(fā)送的:傳統(tǒng)郵件是將郵件放入到郵箱中,再通過郵局發(fā)往目的地所在的郵局,再由郵遞員送到收件人的手中。這和我們現(xiàn)在的快遞是同樣的道理。
而電子郵件的原理也是類似的,只不過是把普通郵局換成了電子的,先發(fā)送到郵件服務(wù)器中,再經(jīng)過若干個郵件服務(wù)器的中轉(zhuǎn)之后,最后發(fā)送到收件人的郵箱中。效果類似上圖。
郵件協(xié)議
1.SMTP
????????SMTP的全稱是“Simple?Mail?Transfer?Protocol”,即簡單郵件傳輸協(xié)議。它是一組用于從源地址到目的地址傳輸郵件的準(zhǔn)備規(guī)范,通過它來控制郵件的中轉(zhuǎn)方式。SMTP協(xié)議屬于TCP/IP協(xié)議簇,它幫助每臺計算機(jī)在發(fā)送或中轉(zhuǎn)信件時找到下一個目的發(fā)送地。SMTP?服務(wù)器就是遵循SMTP協(xié)議的發(fā)送郵件服務(wù)器。SMTP認(rèn)證,簡單地說就是要求必須在提供了賬戶名和密碼之后才可以登錄SMTP服務(wù)器,這就使得那些垃圾郵件的散播者無可乘之機(jī)??稍黾覵MTP認(rèn)證的目的是為了使用戶避免受到垃圾郵件的侵?jǐn)_。
2.POP3
????????POP3是Post?Office?Protocol?3的簡稱,即郵局協(xié)議的第3個版本,它規(guī)定怎樣將個人計算機(jī)連接到Intenet的郵件服務(wù)器和下載電子郵件的電子協(xié)議。它是因特網(wǎng)電子郵件的第一個離線協(xié)議標(biāo)準(zhǔn),POP3允許用戶從服務(wù)器上把郵件存儲到本地主機(jī)(即自己的計算機(jī))上,同時刪除保存在郵件服務(wù)器上的郵件,而POP3服務(wù)器則是遵循POP3協(xié)議的接收郵件服務(wù)器,用來接收電子郵件的。
3.IMAP
????????IMAP全稱是Internet?Mail?Access?Protocol,即交互式郵件存取協(xié)議,它是跟POP3類似郵件訪問標(biāo)準(zhǔn)協(xié)議之一。不同的是,開啟了IMAP后,您在電子郵件客戶端收取的郵件仍然保留在服務(wù)器上,同時在客戶端上的操作都會反饋到服務(wù)器上,如:刪除郵件,標(biāo)記已讀等,服務(wù)器上的郵件也會做相應(yīng)的動作。所以無論從瀏覽器登錄郵箱或者客戶端軟件登錄郵箱,看到的郵件以及狀態(tài)都是一致的。
4.了解POP3與IMAP之間的不同?
????????POP3協(xié)議允許電子郵件客戶端下載服務(wù)器上的郵件,但是在客戶端的操作(如移動郵件、標(biāo)記已讀等),不會反饋到服務(wù)器上,比如通過客戶端收取了郵箱中的3封郵件并移動到其他文件夾,郵箱服務(wù)器上的這些郵件是沒有同時被移動的。
????????IMAP提供webmail?與電子郵件客戶端之間的雙向通信,客戶端的操作都會反饋到服務(wù)器上,對郵件進(jìn)行的操作,服務(wù)器上的郵件也會做相應(yīng)的動作。
以126郵件為例,相應(yīng)的協(xié)議會有相關(guān)的協(xié)議端口
服務(wù)器名稱 | 服務(wù)器地址 | SSL協(xié)議端口號 | 非SSL協(xié)議端口號 |
SMTP | smtp.126.com | 993 | 143 |
IMAP | imap.126.com | 465/994 | 25 |
POP3 | pop.126.com | 995 | 110 |
發(fā)送郵件的準(zhǔn)備工作
? ? ? ? 本文使用的是網(wǎng)易郵箱126,可以以自行申請,在使用之前要在網(wǎng)易郵箱的設(shè)置里的"POP3/SMTP/IMAP"里開啟服務(wù),二者選一即可。
?還要在下拉界面開啟授權(quán)密碼管理,點(diǎn)擊"新增授權(quán)密碼",界面會顯示你的密碼,為了更好的記住,可以選擇文本進(jìn)行保存,當(dāng)你不再使用時,可以點(diǎn)擊刪除按鈕,之后此密碼將會失效,不能再進(jìn)行登錄。
?代碼實現(xiàn)郵件發(fā)送
public class Demo01 {
public static void main(String[] args) {
// SMTP服務(wù)器地址
String smtp = "stmp.126.com";
// 郵箱賬號和密碼(授權(quán)密碼)
String userName = "*********";
String password = "*********";
// SMTP服務(wù)器的連接信息
Properties props = new Properties();
props.put("mail.smtp.host", smtp); // SMTP主機(jī)號
props.put("mail.smtp.port", "25"); // 主機(jī)端口號
props.put("mail.smtp.auth", "true"); // 是否需要認(rèn)證
props.put("mail.smtp.starttls.enable", "true"); // 啟用TLS加密
// 創(chuàng)建Session
// 參數(shù)1:SMTP服務(wù)器的連接信息
// 參數(shù)2:用戶認(rèn)證對象(Authenticator接口的匿名實現(xiàn)類)
Session session = Session.getInstance(props, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(userName, password);
}
});
// 開啟調(diào)試模式
session.setDebug(true);
System.out.println(session);
}
}
當(dāng)發(fā)送郵件時,我們每次都要先創(chuàng)建Session,再輸入郵箱的賬號密碼,建立連接信息,過于繁瑣,所以我們可以在這里創(chuàng)建一個JavaMailUtils類,每次創(chuàng)建連接時,只需要調(diào)用JavaMailUtils類里的createsession()方法即可,大大減少了代碼的冗余。
public class JavaMailUtils {
public static Session createsession() {
// SMTP服務(wù)器地址
String smtp = "smtp.126.com";
// 郵箱賬號和密碼(授權(quán)密碼)
String userName = "**********";
String password = "**********";
// SMTP服務(wù)器的連接信息
Properties props = new Properties();
props.put("mail.smtp.host", smtp); // SMTP主機(jī)號
props.put("mail.smtp.port", "25"); // 主機(jī)端口號
props.put("mail.smtp.auth", "true"); // 是否需要認(rèn)證
props.put("mail.smtp.starttls.enable", "true"); // 啟用TLS加密
// 創(chuàng)建Session
// 參數(shù)1:SMTP服務(wù)器的連接信息
// 參數(shù)2:用戶認(rèn)證對象(Authenticator接口的匿名實現(xiàn)類)
Session session = Session.getInstance(props, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(userName, password);
}
});
// 開啟調(diào)試模式
session.setDebug(true);
return session;
}
}
?發(fā)送普通郵件
? ? ? ? 首先,我們還是要創(chuàng)建Session,當(dāng)然這次我們只需調(diào)用JavaMailUtils的createsession()方法 就行。然后創(chuàng)建Message對象,因為Message類是一個抽象類,所以我們只能創(chuàng)建其子類對象,然后將session傳入。
接著調(diào)用setFrom()方法選擇發(fā)件人,setRecipient()方法選擇收件人,setSubject()方法選擇輸入郵件的標(biāo)題,setText()方法輸入郵件的正文,最后通過Transport的send()方法完成發(fā)送郵件。
在setRecipient()這個方法中,我們可以通過RecipientType枚舉類提供的常量進(jìn)行選擇,RecipientType.TO代表收件人,RecipientType.CC代表抄送人。
注意:登錄名和發(fā)送人的郵件保持一致,否則可能會使得郵件發(fā)送失敗。
public class Demo02 {
public static void main(String[] args) {
try {
// 1.創(chuàng)建Session
Session session = JavaMailUtils.createsession();
// 2.創(chuàng)建郵件對象(Message抽象類的子類對象)
MimeMessage msg = new MimeMessage(session); // 傳入session
msg.setFrom(new InternetAddress("*********")); // 發(fā)件人
msg.setRecipient(RecipientType.TO, new InternetAddress("*********")); // 收件人
msg.setRecipient(RecipientType.CC, new InternetAddress("*********")); // 抄送人
msg.setSubject("這是一封來自好友的郵件","utf-8"); // 標(biāo)題
msg.setText("愿世界和平!","utf-8"); // 正文
// 3.發(fā)送
Transport.send(msg);
} catch (MessagingException e) {
e.printStackTrace();
}
}
}
發(fā)送正文帶有"html"標(biāo)簽的郵件
可以在需要修改的內(nèi)容前后加上html的修飾符進(jìn)行修改。
例:<b>世界</b> 可以讓"世界"兩個字加粗。
public class Demo03 {
public static void main(String[] args) {
try {
// 1.創(chuàng)建Session
Session session = JavaMailUtils.createsession();
// 2.創(chuàng)建郵件對象(Message抽象類的子類對象)
MimeMessage msg = new MimeMessage(session); // 傳入session
msg.setFrom(new InternetAddress("*********")); // 發(fā)件人
msg.setRecipient(RecipientType.TO, new InternetAddress("*********")); // 收件人
msg.setRecipient(RecipientType.CC, new InternetAddress("*********")); // 抄送人
msg.setSubject("這是一封來自好友的郵件","utf-8"); // 標(biāo)題
// 郵件正文中包含有“html”標(biāo)簽(控制文本的格式)
msg.setText("<b>世界</b>和平!","utf-8","html"); // 正文
// 3.發(fā)送
Transport.send(msg);
} catch (MessagingException e) {
e.printStackTrace();
}
}
}
發(fā)送帶有附件的郵件
想發(fā)送帶有附件的郵件,我們還要創(chuàng)建郵件內(nèi)容"復(fù)合"對象,Multipart類的MimeMultipart實現(xiàn)類,然后再創(chuàng)建BodyPart類的MimeBodyPart實現(xiàn)類,textPart用于存儲正文內(nèi)容,調(diào)用setContent()方法,參數(shù)1為正文內(nèi)容,參數(shù)2為內(nèi)容類型;字符編碼集。imagePart用于存儲附件(本文的附件以圖片為例),先調(diào)用setFileName()方法設(shè)置附件文件的顯示名稱(顯示名稱可以與圖片原名不一致),再調(diào)用setDataHandler(),其中添加一個DataHandler()方法,使用Files工具類的readAllBytes()方法,可以把文件讀取成字節(jié)數(shù)據(jù), 最后,通過setContent()把Multipart添加到Message中,即可發(fā)送郵件。
如果我們需要抄送多個人一起發(fā)送時,可以選擇通過創(chuàng)建一個InternetAddress[]數(shù)組把多個抄送人存入。文章來源:http://www.zghlxwxcb.cn/news/detail-448217.html
public class Demo04 {
public static void main(String[] args) {
try {
// 1.創(chuàng)建Session
Session session = JavaMailUtils.createsession();
// 2.創(chuàng)建郵件對象(Message抽象類的子類對象)
MimeMessage msg = new MimeMessage(session); // 傳入session
msg.setFrom(new InternetAddress("*********")); // 發(fā)件人
msg.setRecipient(RecipientType.TO, new InternetAddress("*********")); // 發(fā)送人
msg.setRecipients(RecipientType.CC, new InternetAddress[] {
new InternetAddress("*********"),
new InternetAddress("*********"),
new InternetAddress("*********"),
});
msg.setSubject("這是一封來自好友的郵件","utf-8"); // 標(biāo)題
// 3.郵件內(nèi)容"復(fù)合"對象
Multipart multipart = new MimeMultipart();
// 正文
BodyPart textPart = new MimeBodyPart();
// 參數(shù)1:正文內(nèi)容
// 參數(shù)2:內(nèi)容類型;字符編碼集
textPart.setContent("<b>世界</b>和平!?。?, "text/html;charset=utf-8");
// 附件
BodyPart imagePart = new MimeBodyPart();
imagePart.setFileName("look.jpg"); // 設(shè)置附件文件的顯示名稱
// 數(shù)據(jù)處理對象(讀取附件文件從本地磁盤進(jìn)行讀取)
imagePart.setDataHandler(
new DataHandler(
new ByteArrayDataSource(
Files.readAllBytes(Paths.get("D:\\net\\2.jpg")),
"application/octet-stream")));
// 添加至郵件內(nèi)容
multipart.addBodyPart(textPart); // 添加正文
multipart.addBodyPart(imagePart); // 添加附件
// 設(shè)置郵件內(nèi)容
msg.setContent(multipart);
// 3.發(fā)送
Transport.send(msg);
} catch (MessagingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
發(fā)送正文帶有內(nèi)嵌的郵件
我們可以選擇在郵件正文部分中用<img src=" cid=附屬名">,附件名通過.setHeader("Content-ID", "<別名>")的方法設(shè)置。文章來源地址http://www.zghlxwxcb.cn/news/detail-448217.html
public class Demo05 {
public static void main(String[] args) {
try {
// 創(chuàng)建Session
Session session = JavaMailUtils.createsession();
// 創(chuàng)建郵件
MimeMessage msg = new MimeMessage(session);
msg.setFrom(new InternetAddress("*********"));
msg.setRecipient(RecipientType.TO, new InternetAddress("*********"));
msg.setRecipients(RecipientType.CC, new InternetAddress[] {
new InternetAddress("*********"),
new InternetAddress("*********"),
new InternetAddress("*********"),
});
msg.setSubject("愛永不凋零!","utf-8");
// 郵件正文部分
BodyPart textBodyPart = new MimeBodyPart();
StringBuilder body = new StringBuilder();
body.append("<h1>世界和平</h1>");
body.append("<img src=\"cid:jue\"/>"); // 通過內(nèi)容ID引用附件圖片
textBodyPart.setContent(body.toString(), "text/html;charset=utf-8");
// 郵件附件部分
BodyPart imageBodyPart = new MimeBodyPart();
imageBodyPart.setFileName("son.jpg"); // 讀取名稱
imageBodyPart.setDataHandler( // 讀取附件內(nèi)容
new DataHandler(
new ByteArrayDataSource(
Files.readAllBytes(Paths.get("D:\\net\\1.jpg")),
"application/octet-stream")));
imageBodyPart.setHeader("Content-ID", "<jue>");
// 組合正文+附件
Multipart multipart = new MimeMultipart();
multipart.addBodyPart(textBodyPart); // 添加正文部分
multipart.addBodyPart(imageBodyPart); // 添加附件部分
// 設(shè)置郵件內(nèi)容
msg.setContent(multipart);
// 發(fā)送
Transport.send(msg);
} catch (MessagingException | IOException e) {
e.printStackTrace();
}
}
}
到了這里,關(guān)于用Java實現(xiàn)發(fā)送郵件——Java Email的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!