java實現(xiàn)系統(tǒng)捕獲異常發(fā)送郵件案例
在實際運用中,比如你淘寶購物,申請退款,這時你在郵箱中看到退款郵件,或者你注冊某個賬號,申請驗證郵箱通知等等,這些都是郵件發(fā)送,這里將介紹下系統(tǒng)捕獲異常發(fā)送郵件案例。
準備工作:
eclipse4.5 64位
jdk1.7 64位
郵件發(fā)送所需jar:
fastjson-1.1.24.jar,javax.mail-1.5.6.jar
類Developer:
枚舉類型,發(fā)送郵件人姓名和郵箱地址
package mail;
/**
* @class:Developer
*@descript:枚舉類型,發(fā)送郵件人姓名和郵箱地址
*@date:2016年10月26日 下午8:07:50
*@author sanghaiqin
*@version:V1.0
*/
public enum Developer {
zhoujing("周靜","405687038@qq.com"),
peiyuxiang("裴玉翔","498736875@qq.com"),
yipeng("乙鵬","729325112@qq.com"),
liuan("劉安","2211747233@qq.com"),
chenyuhao("陳宇豪","631604198@qq.com"),
wangdong("王棟","1217295649@qq.com"),
sanghaiqin("桑海芹","1522580013@qq.com");
//發(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ā)件人信息
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ā)送郵箱信息
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ù)器的端口默認為25
private String mailServerPort = "25";
// 郵件發(fā)送者的地址
private String fromAddress;
// 郵件接收者的地址
private String toAddress;
// 登陸郵件發(fā)送服務(wù)器的用戶名
private String username;
// 登陸郵件發(fā)送服務(wù)器的密碼
private String password;
// 是否需要身份驗證
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:用戶驗證
package mail;
import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;
/**
* @class:MyAuthenticator
*@descript:用戶驗證
*@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文件工具類
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得到一個資源文件
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");
System.out.println("郵件發(fā)送者用戶名:"+mailSenderUsername);//neo_lifes@163.com
String path = PropertyUtil.class.getClassLoader().getResource("prop.properties").getPath();
System.out.println(path);// /G:/Workspaces4.4/test/bin/prop.properties
}
}
資源文件pro.properties:
#-------------------郵件功能------------------ #----------------這兩個是構(gòu)建session必須的字段---------- #smtp服務(wù)器,構(gòu)建session回話必須的字段 mail.smtp.host=smtp.163.com #身份驗證,構(gòu)建session回話必須的字段 mail.smtp.auth=true #-------------------------------------------------------------- #發(fā)送者的郵箱用戶名 mail.sender.username=neo_lifes@163.com #發(fā)送者的郵箱密碼 mail.sender.password=827623LIU #發(fā)送者的郵箱地址 mail.sender.address=neo_lifes@163.com
類JavaMail:發(fā)送郵箱
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("負責人 : "+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) {
// 判斷是否需要身份認證
MyAuthenticator authenticator = null;
Properties pro = mailInfo.getProperties();
try {
if ("true".trim().equals(pro.getProperty("mail.smtp.auth"))) {
// 如果需要身份認證,則創(chuàng)建一個密碼驗證器
authenticator = new MyAuthenticator(pro.getProperty("mail.sender.username"),pro.getProperty("mail.sender.password"));
}
// 根據(jù)郵件會話屬性和密碼驗證器構(gòu)造一個發(fā)送郵件的session
Session sendMailSession = Session.getDefaultInstance(pro, authenticator);
// 根據(jù)session創(chuàng)建一個郵件消息
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ā)送的時間
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) {
// 判斷是否需要身份認證
MyAuthenticator authenticator = null;
Properties pro = mailInfo.getProperties();
try {
// 如果需要身份認證,則創(chuàng)建一個密碼驗證器
if ("true".trim().equals(pro.getProperty("mail.smtp.auth"))) {
// 如果需要身份認證,則創(chuàng)建一個密碼驗證器
authenticator = new MyAuthenticator(pro.getProperty("mail.sender.username"),pro.getProperty("mail.sender.password"));
}
// 根據(jù)郵件會話屬性和密碼驗證器構(gòu)造一個發(fā)送郵件的session
Session sendMailSession = Session.getDefaultInstance(pro, authenticator);
// 根據(jù)session創(chuàng)建一個郵件消息
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ā)送的時間
mailMessage.setSentDate(new Date());
// MiniMultipart類是一個容器類,包含MimeBodyPart類型的對象
Multipart mainPart = new MimeMultipart();
// 創(chuàng)建一個包含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)上流傳的解決文件名亂碼的方法,其實用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é)點的字符輸入輸出流的用法,即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.setToAddress("1522580013@qq.com"); // 設(shè)置接受者郵箱地址
mailInfo.setSubject("標題");
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格式:

項目結(jié)構(gòu)截圖:

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot中注冊Bean的10種方式總結(jié)
在Spring Boot應(yīng)用中,Bean是構(gòu)成應(yīng)用的核心組件,Spring容器負責管理這些Bean,包括它們的創(chuàng)建、配置、組裝、管理和銷毀,在Spring Boot中,有多種方式可以注冊Bean,本文將詳細介紹這些不同的注冊方式,并給出相應(yīng)的示例代碼和適用場景,需要的朋友可以參考下2024-08-08
SpringBoot+ShardingSphereJDBC實現(xiàn)讀寫分離詳情
這篇文章主要介紹了SpringBoot+ShardingSphereJDBC實現(xiàn)讀寫分離詳情,通過用??MySQL??進行一主一從的主從復(fù)制展開全文內(nèi)容,需要的朋友可以參考一下2022-08-08
解決spring-boot-starter-web等報紅問題
這篇文章主要介紹了解決spring-boot-starter-web等報紅問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-07-07
idea中無法自動裝配未找到 ‘XXXXXXX‘ 類型的 Bean
本文主要介紹了idea中無法自動裝配未找到 ‘XXXXXXX‘ 類型的 Bean的原因及三種解決方法,具有一定的參考價值,感興趣的可以了解一下2024-03-03
阿里nacos+springboot+dubbo2.7.3統(tǒng)一處理異常的兩種方式
本文主要介紹了阿里nacos+springboot+dubbo2.7.3統(tǒng)一處理異常的兩種方式,文中根據(jù)實例編碼詳細介紹的十分詳盡,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-03-03
教你怎么用SpringBoot+Mybati-Plus快速搭建代碼
Mybatis自身通過了逆向工程來幫助我們快速生成代碼,但Mybatis-plus卻更加強大,不僅僅可以生成dao,pojo,mapper,還有基本的controller和service層代碼,接下來我們來寫一個簡單的人門案例是看看如何mybatis-plus是怎么實現(xiàn)的,需要的朋友可以參考下2021-06-06

