概述
1、郵件相關的標準
廠商所提供的 JavaMail 服務程式可以有選擇地實現某些郵件協議,常見的郵件協議包括:
SMTP(Simple Mail Transfer Protocol) :即簡易郵件傳輸通訊協定,它是一組用於由源地址到目的地址傳送郵件的規則,由它來控制信件的中轉方式。
POP3(Post Office Protocol – Version 3) :即郵局協議版本 3 ,用於接收電子郵件的標準協議。
IMAP(Internet Mail Access Protocol) :即 Internet 郵件訪問協議。是 POP3 的替代協議。
這三種協議都有對應 SSL 加密傳輸的協議,分別是 SMTPS , POP3S 和 IMAPS 。
MIME(Multipurpose Internet Mail Extensions) :即多用途網際網路郵件擴充標準。它不是郵件傳輸協議。但對傳輸內容的訊息、附件及其它的內容定義了格式。
2、JavaMail 簡介
JavaMail 是由 Sun 發布的用來處理 email 的 API 。它並沒有包含在 Java SE 中,而是作為 Java EE 的一部分。
mail.jar :此 JAR 檔案包含 JavaMail API 和 Sun 提供的 SMTP 、 IMAP 和 POP3 服務提供者;
activation.jar :此 JAR 檔案包含 JAF API 和 Sun 的實現。
JavaMail 包中用於處理電子郵件的核心類是: Properties 、 Session 、 Message 、 Address 、 Authenticator 、 Transport 、 Store 等。
3、郵件傳輸過程
如上圖,電子郵件的處理步驟如下:
- 建立一個 Session 對象。
- Session 對象建立一個 Transport 對象 /Store 對象,用來發送 / 儲存郵件。
- Transport 對象 /Store 對象串連郵件伺服器。
- Transport 對象 /Store 對象建立一個 Message 對象 ( 也就是郵件內容 ) 。
- Transport 對象發送郵件; Store 對象擷取郵箱的郵件。
4、Message 結構
MimeMessage 類:代表整封郵件。
MimeBodyPart 類:代表郵件的一個 MIME 資訊。
MimeMultipart 類:代表一個由多個 MIME 資訊組合成的組合 MIME 資訊。
5、JavaMail 的核心類
JavaMail 對收發郵件進行了進階的抽象,形成了一些關鍵的的介面和類,它們構成了程式的基礎,下面我們分別來瞭解一下這些最常見的對象。
6、java.util.Properties 類 ( 屬性對象 )
java.util.Properties 類代表一組屬性集合。
它的每一個鍵和值都是 String 類型。
由於 JavaMail 需要和郵件伺服器進行通訊,這就要求程式提供許多諸如伺服器位址、連接埠、使用者名稱、密碼等資訊, 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");
針對不同的的郵件協議, JavaMail 規定了服務提供者必須支援一系列屬性,
下表是一些常見屬性(屬性值都以 String 類型進行設定,屬性類型欄僅表示屬性是如何被解析的):
7、javax.mail.Session 類 ( 會話對象 )
Session 表示一個郵件會話。
Session 的主要作用包括兩個方面:
接收各種配置屬性資訊:通過 Properties 對象設定的屬性資訊;
初始化 JavaMail 環境:根據 JavaMail 的設定檔,初始化 JavaMail 環境,以便通過 Session 對象建立其他重要類的執行個體。
JavaMail 在 Jar 包的 META-INF 目錄下,通過以下檔案提供了基本配置資訊,以便 session 能夠根據這個設定檔載入提供者的實作類別:
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 類 ( 郵件傳輸 )
郵件操作只有發送或接收兩種處理方式。
JavaMail 將這兩種不同操作描述為傳輸( javax.mail.Transport )和儲存( javax.mail.Store ),傳輸對應郵件的發送,而儲存對應郵件的接收。
getTransport : Session 類中的 getTransport () 有多個重載方法,可以用來建立 Transport 對象。
connect : 如果設定了認證命令—— mail.smtp.auth ,那麼使用 Transport 類的 connect 方法串連伺服器時,則必須加上使用者名稱和密碼。
sendMessage : Transport 類的 sendMessage 方法用來發送郵件訊息。
close : Transport 類的 close 方法用來關閉和郵件伺服器的串連。
9、javax.mail.Store 類 ( 郵件儲存 )
getStore : Session 類中的 getStore () 有多個重載方法,可以用來建立 Store 對象。
connect : 如果設定了認證命令—— mail.smtp.auth ,那麼使用 Store 類的 connect 方法串連伺服器時,則必須加上使用者名稱和密碼。
getFolder : Store 類的 getFolder 方法可以 擷取郵箱內的郵件夾 Folder 對象
close : Store 類的 close 方法用來關閉和郵件伺服器的串連。
10、javax.mail.Message( 訊息對象 )
javax.mail.Message 是個抽象類別,只能用子類去執行個體化,多數情況下為 javax.mail.internet.MimeMessage 。
MimeMessage 代表 MIME 類型的電子郵件訊息。
要建立一個 Message ,需要將 Session 對象傳遞給 MimeMessage 構造器:
MimeMessage message = new MimeMessage(session);
注意:還存在其它構造器,如用按 RFC822 格式的輸入資料流來建立訊息。
setFrom :設定郵件的寄件者
setRecipient :設定郵件的發送人、抄送人、密送人
三種預定義的地址類型是:
Message.RecipientType.TO :收件者
Message.RecipientType.CC :抄送人
Message.RecipientType.BCC :密送人
setSubject :設定郵件的主題
setContent :設定郵件內容
setText :如果郵件內容是純文字,可以使用此介面設定常值內容。
10、javax.mail.Address( 地址 )
一旦您建立了 Session 和 Message ,並將內容填入訊息後,就可以用 Address 確定信件地址了。和 Message 一樣, Address 也是個抽象類別。您用的是 javax.mail.internet.InternetAddress 類。
若建立的地址只包含電子郵件地址,只要傳遞電子郵件地址到構造器就行了。
例:
Address address = new InternetAddress("[email protected]");
Authenticator :認證者
與 java.net 類一樣, JavaMail API 也可以利用 Authenticator 通過使用者名稱和密碼訪問受保護的資源。對於 JavaMail API 來說,這些資源就是郵件伺服器。 JavaMail Authenticator 在 javax.mail 包中,而且它和 java.net 中同名的類 Authenticator 不同。兩者並不共用同一個 Authenticator ,因為 JavaMail API 用於 Java 1.1 ,它沒有 java.net 類別。
要使用 Authenticator ,先建立一個抽象類別的子類,並從 getPasswordAuthentication() 方法中返回 PasswordAuthentication 執行個體。建立完成後,您必需向 session 註冊 Authenticator 。然後,在需要認證的時候,就會通知 Authenticator 。您可以快顯視窗,也可以從設定檔中(雖然沒有加密是不安全的)讀取使用者名稱和密碼,將它們作為 PasswordAuthentication 對象返回給調用程式。
例:
Properties props = new Properties();Authenticator auth = new MyAuthenticator();Session session = Session.getDefaultInstance(props, auth);
執行個體
發送文本郵件
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、建立session Session session = Session.getInstance(prop); Transport ts = null; // 2、通過session得到transport對象 ts = session.getTransport(); // 3、連上郵件伺服器 ts.connect(MAIL_SERVER_HOST, USER, PASSWORD); // 4、建立郵件 MimeMessage message = new MimeMessage(session); // 郵件訊息頭 message.setFrom(new InternetAddress(MAIL_FROM)); // 郵件的寄件者 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("測試文本郵件"); // 郵件的標題 // 郵件訊息體 message.setText("天下無雙。"); // 5、發送郵件 ts.sendMessage(message, message.getAllRecipients()); ts.close();}
發送 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、建立session Session session = Session.getInstance(prop); Transport ts = null; // 2、通過session得到transport對象 ts = session.getTransport(); // 3、連上郵件伺服器 ts.connect(MAIL_SERVER_HOST, USER, PASSWORD); // 4、建立郵件 MimeMessage message = new MimeMessage(session); // 郵件訊息頭 message.setFrom(new InternetAddress(MAIL_FROM)); // 郵件的寄件者 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郵件"); // 郵件的標題 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"); // 描述資料關係 MimeMultipart mm = new MimeMultipart(); mm.addBodyPart(text); mm.addBodyPart(image); mm.setSubType("related"); message.setContent(mm); message.saveChanges(); // 5、發送郵件 ts.sendMessage(message, message.getAllRecipients()); ts.close();}
發送帶附件的郵件
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、建立session Session session = Session.getInstance(prop); Transport ts = null; // 2、通過session得到transport對象 ts = session.getTransport(); // 3、連上郵件伺服器 ts.connect(MAIL_SERVER_HOST, USER, PASSWORD); // 4、建立郵件 MimeMessage message = new MimeMessage(session); // 郵件訊息頭 message.setFrom(new InternetAddress(MAIL_FROM)); // 郵件的寄件者 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("測試帶附件郵件"); // 郵件的標題 MimeBodyPart text = new MimeBodyPart(); text.setContent("郵件中有兩個附件。", "text/html;charset=UTF-8"); // 描述資料關係 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、發送郵件 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"; // 郵箱伺服器 public final static String TYPE_HTML = "text/html;charset=UTF-8"; // 常值內容類型 public final static String MAIL_FROM = "[email protected]"; // 寄件者 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 { // 建立一個有具體串連資訊的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、建立session Session session = Session.getInstance(prop); // 2、通過session得到Store對象 Store store = session.getStore(); // 3、連上郵件伺服器 store.connect(MAIL_SERVER_HOST, USER, PASSWORD); // 4、獲得郵箱內的郵件夾 Folder folder = store.getFolder("inbox"); folder.open(Folder.READ_ONLY); // 獲得郵件夾Folder內的所有郵件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) + "封郵件的寄件者地址:" + from); } // 5、關閉 folder.close(false); store.close(); }}
轉寄郵件
例:擷取指定郵件夾下的第一封郵件並轉寄
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、建立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]; // 列印郵件關鍵資訊 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); } // 設定轉寄郵件資訊頭 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()); // 設定轉寄郵件內容 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....");}
以上就是本文的全部內容,希望對大家學習javamail收發郵件的方法有所協助。