java中javamail收發(fā)郵件實(shí)現(xiàn)方法
概述
1、郵件相關(guān)的標(biāo)準(zhǔn)
廠商所提供的 JavaMail 服務(wù)程序可以有選擇地實(shí)現(xiàn)某些郵件協(xié)議,常見的郵件協(xié)議包括:
SMTP(Simple Mail Transfer Protocol) :即簡單郵件傳輸協(xié)議,它是一組用于由源地址到目的地址傳送郵件的規(guī)則,由它來控制信件的中轉(zhuǎn)方式。
POP3(Post Office Protocol – Version 3) :即郵局協(xié)議版本 3 ,用于接收電子郵件的標(biāo)準(zhǔn)協(xié)議。
IMAP(Internet Mail Access Protocol) :即 Internet 郵件訪問協(xié)議。是 POP3 的替代協(xié)議。
這三種協(xié)議都有對應(yīng) SSL 加密傳輸?shù)膮f(xié)議,分別是 SMTPS , POP3S 和 IMAPS 。
MIME(Multipurpose Internet Mail Extensions) :即多用途因特網(wǎng)郵件擴(kuò)展標(biāo)準(zhǔn)。它不是郵件傳輸協(xié)議。但對傳輸內(nèi)容的消息、附件及其它的內(nèi)容定義了格式。
2、JavaMail 簡介
JavaMail 是由 Sun 發(fā)布的用來處理 email 的 API 。它并沒有包含在 Java SE 中,而是作為 Java EE 的一部分。
mail.jar :此 JAR 文件包含 JavaMail API 和 Sun 提供的 SMTP 、 IMAP 和 POP3 服務(wù)提供程序;
activation.jar :此 JAR 文件包含 JAF API 和 Sun 的實(shí)現(xiàn)。
JavaMail 包中用于處理電子郵件的核心類是: Properties 、 Session 、 Message 、 Address 、 Authenticator 、 Transport 、 Store 等。
3、郵件傳輸過程
如上圖,電子郵件的處理步驟如下:
- 創(chuàng)建一個 Session 對象。
- Session 對象創(chuàng)建一個 Transport 對象 /Store 對象,用來發(fā)送 / 保存郵件。
- Transport 對象 /Store 對象連接郵件服務(wù)器。
- Transport 對象 /Store 對象創(chuàng)建一個 Message 對象 ( 也就是郵件內(nèi)容 ) 。
- Transport 對象發(fā)送郵件; Store 對象獲取郵箱的郵件。
4、Message 結(jié)構(gòu)
MimeMessage 類:代表整封郵件。
MimeBodyPart 類:代表郵件的一個 MIME 信息。
MimeMultipart 類:代表一個由多個 MIME 信息組合成的組合 MIME 信息。
5、JavaMail 的核心類
JavaMail 對收發(fā)郵件進(jìn)行了高級的抽象,形成了一些關(guān)鍵的的接口和類,它們構(gòu)成了程序的基礎(chǔ),下面我們分別來了解一下這些最常見的對象。
6、java.util.Properties 類 ( 屬性對象 )
java.util.Properties 類代表一組屬性集合。
它的每一個鍵和值都是 String 類型。
由于 JavaMail 需要和郵件服務(wù)器進(jìn)行通信,這就要求程序提供許多諸如服務(wù)器地址、端口、用戶名、密碼等信息, JavaMail 通過 Properties 對象封裝這些屬性信息。
例: 如下面的代碼封裝了幾個屬性信息:
Properties prop = new Properties(); prop.setProperty("mail.debug", "true"); prop.setProperty("mail.host", "[email protected]"); prop.setProperty("mail.transport.protocol", "smtp"); prop.setProperty("mail.smtp.auth", "true");
針對不同的的郵件協(xié)議, JavaMail 規(guī)定了服務(wù)提供者必須支持一系列屬性,
下表是一些常見屬性(屬性值都以 String 類型進(jìn)行設(shè)置,屬性類型欄僅表示屬性是如何被解析的):
7、javax.mail.Session 類 ( 會話對象 )
Session 表示一個郵件會話。
Session 的主要作用包括兩個方面:
接收各種配置屬性信息:通過 Properties 對象設(shè)置的屬性信息;
初始化 JavaMail 環(huán)境:根據(jù) JavaMail 的配置文件,初始化 JavaMail 環(huán)境,以便通過 Session 對象創(chuàng)建其他重要類的實(shí)例。
JavaMail 在 Jar 包的 META-INF 目錄下,通過以下文件提供了基本配置信息,以便 session 能夠根據(jù)這個配置文件加載提供者的實(shí)現(xiàn)類:
javamail.default.providers ;
javamail.default.address.map 。
例:
Properties props = new Properties(); props.setProperty("mail.transport.protocol", "smtp"); Session session = Session.getInstance(props);
8、javax.mail.Transport 類 ( 郵件傳輸 )
郵件操作只有發(fā)送或接收兩種處理方式。
JavaMail 將這兩種不同操作描述為傳輸( javax.mail.Transport )和存儲( javax.mail.Store ),傳輸對應(yīng)郵件的發(fā)送,而存儲對應(yīng)郵件的接收。
getTransport : Session 類中的 getTransport () 有多個重載方法,可以用來創(chuàng)建 Transport 對象。
connect : 如果設(shè)置了認(rèn)證命令—— mail.smtp.auth ,那么使用 Transport 類的 connect 方法連接服務(wù)器時,則必須加上用戶名和密碼。
sendMessage : Transport 類的 sendMessage 方法用來發(fā)送郵件消息。
close : Transport 類的 close 方法用來關(guān)閉和郵件服務(wù)器的連接。
9、javax.mail.Store 類 ( 郵件存儲 )
getStore : Session 類中的 getStore () 有多個重載方法,可以用來創(chuàng)建 Store 對象。
connect : 如果設(shè)置了認(rèn)證命令—— mail.smtp.auth ,那么使用 Store 類的 connect 方法連接服務(wù)器時,則必須加上用戶名和密碼。
getFolder : Store 類的 getFolder 方法可以 獲取郵箱內(nèi)的郵件夾 Folder 對象
close : Store 類的 close 方法用來關(guān)閉和郵件服務(wù)器的連接。
10、javax.mail.Message( 消息對象 )
javax.mail.Message 是個抽象類,只能用子類去實(shí)例化,多數(shù)情況下為 javax.mail.internet.MimeMessage 。
MimeMessage 代表 MIME 類型的電子郵件消息。
要創(chuàng)建一個 Message ,需要將 Session 對象傳遞給 MimeMessage 構(gòu)造器:
MimeMessage message = new MimeMessage(session);
注意:還存在其它構(gòu)造器,如用按 RFC822 格式的輸入流來創(chuàng)建消息。
setFrom :設(shè)置郵件的發(fā)件人
setRecipient :設(shè)置郵件的發(fā)送人、抄送人、密送人
三種預(yù)定義的地址類型是:
Message.RecipientType.TO :收件人
Message.RecipientType.CC :抄送人
Message.RecipientType.BCC :密送人
setSubject :設(shè)置郵件的主題
setContent :設(shè)置郵件內(nèi)容
setText :如果郵件內(nèi)容是純文本,可以使用此接口設(shè)置文本內(nèi)容。
10、javax.mail.Address( 地址 )
一旦您創(chuàng)建了 Session 和 Message ,并將內(nèi)容填入消息后,就可以用 Address 確定信件地址了。和 Message 一樣, Address 也是個抽象類。您用的是 javax.mail.internet.InternetAddress 類。
若創(chuàng)建的地址只包含電子郵件地址,只要傳遞電子郵件地址到構(gòu)造器就行了。
例:
Address address = new InternetAddress("[email protected]");
Authenticator :認(rèn)證者
與 java.net 類一樣, JavaMail API 也可以利用 Authenticator 通過用戶名和密碼訪問受保護(hù)的資源。對于 JavaMail API 來說,這些資源就是郵件服務(wù)器。 JavaMail Authenticator 在 javax.mail 包中,而且它和 java.net 中同名的類 Authenticator 不同。兩者并不共享同一個 Authenticator ,因?yàn)?JavaMail API 用于 Java 1.1 ,它沒有 java.net 類別。
要使用 Authenticator ,先創(chuàng)建一個抽象類的子類,并從 getPasswordAuthentication() 方法中返回 PasswordAuthentication 實(shí)例。創(chuàng)建完成后,您必需向 session 注冊 Authenticator 。然后,在需要認(rèn)證的時候,就會通知 Authenticator 。您可以彈出窗口,也可以從配置文件中(雖然沒有加密是不安全的)讀取用戶名和密碼,將它們作為 PasswordAuthentication 對象返回給調(diào)用程序。
例:
Properties props = new Properties(); Authenticator auth = new MyAuthenticator(); Session session = Session.getDefaultInstance(props, auth);
實(shí)例
發(fā)送文本郵件
public static void main(String[] args) throws Exception { Properties prop = new Properties(); prop.setProperty("mail.debug", "true"); prop.setProperty("mail.host", MAIL_SERVER_HOST); prop.setProperty("mail.transport.protocol", "smtp"); prop.setProperty("mail.smtp.auth", "true"); // 1、創(chuàng)建session Session session = Session.getInstance(prop); Transport ts = null; // 2、通過session得到transport對象 ts = session.getTransport(); // 3、連上郵件服務(wù)器 ts.connect(MAIL_SERVER_HOST, USER, PASSWORD); // 4、創(chuàng)建郵件 MimeMessage message = new MimeMessage(session); // 郵件消息頭 message.setFrom(new InternetAddress(MAIL_FROM)); // 郵件的發(fā)件人 message.setRecipient(Message.RecipientType.TO, new InternetAddress(MAIL_TO)); // 郵件的收件人 message.setRecipient(Message.RecipientType.CC, new InternetAddress(MAIL_CC)); // 郵件的抄送人 message.setRecipient(Message.RecipientType.BCC, new InternetAddress(MAIL_BCC)); // 郵件的密送人 message.setSubject("測試文本郵件"); // 郵件的標(biāo)題 // 郵件消息體 message.setText("天下無雙。"); // 5、發(fā)送郵件 ts.sendMessage(message, message.getAllRecipients()); ts.close(); }
發(fā)送 HTML 格式的郵件
public static void main(String[] args) throws Exception { Properties prop = new Properties(); prop.setProperty("mail.debug", "true"); prop.setProperty("mail.host", MAIL_SERVER_HOST); prop.setProperty("mail.transport.protocol", "smtp"); prop.setProperty("mail.smtp.auth", "true"); // 1、創(chuàng)建session Session session = Session.getInstance(prop); Transport ts = null; // 2、通過session得到transport對象 ts = session.getTransport(); // 3、連上郵件服務(wù)器 ts.connect(MAIL_SERVER_HOST, USER, PASSWORD); // 4、創(chuàng)建郵件 MimeMessage message = new MimeMessage(session); // 郵件消息頭 message.setFrom(new InternetAddress(MAIL_FROM)); // 郵件的發(fā)件人 message.setRecipient(Message.RecipientType.TO, new InternetAddress(MAIL_TO)); // 郵件的收件人 message.setRecipient(Message.RecipientType.CC, new InternetAddress(MAIL_CC)); // 郵件的抄送人 message.setRecipient(Message.RecipientType.BCC, new InternetAddress(MAIL_BCC)); // 郵件的密送人 message.setSubject("測試HTML郵件"); // 郵件的標(biāo)題 String htmlContent = "<h1>Hello</h1>" + "<p>顯示圖片<img src='cid:abc.jpg'>1.jpg</p>"; MimeBodyPart text = new MimeBodyPart(); text.setContent(htmlContent, "text/html;charset=UTF-8"); MimeBodyPart image = new MimeBodyPart(); DataHandler dh = new DataHandler(new FileDataSource("D://[04]Temp//img//1.jpg")); image.setDataHandler(dh); image.setContentID("abc.jpg"); // 描述數(shù)據(jù)關(guān)系 MimeMultipart mm = new MimeMultipart(); mm.addBodyPart(text); mm.addBodyPart(image); mm.setSubType("related"); message.setContent(mm); message.saveChanges(); // 5、發(fā)送郵件 ts.sendMessage(message, message.getAllRecipients()); ts.close(); }
發(fā)送帶附件的郵件
public static void main(String[] args) throws Exception { Properties prop = new Properties(); prop.setProperty("mail.debug", "true"); prop.setProperty("mail.host", MAIL_SERVER_HOST); prop.setProperty("mail.transport.protocol", "smtp"); prop.setProperty("mail.smtp.auth", "true"); // 1、創(chuàng)建session Session session = Session.getInstance(prop); Transport ts = null; // 2、通過session得到transport對象 ts = session.getTransport(); // 3、連上郵件服務(wù)器 ts.connect(MAIL_SERVER_HOST, USER, PASSWORD); // 4、創(chuàng)建郵件 MimeMessage message = new MimeMessage(session); // 郵件消息頭 message.setFrom(new InternetAddress(MAIL_FROM)); // 郵件的發(fā)件人 message.setRecipient(Message.RecipientType.TO, new InternetAddress(MAIL_TO)); // 郵件的收件人 message.setRecipient(Message.RecipientType.CC, new InternetAddress(MAIL_CC)); // 郵件的抄送人 message.setRecipient(Message.RecipientType.BCC, new InternetAddress(MAIL_BCC)); // 郵件的密送人 message.setSubject("測試帶附件郵件"); // 郵件的標(biāo)題 MimeBodyPart text = new MimeBodyPart(); text.setContent("郵件中有兩個附件。", "text/html;charset=UTF-8"); // 描述數(shù)據(jù)關(guān)系 MimeMultipart mm = new MimeMultipart(); mm.setSubType("related"); mm.addBodyPart(text); String[] files = { "D://[04]Temp//img//1.jpg", "D://[04]Temp//img//2.jpg" }; // 添加郵件附件 for (String filename : files) { MimeBodyPart attachPart = new MimeBodyPart(); attachPart.attachFile(filename); mm.addBodyPart(attachPart); } message.setContent(mm); message.saveChanges(); // 5、發(fā)送郵件 ts.sendMessage(message, message.getAllRecipients()); ts.close(); }
獲取郵箱中的郵件
public class StoreMail { final static String USER = "robot"; // 用戶名 final static String PASSWORD = "password520"; // 密碼 public final static String MAIL_SERVER_HOST = "mail.***.com"; // 郵箱服務(wù)器 public final static String TYPE_HTML = "text/html;charset=UTF-8"; // 文本內(nèi)容類型 public final static String MAIL_FROM = "[email protected]"; // 發(fā)件人 public final static String MAIL_TO = "[email protected]"; // 收件人 public final static String MAIL_CC = "[email protected]"; // 抄送人 public final static String MAIL_BCC = "[email protected]"; // 密送人 public static void main(String[] args) throws Exception { // 創(chuàng)建一個有具體連接信息的Properties對象 Properties prop = new Properties(); prop.setProperty("mail.debug", "true"); prop.setProperty("mail.store.protocol", "pop3"); prop.setProperty("mail.pop3.host", MAIL_SERVER_HOST); // 1、創(chuàng)建session Session session = Session.getInstance(prop); // 2、通過session得到Store對象 Store store = session.getStore(); // 3、連上郵件服務(wù)器 store.connect(MAIL_SERVER_HOST, USER, PASSWORD); // 4、獲得郵箱內(nèi)的郵件夾 Folder folder = store.getFolder("inbox"); folder.open(Folder.READ_ONLY); // 獲得郵件夾Folder內(nèi)的所有郵件Message對象 Message[] messages = folder.getMessages(); for (int i = 0; i < messages.length; i++) { String subject = messages[i].getSubject(); String from = (messages[i].getFrom()[0]).toString(); System.out.println("第 " + (i + 1) + "封郵件的主題:" + subject); System.out.println("第 " + (i + 1) + "封郵件的發(fā)件人地址:" + from); } // 5、關(guān)閉 folder.close(false); store.close(); } }
轉(zhuǎn)發(fā)郵件
例:獲取指定郵件夾下的第一封郵件并轉(zhuǎn)發(fā)
public static void main(String[] args) throws Exception { Properties prop = new Properties(); prop.put("mail.store.protocol", "pop3"); prop.put("mail.pop3.host", MAIL_SERVER_HOST); prop.put("mail.pop3.starttls.enable", "true"); prop.put("mail.smtp.auth", "true"); prop.put("mail.smtp.host", MAIL_SERVER_HOST); // 1、創(chuàng)建session Session session = Session.getDefaultInstance(prop); // 2、讀取郵件夾 Store store = session.getStore("pop3"); store.connect(MAIL_SERVER_HOST, USER, PASSWORD); Folder folder = store.getFolder("inbox"); folder.open(Folder.READ_ONLY); // 獲取郵件夾中第1封郵件信息 Message[] messages = folder.getMessages(); if (messages.length <= 0) { return; } Message message = messages[0]; // 打印郵件關(guān)鍵信息 String from = InternetAddress.toString(message.getFrom()); if (from != null) { System.out.println("From: " + from); } String replyTo = InternetAddress.toString(message.getReplyTo()); if (replyTo != null) { System.out.println("Reply-to: " + replyTo); } String to = InternetAddress.toString(message.getRecipients(Message.RecipientType.TO)); if (to != null) { System.out.println("To: " + to); } String subject = message.getSubject(); if (subject != null) { System.out.println("Subject: " + subject); } Date sent = message.getSentDate(); if (sent != null) { System.out.println("Sent: " + sent); } // 設(shè)置轉(zhuǎn)發(fā)郵件信息頭 Message forward = new MimeMessage(session); forward.setFrom(new InternetAddress(MAIL_FROM)); forward.setRecipient(Message.RecipientType.TO, new InternetAddress(MAIL_TO)); forward.setSubject("Fwd: " + message.getSubject()); // 設(shè)置轉(zhuǎn)發(fā)郵件內(nèi)容 MimeBodyPart bodyPart = new MimeBodyPart(); bodyPart.setContent(message, "message/rfc822"); Multipart multipart = new MimeMultipart(); multipart.addBodyPart(bodyPart); forward.setContent(multipart); forward.saveChanges(); Transport ts = session.getTransport("smtp"); ts.connect(USER, PASSWORD); ts.sendMessage(forward, forward.getAllRecipients()); folder.close(false); store.close(); ts.close(); System.out.println("message forwarded successfully...."); }
以上就是本文的全部內(nèi)容,希望對大家學(xué)習(xí)javamail收發(fā)郵件的方法有所幫助。
- Java基于JavaMail實(shí)現(xiàn)向QQ郵箱發(fā)送郵件
- java中javamail發(fā)送帶附件的郵件實(shí)現(xiàn)方法
- JavaWeb中使用JavaMail實(shí)現(xiàn)發(fā)送郵件功能實(shí)例詳解
- Java程序中使用JavaMail發(fā)送帶圖片和附件的郵件
- 基于JavaMail的Java實(shí)現(xiàn)簡單郵件發(fā)送功能
- 基于SSM框架+Javamail發(fā)送郵件的代碼實(shí)例
- Spring框架JavaMailSender發(fā)送郵件工具類詳解
- Java使用JavaMail API發(fā)送和接收郵件的代碼示例
- JavaMail實(shí)現(xiàn)發(fā)送超文本(html)格式郵件的方法
- 輕松學(xué)會使用JavaMail?API發(fā)送郵件
相關(guān)文章
Java的BigDecimal在math包中提供的API類場景使用詳解
這篇文章主要介紹了Java的BigDecimal在math包中提供的API類場景使用詳解,BigDecimal,用來對超過16位有效位的數(shù)進(jìn)行精確的運(yùn)算,雙精度浮點(diǎn)型變量double可以處理16位有效數(shù),在實(shí)際應(yīng)用中,需要對更大或者更小的數(shù)進(jìn)行運(yùn)算和處理,需要的朋友可以參考下2023-12-12Springboot實(shí)現(xiàn)自定義錯誤頁面的方法(錯誤處理機(jī)制)
這篇文章主要介紹了Springboot實(shí)現(xiàn)自定義錯誤頁面的方法(錯誤處理機(jī)制),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-01-01解決IDEA 左側(cè)Project中沒有out文件夾的問題
這篇文章主要介紹了解決IDEA 左側(cè)Project中沒有out文件夾的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-02-02Spring Boot 項(xiàng)目中使用Swagger2的示例
本篇文章主要介紹了Spring Boot 項(xiàng)目中使用Swagger2的示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-01-01Kafka多節(jié)點(diǎn)分布式集群搭建實(shí)現(xiàn)過程詳解
這篇文章主要介紹了Kafka多節(jié)點(diǎn)分布式集群搭建實(shí)現(xiàn)過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-11-11java算法之Math.random()隨機(jī)概率玩法實(shí)例演示
最近打算整理排序算法,發(fā)現(xiàn)很有必要準(zhǔn)備一下生成隨機(jī)數(shù)的工具類,下面這篇文章主要給大家介紹了關(guān)于java算法之Math.random()隨機(jī)概率玩法的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-05-05