基于Java實現(xiàn)收發(fā)電子郵件功能
前言
Email就是電子郵件,我們平常使用的QQ郵箱,網(wǎng)易郵箱,F(xiàn)oxmail都是用來收發(fā)郵件的,利用Java程序也可以完成收發(fā)電子郵件的功能。
傳統(tǒng)的郵件是通過郵局投遞,從一個郵局到另一個郵局,最終到達用戶的郵箱。電子郵件與之的發(fā)送過程是類似的。電子郵件是從用戶電腦的郵件軟件(例如:Outlook),發(fā)送到郵件服務(wù)器上,可能經(jīng)過若干個郵件服務(wù)器的中轉(zhuǎn),最終到達對方郵件服務(wù)器上,收件方就可以用軟件接收郵件。
我們把類似Outlook這樣的郵件軟件稱為MUA:Mail User Agent:意思是給用戶服務(wù)的郵件代理;
郵件服務(wù)器稱為MTA:Mail Transfer Agent:意思是郵件中轉(zhuǎn)的代理
最終到達的郵件服務(wù)器稱為MDA:Mail Delivery Agent:郵件到達的代理。
郵件一旦到達MDA,就不在動了。實際上,電子郵件通常就存儲在MDA服務(wù)器的硬盤上,然后等收件人通過軟件或者登錄瀏覽器查看郵件。
郵件協(xié)議
常見的郵件協(xié)議有:POP3,SMTP,IMAP
POP3:是Post Office Protocol 3 的簡稱,POP3允許用戶從服務(wù)器上把郵件存儲到本地主機即自己的計算機)上,同時刪除保存在郵件服務(wù)器上的郵件。
SMTP:全稱是“Simple Mail Transfer Protocol”,即簡單郵件傳輸協(xié)議。它是一組用于從源地址到目的地址傳輸郵件的規(guī)范,通過它來控制郵件的中轉(zhuǎn)方式。SMTP協(xié)議屬于TCP/IP協(xié)議簇,幫助每臺計算機在發(fā)送或中轉(zhuǎn)信件時找到下一個目的地。
SMTP認證,就是要求必須在提供了賬戶名和密碼之后才能登錄SMTP服務(wù)器,使得那些垃圾郵件的散播者無可乘之機。增加SMTP認證的目的是為了使用戶避免受到垃圾郵件的侵擾。
IMAP:全稱是Internet Mail Access Protocol,即交互式郵件存取協(xié)議,它是跟POP3類似郵件訪問標準協(xié)議之一。不同的是,開啟了IMAP后,您在電子郵件客戶端收取的郵件仍然保留在服務(wù)器上,同時在客戶端上的操作都會反饋到服務(wù)器上,如:刪除郵件,標記已讀等,服務(wù)器上的郵件也會做相應(yīng)的動作。所以無論從瀏覽器登錄郵箱或者客戶端 軟件登錄郵箱,看到的郵件以及狀態(tài)都是一致的。
IMAP和POP3有什么區(qū)別?
1.POP3協(xié)議允許電子郵件客戶端下載服務(wù)器上的郵件,但是在客戶端的操作(如移動郵、標記已讀等),不會反饋到服務(wù)器上,比如通過客戶端收取了郵箱中的3封郵件并移動到其他文件夾,郵箱服務(wù)器上的這些郵件是沒有同時被移動的。
2.IMAP提供webmail與電子郵件客戶端之間的雙向通信,客戶端的操作都會反饋到服務(wù)器上,對郵件進行的操作,服務(wù)器上的郵件也會做相應(yīng)的動作。
準備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
準備好SMTP登錄信息后,我們首先要把JavaMail相關(guān)的依賴Jar包javax.mail-1.6.2.jar加入至當前項目。
jar包:
鏈接:https://pan.baidu.com/s/1H8pnkVskG8casxIoUCq69Q 提取碼:9aym
以126郵箱發(fā)送至QQ郵箱為例:
1.首先在郵箱中開啟此服務(wù)
新增授權(quán)密碼
2.在Java中進行郵件的發(fā)送(郵件只包含文本)
以25端口為例,連接SMTP服務(wù)器時,需要準備一個Properties對象,填入相關(guān)信息。最后獲取Session實例時,如果服務(wù)器需要認證,還需要傳入一個Authenticator對象,并返回指定的用戶名和口令。當我們獲取到Session實例后,打開調(diào)試模式可以看到SMTP通信的詳細內(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會話 * @author YangYing * */ public class Demo01 { public static void main(String[] args) { //SMTP服務(wù)器地址 String smtp = "smtp.126.com"; //郵箱賬號和密碼 String userName = "yy0525xxxxx@126.com"; String password = "xxxxxxxxxxxx"; //SMTP服務(wù)器的連接信息 Properties props = new Properties(); props.put("mail.smtp.host", smtp);//SMTP主機名 props.put("mail.smtp.port", "25");//主機端口號 props.put("mail.smtp.auth", "true");//是否需要用戶認證 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); } }); //開啟調(diào)試模式 session.setDebug(true); System.out.println(session); } }
發(fā)送郵件
1.先創(chuàng)建一個Session對象
Session session = JavaMailUtil.crateSession();
2.創(chuàng)建郵件對象(Message抽象類的子類)
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”標簽(控制文本的格式)
msg.setText("我<b>是你</b>!","utf-8","html");//<b>標簽加粗字體
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會話 Session session = JavaMailUtil.crateSession(); //2.創(chuàng)建郵件對象(Message抽象類的子類) 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”標簽(控制文本的格式) msg.setText("我<b>是你</b>!","utf-8","html"); //3.發(fā)送 Transport.send(msg); } catch (MessagingException e) { e.printStackTrace(); } } }
3.在Java中進行郵件的發(fā)送(郵件包含文本和附件(圖片))
在上面代碼基礎(chǔ)上
1.設(shè)置郵件內(nèi)容
郵件正文內(nèi)容
內(nèi)容類型:設(shè)置字符編碼集
BodyPart textBodyPart = new MimeBodyPart(); StringBuilder body = new StringBuilder(); body.append("<h1>xz</h1>"); body.append("<img src=\"cid:zhanzi\"/>");//通過內(nèi)容ID引用附件圖片 textBodyPart.setContent(body.toString(),"text/html;charset= utf-8");
2.郵件附件內(nèi)容
BodyPart imgBodyPart = new MimeBodyPart(); imgBodyPart.setFileName("xz.jpg");//附件名稱 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類是一個封裝的類,可重復利用
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"; //郵箱賬號和密碼 String userName = "yy05xxxxxx@126.com"; String password = "xxxxxxxxxxxx"; //SMTP服務(wù)器的連接信息 Properties props = new Properties(); props.put("mail.smtp.host", smtp);//SMTP主機名 props.put("mail.smtp.port", "25");//主機端口號 props.put("mail.smtp.auth", "true");//是否需要用戶認證 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); } }); //開啟調(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)建郵件對象 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)容類型:設(shè)置字符編碼集 BodyPart textBodyPart = new MimeBodyPart(); StringBuilder body = new StringBuilder(); body.append("<h1>xz</h1>"); body.append("<img src=\"cid:zhanzi\"/>");//通過內(nèi)容ID引用附件圖片 textBodyPart.setContent(body.toString(),"text/html;charset= utf-8"); //郵件附件內(nèi)容 BodyPart imgBodyPart = new MimeBodyPart(); imgBodyPart.setFileName("xz.jpg");//附件名稱 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實現(xiàn)收發(fā)電子郵件功能的詳細內(nèi)容,更多關(guān)于Java收發(fā)電子郵件的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java并發(fā)編程之ReentrantLock實現(xiàn)原理及源碼剖析
ReentrantLock 是常用的鎖,相對于Synchronized ,lock鎖更人性化,閱讀性更強,文中將會詳細的說明,請君往下閱讀2021-09-09Java實現(xiàn)駝峰和下劃線互相轉(zhuǎn)換的示例代碼
Java對各種變量、方法和類等要素命名時使用的字符序列稱為標識符,凡是自己可以起名字的地方都叫標識符。本文為大家分享了Java中如何實現(xiàn)駝峰命名與下劃線命名的互轉(zhuǎn),感興趣的可以了解一下2022-05-05Java實現(xiàn)數(shù)據(jù)更新和事件通知的觀察者模式
Java觀察者模式是一種行為型設(shè)計模式,用于實現(xiàn)對象間的一對多依賴關(guān)系。當一個對象的狀態(tài)發(fā)生改變時,它的所有依賴對象都會收到通知并自動更新。觀察者模式可以實現(xiàn)松耦合,增強了系統(tǒng)的可維護性和可拓展性2023-04-04JDK源碼之線程并發(fā)協(xié)調(diào)神器CountDownLatch和CyclicBarrier詳解
我一直認為程序是對于現(xiàn)實世界的邏輯描述,而在現(xiàn)實世界中很多事情都需要各方協(xié)調(diào)合作才能完成,就好比完成一個平臺的交付不可能只靠一個人,而需要研發(fā)、測試、產(chǎn)品以及項目經(jīng)理等不同角色人員進行通力合作才能完成最終的交付2022-02-02