概述html
一、郵件相關的標準java
廠商所提供的 JavaMail 服務程序能夠有選擇地實現某些郵件協議,常見的郵件協議包括:安全
SMTP(Simple Mail Transfer Protocol) :即簡單郵件傳輸協議,它是一組用於由源地址到目的地址傳送郵件的規則,由它來控制信件的中轉方式。服務器
POP3(Post Office Protocol – Version 3) :即郵局協議版本 3 ,用於接收電子郵件的標準協議。session
IMAP(Internet Mail Access Protocol) :即 Internet 郵件訪問協議。是 POP3 的替代協議。ide
這三種協議都有對應 SSL 加密傳輸的協議,分別是 SMTPS , POP3S 和 IMAPS 。學習
MIME(Multipurpose Internet Mail Extensions) :即多用途因特網郵件擴展標準。它不是郵件傳輸協議。但對傳輸內容的消息、附件及其它的內容定義了格式。測試
二、JavaMail 簡介加密
JavaMail 是由 Sun 發佈的用來處理 email 的 API 。它並無包含在 Java SE 中,而是做爲 Java EE 的一部分。spa
mail.jar :此 JAR 文件包含 JavaMail API 和 Sun 提供的 SMTP 、 IMAP 和 POP3 服務提供程序;
activation.jar :此 JAR 文件包含 JAF API 和 Sun 的實現。
JavaMail 包中用於處理電子郵件的核心類是: Properties 、 Session 、 Message 、 Address 、 Authenticator 、 Transport 、 Store 等。
三、郵件傳輸過程
如上圖,電子郵件的處理步驟以下:
四、Message 結構
MimeMessage 類:表明整封郵件。
MimeBodyPart 類:表明郵件的一個 MIME 信息。
MimeMultipart 類:表明一個由多個 MIME 信息組合成的組合 MIME 信息。
五、JavaMail 的核心類
JavaMail 對收發郵件進行了高級的抽象,造成了一些關鍵的的接口和類,它們構成了程序的基礎,下面咱們分別來了解一下這些最多見的對象。
六、java.util.Properties 類 ( 屬性對象 )
java.util.Properties 類表明一組屬性集合。
它的每個鍵和值都是 String 類型。
因爲 JavaMail 須要和郵件服務器進行通訊,這就要求程序提供許多諸如服務器地址、端口、用戶名、密碼等信息, JavaMail 經過 Properties 對象封裝這些屬性信息。
例: 以下面的代碼封裝了幾個屬性信息:
1
2
3
4
5
|
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 類型進行設置,屬性類型欄僅表示屬性是如何被解析的):
七、javax.mail.Session 類 ( 會話對象 )
Session 表示一個郵件會話。
Session 的主要做用包括兩個方面:
接收各類配置屬性信息:經過 Properties 對象設置的屬性信息;
初始化 JavaMail 環境:根據 JavaMail 的配置文件,初始化 JavaMail 環境,以便經過 Session 對象建立其餘重要類的實例。
JavaMail 在 Jar 包的 META-INF 目錄下,經過如下文件提供了基本配置信息,以便 session 可以根據這個配置文件加載提供者的實現類:
javamail.default.providers ;
javamail.default.address.map 。
例:
1
2
3
|
Properties props =
new
Properties();
props.setProperty(
"mail.transport.protocol"
,
"smtp"
);
Session session = Session.getInstance(props);
|
八、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 方法用來關閉和郵件服務器的鏈接。
九、javax.mail.Store 類 ( 郵件存儲 )
getStore : Session 類中的 getStore () 有多個重載方法,能夠用來建立 Store 對象。
connect : 若是設置了認證命令—— mail.smtp.auth ,那麼使用 Store 類的 connect 方法鏈接服務器時,則必須加上用戶名和密碼。
getFolder : Store 類的 getFolder 方法能夠 獲取郵箱內的郵件夾 Folder 對象
close : Store 類的 close 方法用來關閉和郵件服務器的鏈接。
十、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 :若是郵件內容是純文本,可使用此接口設置文本內容。
十、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 對象返回給調用程序。
例:
1
2
3
|
Properties props =
new
Properties();
Authenticator auth =
new
MyAuthenticator();
Session session = Session.getDefaultInstance(props, auth);
|
實例
發送文本郵件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
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 = Session.getInstance(prop);
Transport ts =
null
;
// 二、經過session獲得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(
"測試文本郵件"
);
// 郵件的標題
// 郵件消息體
message.setText(
"天下無雙。"
);
// 五、發送郵件
ts.sendMessage(message, message.getAllRecipients());
ts.close();
}
|
發送 HTML 格式的郵件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
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 = Session.getInstance(prop);
Transport ts =
null
;
// 二、經過session獲得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(
"測試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();
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();
// 五、發送郵件
ts.sendMessage(message, message.getAllRecipients());
ts.close();
}
|
發送帶附件的郵件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
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 = Session.getInstance(prop);
Transport ts =
null
;
// 二、經過session獲得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(
"測試帶附件郵件"
);
// 郵件的標題
MimeBodyPart text =
new
MimeBodyPart();
text.setContent(
"郵件中有兩個附件。"
,
"text/html;charset=UTF-8"
);
// 描述數據關係
MimeMultipart mm =
new
MimeMultipart();
mm.setSubType(
"related"
);
mm.addBodyPart(text);
String[] files = {
};
// 添加郵件附件
for
(String filename : files) {
MimeBodyPart attachPart =
new
MimeBodyPart();
attachPart.attachFile(filename);
mm.addBodyPart(attachPart);
}
message.setContent(mm);
message.saveChanges();
// 五、發送郵件
ts.sendMessage(message, message.getAllRecipients());
ts.close();
}
|
獲取郵箱中的郵件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
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);
// 一、建立session
Session session = Session.getInstance(prop);
// 二、經過session獲得Store對象
Store store = session.getStore();
// 三、連上郵件服務器
store.connect(MAIL_SERVER_HOST, USER, PASSWORD);
// 四、得到郵箱內的郵件夾
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);
}
// 五、關閉
folder.close(
false
);
store.close();
}
}
|
轉發郵件
例:獲取指定郵件夾下的第一封郵件並轉發
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
|
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);
// 一、建立session
Session session = Session.getDefaultInstance(prop);
// 二、讀取郵件夾
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收發郵件的方法有所幫助。