基于Java實(shí)現(xiàn)收發(fā)電子郵件功能
前言
Email就是電子郵件,我們平常使用的QQ郵箱,網(wǎng)易郵箱,F(xiàn)oxmail都是用來(lái)收發(fā)郵件的,利用Java程序也可以完成收發(fā)電子郵件的功能。
傳統(tǒng)的郵件是通過(guò)郵局投遞,從一個(gè)郵局到另一個(gè)郵局,最終到達(dá)用戶的郵箱。電子郵件與之的發(fā)送過(guò)程是類(lèi)似的。電子郵件是從用戶電腦的郵件軟件(例如:Outlook),發(fā)送到郵件服務(wù)器上,可能經(jīng)過(guò)若干個(gè)郵件服務(wù)器的中轉(zhuǎn),最終到達(dá)對(duì)方郵件服務(wù)器上,收件方就可以用軟件接收郵件。

我們把類(lèi)似Outlook這樣的郵件軟件稱(chēng)為MUA:Mail User Agent:意思是給用戶服務(wù)的郵件代理;
郵件服務(wù)器稱(chēng)為MTA:Mail Transfer Agent:意思是郵件中轉(zhuǎn)的代理
最終到達(dá)的郵件服務(wù)器稱(chēng)為MDA:Mail Delivery Agent:郵件到達(dá)的代理。
郵件一旦到達(dá)MDA,就不在動(dòng)了。實(shí)際上,電子郵件通常就存儲(chǔ)在MDA服務(wù)器的硬盤(pán)上,然后等收件人通過(guò)軟件或者登錄瀏覽器查看郵件。
郵件協(xié)議
常見(jiàn)的郵件協(xié)議有:POP3,SMTP,IMAP
POP3:是Post Office Protocol 3 的簡(jiǎn)稱(chēng),POP3允許用戶從服務(wù)器上把郵件存儲(chǔ)到本地主機(jī)即自己的計(jì)算機(jī))上,同時(shí)刪除保存在郵件服務(wù)器上的郵件。
SMTP:全稱(chēng)是“Simple Mail Transfer Protocol”,即簡(jiǎn)單郵件傳輸協(xié)議。它是一組用于從源地址到目的地址傳輸郵件的規(guī)范,通過(guò)它來(lái)控制郵件的中轉(zhuǎn)方式。SMTP協(xié)議屬于TCP/IP協(xié)議簇,幫助每臺(tái)計(jì)算機(jī)在發(fā)送或中轉(zhuǎn)信件時(shí)找到下一個(gè)目的地。
SMTP認(rèn)證,就是要求必須在提供了賬戶名和密碼之后才能登錄SMTP服務(wù)器,使得那些垃圾郵件的散播者無(wú)可乘之機(jī)。增加SMTP認(rèn)證的目的是為了使用戶避免受到垃圾郵件的侵?jǐn)_。
IMAP:全稱(chēng)是Internet Mail Access Protocol,即交互式郵件存取協(xié)議,它是跟POP3類(lèi)似郵件訪問(wèn)標(biāo)準(zhǔn)協(xié)議之一。不同的是,開(kāi)啟了IMAP后,您在電子郵件客戶端收取的郵件仍然保留在服務(wù)器上,同時(shí)在客戶端上的操作都會(huì)反饋到服務(wù)器上,如:刪除郵件,標(biāo)記已讀等,服務(wù)器上的郵件也會(huì)做相應(yīng)的動(dòng)作。所以無(wú)論從瀏覽器登錄郵箱或者客戶端 軟件登錄郵箱,看到的郵件以及狀態(tài)都是一致的。
IMAP和POP3有什么區(qū)別?
1.POP3協(xié)議允許電子郵件客戶端下載服務(wù)器上的郵件,但是在客戶端的操作(如移動(dòng)郵、標(biāo)記已讀等),不會(huì)反饋到服務(wù)器上,比如通過(guò)客戶端收取了郵箱中的3封郵件并移動(dòng)到其他文件夾,郵箱服務(wù)器上的這些郵件是沒(méi)有同時(shí)被移動(dòng)的。
2.IMAP提供webmail與電子郵件客戶端之間的雙向通信,客戶端的操作都會(huì)反饋到服務(wù)器上,對(duì)郵件進(jìn)行的操作,服務(wù)器上的郵件也會(huì)做相應(yīng)的動(dòng)作。
準(zhǔn)備SMTP登錄信息
常用郵件服務(wù)商的SMTP信息:
·QQ郵箱: SMTP服務(wù)器是smtp.qq.com,端口是465 / 587
·163郵箱:SMTP服務(wù)器是smtp.163.com,端口是465126郵箱: SMTP服務(wù)器是smtp
.126.com,端口是25
.Gmail郵箱:SMTP服務(wù)器是smtp.gmail.com,端口是465 / 587
準(zhǔn)備好SMTP登錄信息后,我們首先要把JavaMail相關(guān)的依賴(lài)Jar包javax.mail-1.6.2.jar加入至當(dāng)前項(xiàng)目。

jar包:
鏈接:https://pan.baidu.com/s/1H8pnkVskG8casxIoUCq69Q 提取碼:9aym
以126郵箱發(fā)送至QQ郵箱為例:
1.首先在郵箱中開(kāi)啟此服務(wù)

新增授權(quán)密碼

2.在Java中進(jìn)行郵件的發(fā)送(郵件只包含文本)
以25端口為例,連接SMTP服務(wù)器時(shí),需要準(zhǔn)備一個(gè)Properties對(duì)象,填入相關(guān)信息。最后獲取Session實(shí)例時(shí),如果服務(wù)器需要認(rèn)證,還需要傳入一個(gè)Authenticator對(duì)象,并返回指定的用戶名和口令。當(dāng)我們獲取到Session實(shí)例后,打開(kāi)調(diào)試模式可以看到SMTP通信的詳細(xì)內(nèi)容,便于調(diào)試。
package com.yy.demo;
import java.util.Properties;
import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
/**
* 創(chuàng)建session會(huì)話
* @author YangYing
*
*/
public class Demo01 {
public static void main(String[] args) {
//SMTP服務(wù)器地址
String smtp = "smtp.126.com";
//郵箱賬號(hào)和密碼
String userName = "yy0525xxxxx@126.com";
String password = "xxxxxxxxxxxx";
//SMTP服務(wù)器的連接信息
Properties props = new Properties();
props.put("mail.smtp.host", smtp);//SMTP主機(jī)名
props.put("mail.smtp.port", "25");//主機(jī)端口號(hào)
props.put("mail.smtp.auth", "true");//是否需要用戶認(rèn)證
props.put("mail.smtp.starttls.enable", "true");//啟用TLS加密
//創(chuàng)建Session
Session session = Session.getInstance(props, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(userName,password);
}
});
//開(kāi)啟調(diào)試模式
session.setDebug(true);
System.out.println(session);
}
}
發(fā)送郵件
1.先創(chuàng)建一個(gè)Session對(duì)象
Session session = JavaMailUtil.crateSession();
2.創(chuàng)建郵件對(duì)象(Message抽象類(lèi)的子類(lèi))
RecipientType.TO代表發(fā)送人
RecipientType.CC代表抄送人
MimeMessage msg = new MimeMessage(session);//傳入session
msg.setFrom(new InternetAddress("yy052xxxx@126.com"));//發(fā)件人
msg.setRecipient(RecipientType.TO,new InternetAddress("2452845234@qq.com"));//發(fā)送人
msg.setSubject("你好呀","utf-8");
3.郵件正文包含有“html”標(biāo)簽(控制文本的格式)
msg.setText("我<b>是你</b>!","utf-8","html");//<b>標(biāo)簽加粗字體
4.發(fā)送
Transport.send(msg);
整體代碼如下:
package com.yy.demo;
import java.net.InetAddress;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMessage.RecipientType;
/**
* 發(fā)送郵件
* @author YangYing
*
*/
public class Demo02 {
public static void main(String[] args) {
try {
//1.創(chuàng)建Session會(huì)話
Session session = JavaMailUtil.crateSession();
//2.創(chuàng)建郵件對(duì)象(Message抽象類(lèi)的子類(lèi))
MimeMessage msg = new MimeMessage(session);//傳入session
msg.setFrom(new InternetAddress("yy0525xxx@126.com"));//發(fā)件人
msg.setRecipient(RecipientType.TO,new InternetAddress("2452845234@qq.com"));//收件人
msg.setSubject("你好呀","utf-8");
//郵件正文包含有“html”標(biāo)簽(控制文本的格式)
msg.setText("我<b>是你</b>!","utf-8","html");
//3.發(fā)送
Transport.send(msg);
} catch (MessagingException e) {
e.printStackTrace();
}
}
}
3.在Java中進(jìn)行郵件的發(fā)送(郵件包含文本和附件(圖片))
在上面代碼基礎(chǔ)上
1.設(shè)置郵件內(nèi)容
郵件正文內(nèi)容
內(nèi)容類(lèi)型:設(shè)置字符編碼集
BodyPart textBodyPart = new MimeBodyPart();
StringBuilder body = new StringBuilder();
body.append("<h1>xz</h1>");
body.append("<img src=\"cid:zhanzi\"/>");//通過(guò)內(nèi)容ID引用附件圖片
textBodyPart.setContent(body.toString(),"text/html;charset= utf-8");
2.郵件附件內(nèi)容
BodyPart imgBodyPart = new MimeBodyPart();
imgBodyPart.setFileName("xz.jpg");//附件名稱(chēng)
imgBodyPart.setDataHandler(//讀取附件內(nèi)容
new DataHandler(
new ByteArrayDataSource(
Files.readAllBytes(Paths.get("C:\\Users\\LENOVO\\Pictures\\Saved Pictures\\微信圖片_20200228144031.jpg")),
"application/octet-stream")));
imgBodyPart.setHeader("Content-ID", "<zhanzi>");//設(shè)置內(nèi)容ID
3.組合正文+附件
郵件內(nèi)容
Multipart multipart = new MimeMultipart();
multipart.addBodyPart(textBodyPart);
multipart.addBodyPart(imgBodyPart);
msg.setContent(multipart);
4.發(fā)送
Transport.send(msg);
5.整體代碼
JavaMailUtil類(lèi)是一個(gè)封裝的類(lèi),可重復(fù)利用
package com.yy.demo;
import java.util.Properties;
import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
public class JavaMailUtil {
public static Session crateSession() {
//SMTP服務(wù)器地址
String smtp = "smtp.126.com";
//郵箱賬號(hào)和密碼
String userName = "yy05xxxxxx@126.com";
String password = "xxxxxxxxxxxx";
//SMTP服務(wù)器的連接信息
Properties props = new Properties();
props.put("mail.smtp.host", smtp);//SMTP主機(jī)名
props.put("mail.smtp.port", "25");//主機(jī)端口號(hào)
props.put("mail.smtp.auth", "true");//是否需要用戶認(rèn)證
props.put("mail.smtp.starttls.enable", "true");//啟用TLS加密
//創(chuàng)建Session
Session session = Session.getInstance(props, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(userName,password);
}
});
//開(kāi)啟調(diào)試模式
session.setDebug(true);
return session;
}
}
package com.yy.demo;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import javax.activation.DataHandler;
import javax.mail.BodyPart;
import javax.mail.MessagingException;
import javax.mail.Multipart;
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.MimeMessage.RecipientType;
import javax.mail.internet.MimeMultipart;
import javax.mail.util.ByteArrayDataSource;
public class Demo04 {
public static void main(String[] args) {
try {
//創(chuàng)建Session
Session session = JavaMailUtil.crateSession();
//創(chuàng)建郵件對(duì)象
MimeMessage msg = new MimeMessage(session);//傳入session
msg.setFrom(new InternetAddress("yy05250915@126.com"));//發(fā)件人
msg.setRecipient(RecipientType.TO, new InternetAddress("2452845234@qq.com"));
msg.setSubject("我還是你!","utf-8");
//設(shè)置郵件內(nèi)容
//郵件正文內(nèi)容
//內(nèi)容類(lèi)型:設(shè)置字符編碼集
BodyPart textBodyPart = new MimeBodyPart();
StringBuilder body = new StringBuilder();
body.append("<h1>xz</h1>");
body.append("<img src=\"cid:zhanzi\"/>");//通過(guò)內(nèi)容ID引用附件圖片
textBodyPart.setContent(body.toString(),"text/html;charset= utf-8");
//郵件附件內(nèi)容
BodyPart imgBodyPart = new MimeBodyPart();
imgBodyPart.setFileName("xz.jpg");//附件名稱(chēng)
imgBodyPart.setDataHandler(//讀取附件內(nèi)容
new DataHandler(
new ByteArrayDataSource(
Files.readAllBytes(Paths.get("C:\\Users\\LENOVO\\Pictures\\Saved Pictures\\微信圖片_20200228144031.jpg")),
"application/octet-stream")));
imgBodyPart.setHeader("Content-ID", "<zhanzi>");//設(shè)置內(nèi)容ID
//組合正文+附件
//郵件內(nèi)容
Multipart multipart = new MimeMultipart();
multipart.addBodyPart(textBodyPart);
multipart.addBodyPart(imgBodyPart);
msg.setContent(multipart);
//發(fā)送
Transport.send(msg);
} catch (MessagingException | IOException e) {
e.printStackTrace();
}
}
}
郵件內(nèi)容

以上就是基于Java實(shí)現(xiàn)收發(fā)電子郵件功能的詳細(xì)內(nèi)容,更多關(guān)于Java收發(fā)電子郵件的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Spring Boot整合mybatis(一)實(shí)例代碼
sprig-boot是一個(gè)微服務(wù)架構(gòu),加快了spring工程快速開(kāi)發(fā),以及簡(jiǎn)便了配置。接下來(lái)開(kāi)始spring-boot與mybatis的整合2017-07-07
SpringBoot集成EasyExcel的應(yīng)用場(chǎng)景分析
這篇文章主要介紹了SpringBoot集成EasyExcel的應(yīng)用場(chǎng)景,java領(lǐng)域解析、生成excel比較有名的框架有apache poi、jxl等,今天通過(guò)實(shí)例代碼給大家詳細(xì)介紹,需要的朋友可以參考下2021-07-07
詳解獲取Spring MVC中所有RequestMapping以及對(duì)應(yīng)方法和參數(shù)
本篇文章主要介紹了詳解獲取Spring MVC中所有RequestMapping以及對(duì)應(yīng)方法和參數(shù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-03-03
Java面向?qū)ο蠡A(chǔ)知識(shí)之?dāng)?shù)組和鏈表
這篇文章主要介紹了Java面向?qū)ο蟮闹當(dāng)?shù)組和鏈表,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java基礎(chǔ)的小伙伴們有很好的幫助,需要的朋友可以參考下2021-11-11
Java web數(shù)據(jù)可視化實(shí)現(xiàn)原理解析
這篇文章主要介紹了Java web數(shù)據(jù)可視化實(shí)現(xiàn)原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03
spring boot實(shí)現(xiàn)圖片上傳和下載功能
這篇文章主要為大家詳細(xì)介紹了spring boot實(shí)現(xiàn)圖片上傳和下載功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-02-02

