Java Mail 簡介
常見的郵件協(xié)議包括:
- SMTP(Simple Mail Transfer Protocol):即簡單郵件傳輸協(xié)議,它是一組用于由源地址到目的地址傳送郵件的規(guī)則,由它來控制信件的中轉(zhuǎn)方式。
- POP3(Post Office Protocol - Version 3):即郵局協(xié)議版本 3 ,用于接收電子郵件的標準協(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)郵件擴展標準。它不是郵件傳輸協(xié)議。但對傳輸內(nèi)容的消息、附件及其它的內(nèi)容定義了格式。
JavaMail 是由 Sun(現(xiàn) Oracle) 發(fā)布的用來處理 email 的 API 。它并沒有包含在 Java SE 中,而是作為 Java EE 的一部分。JavaMail下載地址。
下載的文件內(nèi)容如下:
README.txt:整體介紹JavaMail,需要看一下
docs/javadocs:The JavaMail API javadocs,需要看一下
mail.jar:包括JavaMail API和所有service providers,大部分用戶只需要該jar包
lib/mailapi.jar :只有JavaMail API
lib/imap.jar:The IMAP service provider
lib/smtp.jar:The SMTP service provider
lib/pop3.jar:The POP3 service provider
lib/dsn.jar:multipart/report DSN message support
demo:demo示例,簡單了解,有需要再看
郵件傳輸過程
郵件的傳輸過程如下圖:
可以看出,收發(fā)郵件的步驟如下:
創(chuàng)建一個 Session 對象。
Session 對象創(chuàng)建一個 Transport 對象 /Store 對象,用來發(fā)送 / 保存郵件。
Transport 對象 /Store 對象連接郵件服務(wù)器。
Transport 對象 /Store 對象創(chuàng)建一個 Message 對象 ( 也就是郵件內(nèi)容 ) 。
Transport 對象發(fā)送郵件; Store 對象獲取郵箱的郵件。
可以看出,JavaMail 核心類包括:
javax.mail.Session:上下文環(huán)境信息,如服務(wù)器的主機名、端口號、協(xié)議名稱等
javax.mail.Message:郵件模型,發(fā)送郵件和接收郵件的媒介,封裝了郵件的信息,如發(fā)件人、收件人、郵件標題、郵件內(nèi)容等
javax.mail.Transport:連接郵件SMTP服務(wù)器,發(fā)送郵件
javax.mail.Store:連接郵件POP3、IMAP服務(wù)器,收取郵件
核心類介紹
Session
Session 表示一個郵件會話,主要作用包括兩個方面:
接收各種配置屬性信息:通過 Properties 對象設(shè)置的屬性信息;
初始化 JavaMail 環(huán)境:根據(jù) JavaMail 的配置文件,初始化 JavaMail 環(huán)境,以便通過 Session 對象創(chuàng)建其他重要類的實例。
Transport
Session 類中的 getTransport () 有多個重載方法,可以用來創(chuàng)建 Transport 對象。
connect : 如果設(shè)置了認證命令(mail.smtp.auth) ,那么使用 Transport 類的 connect 方法連接服務(wù)器時,則必須加上用戶名和密碼。
sendMessage : Transport 類的 sendMessage 方法用來發(fā)送郵件消息。
close : Transport 類的 close 方法用來關(guān)閉和郵件服務(wù)器的連接。
Store
Session 類中的 getStore () 有多個重載方法,可以用來創(chuàng)建 Store 對象。
connect : 同上
getFolder : Store 類的 getFolder 方法可以 獲取郵箱內(nèi)的郵件夾 Folder 對象
close : Store 類的 close 方法用來關(guān)閉和郵件服務(wù)器的連接。
Message
Message 是抽象類,多數(shù)情況下使用子類 javax.mail.internet.MimeMessage 。
MimeMessage 代表 MIME 類型的電子郵件消息。
要創(chuàng)建一個 Message ,需要將 Session 對象傳遞給 MimeMessage 構(gòu)造器:
MimeMessage message = new MimeMessage(session);
setFrom :設(shè)置郵件的發(fā)件人
setRecipient :設(shè)置郵件的發(fā)送人、抄送人、密送人三種預定義的地址類型是:
Message.RecipientType.TO :收件人
Message.RecipientType.CC :抄送人
Message.RecipientType.BCC :密送人
setSubject :設(shè)置郵件的主題
setContent :設(shè)置郵件內(nèi)容
setText :如果郵件內(nèi)容是純文本,可以使用此接口設(shè)置文本內(nèi)容。
Address
Address 用來確定信件地址。和 Message 一樣, Address 也是個抽象類。常用的是 javax.mail.internet.InternetAddress 類。
若創(chuàng)建的地址只包含電子郵件地址,只要傳遞電子郵件地址到構(gòu)造器就行了:Address address = new InternetAddress("[email address]");
Authenticator
要使用驗證者 Authenticator
,先創(chuàng)建一個抽象類的子類,并從 getPasswordAuthentication() 方法中返回 PasswordAuthentication 實例。創(chuàng)建完成后,您必需向 session 注冊 Authenticator 。然后,在需要認證的時候,就會通知 Authenticator 。
簡單的例子
發(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");
Session session = Session.getInstance(prop);
Transport ts = session.getTransport();
ts.connect(MAIL_SERVER_HOST, USER, PASSWORD);
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("Subject");
message.setText("Content");
ts.sendMessage(message, message.getAllRecipients());
ts.close();
}
發(fā)送HTML郵件
public static void main(String[] args) throws Exception {
Properties prop = new Properties();
... ... // Set properties
Session session = Session.getInstance(prop);
Transport ts = session.getTransport();
MimeMessage message = new MimeMessage(session);
... ... // Head of Message.
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://img.jpg"));
image.setDataHandler(dh);
image.setContentID("image.jpg");
MimeMultipart mm = new MimeMultipart();
mm.addBodyPart(text);
mm.addBodyPart(image);
mm.setSubType("related");
message.setContent(mm);
message.saveChanges();
ts.sendMessage(message, message.getAllRecipients());
ts.close();
}
發(fā)送帶附件的郵件
public static void main(String[] args) throws Exception {
... ...
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();
... ...
}
獲取郵箱中的郵件
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();
}
}
PS:注意
上述小栗子非本人所寫,搬運自這里。大家可以通過這些例子了解Java Mail。
我寫的例子中將Properties、SMTP服務(wù)器、群發(fā)用戶名、要發(fā)送的內(nèi)容等寫入了配置文件中。
這里需要說明的是:由于本人的代碼涉及文件操作以及集合操作等,涉及Java Mail以外的內(nèi)容,不利于理解,所以本文的代碼采用了搬運的方式。
本人的例子主要實現(xiàn)群發(fā)功能,目前還較為簡單(未加入附件等),測試通過了向Gmail/QQ/163郵箱的郵件發(fā)送。如果有需要可以在這里下載源碼。
文件列表說明
users.txt:存放要轉(zhuǎn)發(fā)的用戶名(本人已經(jīng)處理了空行
以及注釋#
)
setting.properties:Session需要的上下文環(huán)境
hosts.properties:配置SMTP服務(wù)器
content.html:本人用于測試的發(fā)送內(nèi)容
src/email/test:一些測試
src/email/joshua/util:用于讀取配置、地址轉(zhuǎn)換的工具
src/email/Sender:完成發(fā)送功能的類
src/email/Main:完成用戶的輸入輸出,運行該類執(zhí)行程序
參考
JAVA MAIL發(fā)送郵件實例
JAVA MAIL實現(xiàn)Email的發(fā)送
JavaMail發(fā)送郵件的最簡單示例