多發(fā)和用戶驗(yàn)證
下面先來(lái)介紹如何實(shí)現(xiàn)將郵件發(fā)送給多個(gè)收件人和如何利用Authenticators對(duì)象實(shí)現(xiàn)用戶驗(yàn)證。
指定收件人的時(shí)候,我們可以有兩種方法來(lái)指定。上篇博客是在發(fā)送郵件的時(shí)候臨時(shí)指定收件人,其實(shí)還可以在Message對(duì)象中指定。
1
|
message.addRecipient(Message.RecipientType.TO, new InternetAddress(” 995812509 @99 .com ”)); |
這個(gè)只是發(fā)送給一個(gè)收件人而言,但是有多個(gè)收件人如何處理?同樣有兩種方法來(lái)處理。
1、在發(fā)送郵件時(shí)Transport的sendMessage()方法指定收件人時(shí)是使用數(shù)組來(lái)指定收件人的,這個(gè)時(shí)候我們只需要多添加收件人地址即可完成。
2、在使用Message對(duì)象來(lái)添加收件人我們可以使用InternetAddress對(duì)象的parse(String string)方法,該方法返回的是InternetAddress數(shù)組,這樣同樣可以實(shí)現(xiàn)發(fā)送給多個(gè)收件人。
我們知道在進(jìn)行JavaMail開(kāi)發(fā)時(shí)我們必須要進(jìn)行授權(quán)校驗(yàn),授權(quán)校驗(yàn)?zāi)康氖亲柚顾巳我鈦y發(fā)郵件,減少垃圾郵件的產(chǎn)生。
我們可以在獲取Session對(duì)象的時(shí)候進(jìn)行校驗(yàn)。在Session對(duì)象中有這兩個(gè)方法:
- getDefaultInstance(prop,authenticator),
- getInstance(prop,authenticator),
這兩個(gè)方法都有一個(gè)共同的參數(shù)authenticator,該參數(shù)是一個(gè)Authenticator對(duì)象。Authenticator對(duì)象就是幫助用戶進(jìn)行信息驗(yàn)證的,完成授權(quán)校驗(yàn)。Authenticator對(duì)象中有g(shù)etPasswordAuthentication()方法,該方法返回返回一個(gè)PasswordAuthentication對(duì)象,PasswordAuthentication對(duì)象中有兩個(gè)方法:getPassword()、getUserName()也就說(shuō)我們將password、userName封裝在PasswordAuthentication對(duì)象,通過(guò)這兩個(gè)方法就可以獲取用戶名和密碼了。即可完成用戶信息驗(yàn)證。
實(shí)例如下:
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 class JavaMail_02 { public static void main(String[] args) throws Exception { Properties props = new Properties(); props.setProperty( "mail.smtp.auth" , "true" ); props.setProperty( "mail.transport.protocol" , "smtp" ); props.setProperty( "mail.host" , "smtp.163.com" ); Session session = Session.getInstance(props, new Authenticator(){ protected PasswordAuthentication getPasswordAuthentication(){ return new PasswordAuthentication( "********" , "*********" ); } }); session.setDebug( true ); Message msg = new MimeMessage(session); msg.setSubject( "JavaMail測(cè)試程序..." ); msg.setContent( "<span style='color:red'>這是我的第二個(gè)javaMail測(cè)試程序....</span>" , "text/html;charset=gbk" ); //msg.setRecipients(RecipientType.TO, new Address[]{new InternetAddress("1111@@qq.com"),new InternetAddress("[email protected]")}); Transport.send(msg); } } |
帶有圖片和附件的郵件
在實(shí)際的電子郵件中我們一般都會(huì)涉及到更加復(fù)雜電子郵件結(jié)構(gòu),例如有附件、郵件正文里面包含圖片、包含歌曲等等,在這個(gè)時(shí)候我們就必須要對(duì)郵件的結(jié)構(gòu)有著很清晰的認(rèn)識(shí)。在進(jìn)行復(fù)合郵件開(kāi)發(fā)之前需要對(duì)復(fù)合郵件的結(jié)構(gòu)有一定的了解。
上面這幅圖片展示了一封復(fù)合郵件的整體結(jié)構(gòu),我們可以看出一封復(fù)雜的電子郵件由多個(gè)部分組成。它有一個(gè)頭部和正文,但是正文并不是像以前那么簡(jiǎn)單了,而是由幾個(gè)部分組成。頭部需要起到一個(gè)指示的作用,它需要說(shuō)明正文需要使用什么樣的分隔符來(lái)分開(kāi),正文幾個(gè)部分之間使用什么樣的組合關(guān)系。對(duì)于上面電子郵件它由三個(gè)部分組成,每一部分都有自己頭和體,第一部分也由兩個(gè)部分組成。
復(fù)合郵件的組合關(guān)系:
正文部分之間有多種組合關(guān)系。組合關(guān)系如下圖:
alternative:選擇關(guān)系。上面的純文本和超文本之間就是一種選擇關(guān)系。
related:關(guān)聯(lián)關(guān)系。假如上面的超文本正文是展示一幅圖片,那么我們?cè)诎l(fā)送郵件的時(shí)候必須要將這幅圖片包含到郵件中,也就是所謂的內(nèi)嵌資源,這個(gè)內(nèi)嵌資源是給超文本用的。所以他們兩者之間是一個(gè)關(guān)聯(lián)關(guān)系。
mixed:混合關(guān)系。在純文本、超文本和內(nèi)嵌資源組成一個(gè)整體和,他們與附件并列著,兩者之間就是一個(gè)混合關(guān)系了。
復(fù)合郵件組織結(jié)構(gòu)的API:
MimeMessage類表示整封電子郵件。
MimeBodyPart類表示郵件的一個(gè)MiME消息。
MimeMultipart類表示一個(gè)由多個(gè)MIME消息組合成的組合MIME消息。
下面一個(gè)實(shí)例:該郵件里面包含兩個(gè)附件、正文部分包括純文本和超文本,超文本表示展示一張圖片。源代碼如下:
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
62
63
64
65
66
67
68
69
70
71
72
|
public class JavaMail_03 { public static void main(String[] args) throws Exception { Properties props = new Properties(); props.setProperty( "mail.smtp.auth" , "true" ); props.setProperty( "mail.transport.protocol" , "smtp" ); props.setProperty( "mail.host" , "smtp.163.com" ); Session session = Session.getInstance(props, new Authenticator(){ protected PasswordAuthentication getPasswordAuthentication(){ return new PasswordAuthentication( "*****" , "******" ); } }); Message message = new MimeMessage(session); message.setSubject( "第三個(gè)JavaMail測(cè)試程序" ); //郵件正文 MimeMultipart multipart = new MimeMultipart( "mixed" ); message.setContent(multipart); /* * 創(chuàng)建郵件的內(nèi)容 * 包括一個(gè)郵件正文和兩個(gè)附件 */ MimeBodyPart content = new MimeBodyPart(); //郵件內(nèi)容 MimeBodyPart attch1 = new MimeBodyPart(); //附件1 MimeBodyPart attch2 = new MimeBodyPart(); //附件2 //將郵件內(nèi)容添加到multipart中 multipart.addBodyPart(content); multipart.addBodyPart(attch1); multipart.addBodyPart(attch2); //設(shè)置附件1 DataSource ds1 = new FileDataSource("G:\\電子書(shū)\\oracle口令.txt"); DataHandler dh1 = new DataHandler(ds1); attch1.setDataHandler(dh1); attch1.setFileName("oracle.txt"); //設(shè)置附件2 DataSource ds2 = new FileDataSource("G:\\電子書(shū)\\賬號(hào).txt"); DataHandler dh2 = new DataHandler(ds2); attch2.setDataHandler(dh2); attch2.setFileName(MimeUtility.encodeText("賬號(hào).txt")); /* * 設(shè)置內(nèi)容(正文)---是一個(gè)復(fù)雜體 * 包括HTML正文和顯示一張圖片 */ MimeMultipart bodyMultipart = new MimeMultipart( "related" ); content.setContent(bodyMultipart); //構(gòu)造正文 MimeBodyPart htmlBody = new MimeBodyPart(); MimeBodyPart gifBody = new MimeBodyPart(); bodyMultipart.addBodyPart(htmlBody); bodyMultipart.addBodyPart(gifBody); //設(shè)置圖片 DataSource gifds = new FileDataSource( "F:\\圖片\\圖片\\4.jpg" ); DataHandler gifdh = new DataHandler(gifds); gifBody.setDataHandler(gifdh); gifBody.setHeader( "Content-ID" , "<" +gifds.getName()+ ">" ); //gifBody.setHeader("Content-Location", "http://www.zmynmublwnt.cn/logo.gif"); //設(shè)置HTML正文 htmlBody.setContent( "<span style='color:red;font-size:16px'>這是我的第三個(gè)JavaMail測(cè)試哦!包括了附件和圖片,有點(diǎn)兒復(fù)雜...</span><br>" + "顯示的圖片<img src='cid:4.jpg'/>" , "text/html;charset=UTF-8" ); message.saveChanges(); //生成郵件 Transport.send(message); } } |