概述
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、郵件傳輸過程
如上圖,電子郵件的處理步驟如下:
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收發郵件的方法有所幫助。