使用Javamail發送郵件,必需的jar包(請下載javamail的源文件,官方下載頁:http://www.oracle.com/technetwork/java/javamail/index-138643.html):
mailapi.jar。定義了收發郵件所使用到的接口API;
smtp.jar。包含了發送郵件使用到的類;
pop3.jar。包含了收郵件使用到的類;
我們通常發送郵件使用的協議是smtp協議,接受郵件使用的協議是pop3協議。或者,我們直接將mail.jar加入到工程,這個jar包里邊包含了java收發郵件所有的接口和類。
常用的類:
- javax.mail.Session; -------->保存連接服務器所需要的信息;
- javax.mail.Message; -------->郵件體,保存郵件的內容;
- javax.mail.Transport; -------->發送郵件的載體
- javax.mail.internet.InternetAddress; -------->郵件的地址信息
發送郵件
下邊,我先列出使用Java發送郵件的最簡單的一個小測試示例:
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
|
import java.util.Properties; import javax.mail.Address; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; /** * * QQ(mail.qq.com):POP3服務器(端口995)SMTP服務器(端口465或587)。 * */ public class Demo1 { /** * @param args * @throws MessagingException */ public static void main(String[] args) throws MessagingException { String sendUserName = "wangxiangpan@126.com" ; String sendPassword = "pwd" ; Properties properties = new Properties(); properties.setProperty( "mail.smtp.auth" , "true" ); //服務器需要認證 properties.setProperty( "mail.transport.protocol" , "smtp" ); //聲明發送郵件使用的端口 Session session = Session.getInstance(properties); session.setDebug( true ); //同意在當前線程的控制臺打印與服務器對話信息 Message message = new MimeMessage(session); //構建發送的信息 message.setText( "你好,我是Champion.Wong!" ); //信息內容 message.setFrom( new InternetAddress( "wangxiangpan@126.com" )); //發件人 Transport transport = session.getTransport(); transport.connect( "smtp.126.com" , 25 , sendUserName, sendPassword); //連接發件人使用發件的服務器 transport.sendMessage(message, new Address[]{ new InternetAddress( "492134880@qq.com" )}); //接受郵件 transport.close(); } } |
一般的,我們使用Authenticator把用戶名和密碼封裝起來,不透明!所以:
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
|
import javax.mail.Authenticator; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.PasswordAuthentication; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.AddressException; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import junit.framework.TestCase; /** * javamail 發送郵件 * @author Champion Wong * Message.addRecipient(Message.Recipient recipient, Address address); 發郵件的時候指定收件人和收件人的角色 * Message.RecipientType.TO 收件人 * Message.RecipientType.CC 抄送,即發郵件的時候順便給另一個人抄一份,不用回復!但是,上邊的收件人可以看到你都抄送給了誰 * Message.RecipientType.BCC 暗送,也是發郵件的時候順便給另一個人暗發一份,但是,不同于上邊的是,收件人不能看到你都暗送給了誰 * */ public class Demo2 extends TestCase { private static final String sendUserName = "wangxiangpan@126.com" ; // 發送郵件需要連接的服務器的用戶名 private static final String sendPassword = "pwd" ; // 發送郵件需要連接的服務器的密碼 private static final String sendProtocol = "smtp" ; // 發送郵件使用的端口 private static final String sendHostAddress = "smtp.126.com" ; // 發送郵件使用的服務器的地址 public void test() throws AddressException, MessagingException { Properties properties = new Properties(); properties.setProperty( "mail.smtp.auth" , "true" ); // 服務器需要認證 properties.setProperty( "mail.transport.protocol" , sendProtocol); // 聲明發送郵件使用的端口 properties.setProperty( "mail.host" , sendHostAddress); // 發送郵件的服務器地址 Session session = Session.getInstance(properties, new Authenticator() { protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(sendUserName, sendPassword); } }); session.setDebug( true ); //在后臺打印發送郵件的實時信息 Message message = new MimeMessage(session); message.setFrom( new InternetAddress( "wangxiangpan@126.com" )); message.setSubject( "Demo2JavaCode發送郵件測試,采用Authenticator" ); // 設置主題 message.setRecipients(Message.RecipientType.TO, InternetAddress .parse( "492134880@qq.com,wangxiangpan@126.com" )); // 發送 message.setRecipients(Message.RecipientType.CC, InternetAddress .parse( "msn_wangxiangpan@hotmail.com" )); // 抄送 message .setContent( "<span style=" font-size:20px; color:#FFCCFF " mce_style=" font-size:20px; color:#FFCCFF ">如果您看到,證明測試成功了!</span>" , "text/html;charset=gbk" ); Transport.send(message); //發送郵件 } } |
我們發送一個比較復雜的郵件,包括附件,圖文:
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
|
import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.util.Properties; import javax.activation.DataHandler; import javax.activation.DataSource; import javax.activation.FileDataSource; import javax.mail.Authenticator; import javax.mail.MessagingException; import javax.mail.PasswordAuthentication; import javax.mail.Session; import javax.mail.Transport; import javax.mail.Message.RecipientType; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; import javax.mail.internet.MimeUtility; /** * * @author Administrator Mr XP.Wang * MimeMultipart 一般電子郵件的容器是Multipart,定義了增加及刪除電子郵件各部分內容的方法, * 但是其是抽象類,需要其子類MimeMultipart來時用MimeMessage對象 * MimeBodyPart 是BodyPart具體用于mimeMessage的一個子類,MimeBodyPart對象代表一個 * mimeMultipart對象的每一個部分 * MimeUtility.encodeText(String cn)用于解決郵件中的頭部信息中中文的亂碼問題 * */ public class Demo3_test { public static void main(String[] args) throws Exception { Properties properties = new Properties(); properties.setProperty( "mail.smtp.auth" , "true" ); // 服務器需要認證 properties.setProperty( "mail.transport.protocol" , "smtp" ); // 聲明發送郵件使用的端口 properties.setProperty( "mail.host" , "smtp.126.com" ); // 發送郵件的服務器地址 Session session = Session.getInstance(properties, new Authenticator() { String sendUserName = "wangxiangpan@126.com" ; String sendPassword = "pwd" ; protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(sendUserName, sendPassword); } }); session.setDebug( true ); MimeMessage msg = new MimeMessage(session); // 聲明一個郵件體 msg.setFrom( new InternetAddress( "/" "+MimeUtility.encodeText(" Mr XP.Wang ")+" / "<wangxiangpan@126.com>" )); msg.setSubject( "這是我的第一份復雜郵件" ); //設置郵件主題 msg.setRecipients(MimeMessage.RecipientType.TO, InternetAddress.parse(MimeUtility.encodeText( "王翔攀" )+ "<wangxiangpan@126.com>," +MimeUtility.encodeText( "三毛" )+ "<492134880@qq.com>" )); MimeMultipart msgMultipart = new MimeMultipart( "mixed" ); // 標明郵件的組合關系,混合的關系 msg.setContent(msgMultipart); // 設置郵件體 MimeBodyPart attch1 = new MimeBodyPart(); // 附件1 MimeBodyPart attch2 = new MimeBodyPart(); // 附件2 // 將附件和正文設置到這個郵件體中 msgMultipart.addBodyPart(attch1); msgMultipart.addBodyPart(attch2); msgMultipart.addBodyPart(content); // 設置第一個附件 DataSource ds1 = new FileDataSource( "F:/ACCP5.0/文件/ssh配置.txt" ); // 指定附件的數據源 DataHandler dh1 = new DataHandler(ds1); // 附件的信息 attch1.setDataHandler(dh1); // 指定附件 attch1.setFileName( "ssh.txt" ); // 設置第二個附件 DataSource ds2 = new FileDataSource( "resource/48.jpg" ); // 指定附件的數據源 DataHandler dh2 = new DataHandler(ds2); // 附件的信息 attch2.setDataHandler(dh2); // 指定附件 attch2.setFileName( "48.jpg" ); //設置郵件的正文 MimeMultipart bodyMultipart = new MimeMultipart( "related" ); //依賴關系 content.setContent(bodyMultipart); //指定正文 MimeBodyPart htmlPart = new MimeBodyPart(); MimeBodyPart gifPart = new MimeBodyPart(); bodyMultipart.addBodyPart(htmlPart); bodyMultipart.addBodyPart(gifPart); DataSource gifds = new FileDataSource( "resource/48.jpg" ); //正文的圖片 DataHandler gifdh = new DataHandler(gifds); gifPart.setHeader( "Content-Location" , "http://mimg.126.net/logo/126logo.gif" ); gifPart.setDataHandler(gifdh); //設置正文的圖片 htmlPart.setContent( "我只是來打醬油的,這是我的形象照!<img src=" / " mce_src=" / "" http: //mimg.126.net/logo/126logo.gif/">", "text/html;charset=gbk");//設置正文文字 msg.saveChanges(); //保存郵件 //將郵件保存成文件 OutputStream ops = new FileOutputStream( "C:/Users/Administrator/Desktop/test.eml" ); msg.writeTo(ops); ops.close(); Transport.send(msg); } } |
收取郵件
示例:Rose 收取最近一封郵件。
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
|
import java.util.Date; import java.util.Properties; import javax.mail.Folder; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.NoSuchProviderException; import javax.mail.Session; import javax.mail.Store; public class FetchMail { public static void main(String[] args) { String protocol = "pop3" ; boolean isSSL = true ; String host = "pop.163.com" ; int port = 995 ; String username = "rose@163.com" ; String password = "rose" ; Properties props = new Properties(); props.put( "mail.pop3.ssl.enable" , isSSL); props.put( "mail.pop3.host" , host); props.put( "mail.pop3.port" , port); Session session = Session.getDefaultInstance(props); Store store = null ; Folder folder = null ; try { store = session.getStore(protocol); store.connect(username, password); folder = store.getFolder( "INBOX" ); folder.open(Folder.READ_ONLY); int size = folder.getMessageCount(); Message message = folder.getMessage(size); String from = message.getFrom()[ 0 ].toString(); String subject = message.getSubject(); Date date = message.getSentDate(); System.out.println( "From: " + from); System.out.println( "Subject: " + subject); System.out.println( "Date: " + date); } catch (NoSuchProviderException e) { e.printStackTrace(); } catch (MessagingException e) { e.printStackTrace(); } finally { try { if (folder != null ) { folder.close( false ); } if (store != null ) { store.close(); } } catch (MessagingException e) { e.printStackTrace(); } } System.out.println( "接收完畢!" ); } } |