在實(shí)際運(yùn)用中,比如你淘寶購物,申請退款,這時(shí)你在郵箱中看到退款郵件,或者你注冊某個(gè)賬號,申請驗(yàn)證郵箱通知等等,這些都是郵件發(fā)送,這里將介紹下系統(tǒng)捕獲異常發(fā)送郵件案例。
準(zhǔn)備工作:
eclipse4.5 64位
jdk1.7 64位
郵件發(fā)送所需jar:
fastjson-1.1.24.jar,javax.mail-1.5.6.jar
類Developer:
枚舉類型,發(fā)送郵件人姓名和郵箱地址
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
|
package mail; /** * @class:Developer *@descript:枚舉類型,發(fā)送郵件人姓名和郵箱地址 *@date:2016年10月26日 下午8:07:50 *@author sanghaiqin *@version:V1.0 */ public enum Developer { //發(fā)件人姓名 private String name; //發(fā)件人email private String mail; private Developer() { } private Developer(String name, String mail) { this .name = name; this .mail = mail; } /** * @descript:傳遞發(fā)件人姓名得到該發(fā)件人的郵箱 * @param name 發(fā)件人姓名 * @return */ public static String getMail(String name) { for (Developer c : Developer.values()) { if (c.getName().equals(name)) { return c.mail; } } return null ; } public String getName() { return name; } public void setName(String name) { this .name = name; } public String getMail() { return mail; } public void setMail(String mail) { this .mail = mail; } } |
類ExceptionInfo:發(fā)件人信息
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
|
package mail; /** * @class:ExceptionInfo *@descript:發(fā)件人信息 *@date:2016年10月26日 下午8:11:27 *@author sanghaiqin *@version:V1.0 */ public class ExceptionInfo { //發(fā)件人姓名 private String developer; //發(fā)件人方法 private String method; //發(fā)件人url private String url; //發(fā)件人捕獲異常信息 private Exception e; /** * @param developer 發(fā)件人姓名 * @param method 發(fā)件人方法 * @param url 發(fā)件人url * @param e 發(fā)件人捕獲異常信息 */ public ExceptionInfo(String developer, String method, String url, Exception e) { super (); this .developer = developer; this .method = method; this .url = url; this .e = e; } public String getDeveloper() { return developer; } public void setDeveloper(String developer) { this .developer = developer; } public String getMethod() { return method; } public void setMethod(String method) { this .method = method; } public String getUrl() { return url; } public void setUrl(String url) { this .url = url; } public Exception getE() { return e; } public void setE(Exception e) { this .e = e; } } |
類MailSenderInfo:發(fā)送郵箱信息
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
|
package mail; import java.util.Properties; /** * @class:MailSenderInfo *@descript:發(fā)送郵箱信息 *@date:2016年10月26日 下午8:14:22 *@author sanghaiqin *@version:V1.0 */ public class MailSenderInfo { //發(fā)送郵件的服務(wù)器的IP private String mailServerHost; //發(fā)送郵件的服務(wù)器的端口默認(rèn)為25 private String mailServerPort = "25" ; // 郵件發(fā)送者的地址 private String fromAddress; // 郵件接收者的地址 private String toAddress; // 登陸郵件發(fā)送服務(wù)器的用戶名 private String username; // 登陸郵件發(fā)送服務(wù)器的密碼 private String password; // 是否需要身份驗(yàn)證 private boolean validate = false ; // 郵件主題 private String subject; // 郵件的文本內(nèi)容 private String content; // 郵件附件的文件名 private String[] attachFileNames; public MailSenderInfo() { super (); } public String getMailServerHost() { return mailServerHost; } public void setMailServerHost(String mailServerHost) { this .mailServerHost = mailServerHost; } public String getMailServerPort() { return mailServerPort; } public void setMailServerPort(String mailServerPort) { this .mailServerPort = mailServerPort; } public boolean isValidate() { return validate; } public void setValidate( boolean validate) { this .validate = validate; } public String[] getAttachFileNames() { return attachFileNames; } public void setAttachFileNames(String[] fileNames) { this .attachFileNames = fileNames; } public String getFromAddress() { return fromAddress; } public void setFromAddress(String fromAddress) { this .fromAddress = fromAddress; } public String getPassword() { return password; } public void setPassword(String password) { this .password = password; } public String getToAddress() { return toAddress; } public void setToAddress(String toAddress) { this .toAddress = toAddress; } public String getUsername() { return username; } public void setUsername(String username) { this .username = username; } public String getSubject() { return subject; } public void setSubject(String subject) { this .subject = subject; } public String getContent() { return content; } public void setContent(String textContent) { this .content = textContent; } /** * @descript:獲得郵件會話屬性 * @return */ public Properties getProperties() { PropertyUtil propertyUtil = new PropertyUtil(); Properties properties =propertyUtil.readProperties(); return properties; } } |
類MyAuthenticator:用戶驗(yàn)證
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
|
package mail; import javax.mail.Authenticator; import javax.mail.PasswordAuthentication; /** * @class:MyAuthenticator *@descript:用戶驗(yàn)證 *@date:2016年10月26日 下午8:57:45 *@author sanghaiqin *@version:V1.0 */ public class MyAuthenticator extends Authenticator { //用戶名 String username = null ; //密碼 String password = null ; public MyAuthenticator() { } public MyAuthenticator(String username, String password) { this .username = username; this .password = password; } protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(username, password); } } |
類PropertyUtil:獲得properties文件工具類
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
|
package mail; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.util.Properties; /** * @class:PropertyUtil *@descript:獲得properties文件工具類 *@date:2016年10月26日 下午8:20:10 *@author sanghaiqin *@version:V1.0 */ public class PropertyUtil { /** * @descript:加載資源文件 * @param resources 資源文件 * @return * @throws FileNotFoundException */ private Properties loadProperties(String resources) { InputStream inputstream = null ; Properties properties = new Properties(); // 使用InputStream得到一個(gè)資源文件 try { inputstream = new FileInputStream(resources); // 加載配置文件 properties.load(inputstream); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { if (inputstream!= null ){ try { inputstream.close(); } catch (IOException e) { e.printStackTrace(); } } } return properties; } /** * @descript:讀屬性文件 * @return * @throws FileNotFoundException */ public Properties readProperties(){ String resources = PropertyUtil. class .getClassLoader().getResource( "prop.properties" ).getPath(); Properties properties = loadProperties(resources); return properties; } /** * @descript:測試 * @param args */ public static void main(String[] args) { PropertyUtil p= new PropertyUtil(); Properties pro=p.readProperties(); String mailSenderUsername=(String) pro.get( "mail.sender.username" ); String path = PropertyUtil. class .getClassLoader().getResource( "prop.properties" ).getPath(); System.out.println(path); // /G:/Workspaces4.4/test/bin/prop.properties } } |
資源文件pro.properties:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
#-------------------郵件功能------------------ #----------------這兩個(gè)是構(gòu)建session必須的字段---------- #smtp服務(wù)器,構(gòu)建session回話必須的字段 mail.smtp.host=smtp.163.com #身份驗(yàn)證,構(gòu)建session回話必須的字段 mail.smtp.auth=true #-------------------------------------------------------------- #發(fā)送者的郵箱用戶名 #發(fā)送者的郵箱密碼 mail.sender.password=827623LIU #發(fā)送者的郵箱地址 |
類JavaMail:發(fā)送郵箱
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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
|
package mail; import java.io.PrintWriter; import java.io.StringWriter; import java.io.UnsupportedEncodingException; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.Date; import java.util.Properties; import javax.activation.DataHandler; import javax.activation.DataSource; import javax.activation.FileDataSource; import javax.mail.Address; import javax.mail.BodyPart; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.Multipart; import javax.mail.Session; import javax.mail.Transport; 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; /** * @class:JavaMail *@descript:發(fā)送信息郵箱 *所需jar包: *fastjson-1.1.24.jar *javax.mail-1.5.6.jar *@date:2016年10月26日 下午8:13:05 *@author sanghaiqin *@version:V1.0 */ public class JavaMail { public static void sendExceptionMail(ExceptionInfo info){ try { //通過發(fā)送者獲得發(fā)送者郵箱 String mail = Developer.getMail(info.getDeveloper()); if (mail!= null ){ MailSenderInfo mailInfo = new MailSenderInfo(); //設(shè)置郵件的文本內(nèi)容 mailInfo.setContent( "負(fù)責(zé)人 : " +info.getDeveloper()+ "==>服務(wù)器 ip:" +InetAddress.getLocalHost().getHostAddress()+ "==>方法名: " +info.getMethod()+ "==>地址:" +info.getUrl()+ "==>異常信息: " +getEmessage(info.getE())); //設(shè)置郵件接收者的地址 mailInfo.setToAddress(mail); //郵件主題 mailInfo.setSubject( "易卡愛途異常通知" ); //發(fā)送郵件 sendTextMail(mailInfo); } } catch (UnknownHostException e) { e.printStackTrace(); } } /** * @descript:以文本格式發(fā)送郵件 * @param: mailInfo 待發(fā)送的郵件的信息 * @return: 發(fā)送成功返回true;失敗返回false */ public static boolean sendTextMail(MailSenderInfo mailInfo) { // 判斷是否需要身份認(rèn)證 MyAuthenticator authenticator = null ; Properties pro = mailInfo.getProperties(); try { if ( "true" .trim().equals(pro.getProperty( "mail.smtp.auth" ))) { // 如果需要身份認(rèn)證,則創(chuàng)建一個(gè)密碼驗(yàn)證器 authenticator = new MyAuthenticator(pro.getProperty( "mail.sender.username" ),pro.getProperty( "mail.sender.password" )); } // 根據(jù)郵件會話屬性和密碼驗(yàn)證器構(gòu)造一個(gè)發(fā)送郵件的session Session sendMailSession = Session.getDefaultInstance(pro, authenticator); // 根據(jù)session創(chuàng)建一個(gè)郵件消息 Message mailMessage = new MimeMessage(sendMailSession); // 創(chuàng)建郵件發(fā)送者地址 Address from = new InternetAddress(pro.getProperty( "mail.sender.address" )); // 設(shè)置郵件消息的發(fā)送者 mailMessage.setFrom(from); // 創(chuàng)建郵件的接收者地址,并設(shè)置到郵件消息中 Address to = new InternetAddress(mailInfo.getToAddress()); // Message.RecipientType.TO屬性表示接收者的類型為TO mailMessage.setRecipient(Message.RecipientType.TO, to); // 設(shè)置郵件消息的主題 mailMessage.setSubject(mailInfo.getSubject()); // 設(shè)置郵件消息發(fā)送的時(shí)間 mailMessage.setSentDate( new Date()); // 設(shè)置郵件消息的主要內(nèi)容 mailMessage.setText(mailInfo.getContent()); // 發(fā)送郵件 Transport.send(mailMessage); return true ; } catch (MessagingException ex) { ex.printStackTrace(); } return false ; } /** * @descript:以HTML格式發(fā)送郵件 * @param mailInfo: 待發(fā)送的郵件的信息 * @param attachment:附件內(nèi)容 * @return:發(fā)送成功返回true;失敗返回false */ public static boolean sendHtmlMail(MailSenderInfo mailInfo, String[] attachment) { // 判斷是否需要身份認(rèn)證 MyAuthenticator authenticator = null ; Properties pro = mailInfo.getProperties(); try { // 如果需要身份認(rèn)證,則創(chuàng)建一個(gè)密碼驗(yàn)證器 if ( "true" .trim().equals(pro.getProperty( "mail.smtp.auth" ))) { // 如果需要身份認(rèn)證,則創(chuàng)建一個(gè)密碼驗(yàn)證器 authenticator = new MyAuthenticator(pro.getProperty( "mail.sender.username" ),pro.getProperty( "mail.sender.password" )); } // 根據(jù)郵件會話屬性和密碼驗(yàn)證器構(gòu)造一個(gè)發(fā)送郵件的session Session sendMailSession = Session.getDefaultInstance(pro, authenticator); // 根據(jù)session創(chuàng)建一個(gè)郵件消息 Message mailMessage = new MimeMessage(sendMailSession); // 創(chuàng)建郵件發(fā)送者地址 Address from = new InternetAddress(pro.getProperty( "mail.sender.address" )); // 設(shè)置郵件消息的發(fā)送者 mailMessage.setFrom(from); // 創(chuàng)建郵件的接收者地址,并設(shè)置到郵件消息中 Address to = new InternetAddress(mailInfo.getToAddress()); // Message.RecipientType.TO屬性表示接收者的類型為TO mailMessage.setRecipient(Message.RecipientType.TO, to); // 設(shè)置郵件消息的主題 mailMessage.setSubject(mailInfo.getSubject()); // 設(shè)置郵件消息發(fā)送的時(shí)間 mailMessage.setSentDate( new Date()); // MiniMultipart類是一個(gè)容器類,包含MimeBodyPart類型的對象 Multipart mainPart = new MimeMultipart(); // 創(chuàng)建一個(gè)包含HTML內(nèi)容的MimeBodyPart BodyPart html = new MimeBodyPart(); // 設(shè)置HTML內(nèi)容 html.setContent(mailInfo.getContent(), "text/html; charset=utf-8" ); //添加HTML內(nèi)容的MimeBodyPart mainPart.addBodyPart(html); // 添加附件的內(nèi)容 if (attachment != null ) { for (String filePath : attachment) { MimeBodyPart filePart = new MimeBodyPart(); DataSource source = new FileDataSource(filePath); filePart.setDataHandler( new DataHandler(source)); try { // 網(wǎng)上流傳的解決文件名亂碼的方法,其實(shí)用MimeUtility.encodeWord就可以很方便的搞定 filePart.setFileName(MimeUtility.encodeWord(source.getName())); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } mainPart.addBodyPart(filePart); } } // 將MiniMultipart對象設(shè)置為郵件內(nèi)容 mailMessage.setContent(mainPart); //保持內(nèi)容 mailMessage.saveChanges(); // 發(fā)送郵件 Transport.send(mailMessage); return true ; } catch (MessagingException ex) { ex.printStackTrace(); } return false ; } /** * @descript:獲得發(fā)送者方法的異常信息 * 使用字符串作為物理節(jié)點(diǎn)的字符輸入輸出流的用法,即StringReader和StringWriter的用法 * PrintWriter(Writer out, boolean autoFlush) 創(chuàng)建帶自動行刷新的新 PrintWriter, true代表能自動刷新 * @param e 異常信息 * @return */ private static String getEmessage(Exception e){ //StringWriter輸出異常信息 StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw, true ); e.printStackTrace(pw); pw.flush(); sw.flush(); return sw.toString(); } /** * @descript:測試 * @param args */ public static void main(String[] args) { //測試1:發(fā)送郵件以文本格式 try { String s= "" ; s.substring( 2 ); } catch (Exception e) { e.printStackTrace(); System.out.println(getEmessage(e)); sendExceptionMail( new ExceptionInfo( Developer.sanghaiqin.getName(), "get()" , "123" ,e)); } //測試2:發(fā)送郵件以html格式 MailSenderInfo mailInfo = new MailSenderInfo(); mailInfo.setSubject( "標(biāo)題" ); mailInfo.setContent( "內(nèi)容<h1>www.baidu.com</h1>" ); String[] files = { "G:/upload/image/2016/10/28/1477372845440.jpg" , "G:/upload/image/2016/10/28/1477372845660.jpg" }; JavaMail.sendHtmlMail(mailInfo,files); // 發(fā)送html格式 System.out.println( "發(fā)送成功" ); } } |
測試截圖:
測試1:發(fā)送郵件以文本格式:
測試2:發(fā)送郵件以html格式:
項(xiàng)目結(jié)構(gòu)截圖:
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。