首页 > 编程 > Java > 正文

java实现系统捕获异常发送邮件案例

2019-11-26 13:37:37
字体:
来源:转载
供稿:网友

在实际运用中,比如你淘宝购物,申请退款,这时你在邮箱中看到退款邮件,或者你注册某个账号,申请验证邮箱通知等等,这些都是邮件发送,这里将介绍下系统捕获异常发送邮件案例。

准备工作:
eclipse4.5 64位
jdk1.7 64位

邮件发送所需jar:

fastjson-1.1.24.jar,javax.mail-1.5.6.jar

类Developer:

枚举类型,发送邮件人姓名和邮箱地址

package mail; /**  * @class:Developer  *@descript:枚举类型,发送邮件人姓名和邮箱地址  *@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");      //发件人姓名   private String name;   //发件人email   private String mail;      private Developer() {        }      private Developer(String name, String mail) {     this.name = name;     this.mail = mail;   }      /**    * @descript:传递发件人姓名得到该发件人的邮箱    * @param name 发件人姓名    * @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:发件人信息

package mail; /**  * @class:ExceptionInfo  *@descript:发件人信息  *@date:2016年10月26日 下午8:11:27  *@author sanghaiqin  *@version:V1.0  */ public class ExceptionInfo {    //发件人姓名   private String developer;   //发件人方法   private String method;   //发件人url   private String url;   //发件人捕获异常信息   private Exception e;      /**    * @param developer 发件人姓名    * @param method 发件人方法    * @param url 发件人url    * @param e 发件人捕获异常信息    */   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:发送邮箱信息

package mail;  import java.util.Properties; /**  * @class:MailSenderInfo  *@descript:发送邮箱信息  *@date:2016年10月26日 下午8:14:22  *@author sanghaiqin  *@version:V1.0  */ public class MailSenderInfo {   //发送邮件的服务器的IP   private String mailServerHost;   //发送邮件的服务器的端口默认为25   private String mailServerPort = "25";   // 邮件发送者的地址   private String fromAddress;   // 邮件接收者的地址   private String toAddress;   // 登陆邮件发送服务器的用户名   private String username;   // 登陆邮件发送服务器的密码   private String password;   // 是否需要身份验证   private boolean validate = false;   // 邮件主题   private String subject;   // 邮件的文本内容   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("邮件发送者用户名:"+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:

#-------------------邮件功能------------------ #----------------这两个是构建session必须的字段---------- #smtp服务器,构建session回话必须的字段 mail.smtp.host=smtp.163.com #身份验证,构建session回话必须的字段 mail.smtp.auth=true #-------------------------------------------------------------- #发送者的邮箱用户名 mail.sender.username=neo_lifes@163.com #发送者的邮箱密码 mail.sender.password=827623LIU #发送者的邮箱地址 mail.sender.address=neo_lifes@163.com 

类JavaMail:发送邮箱

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:发送信息邮箱  *所需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 {       //通过发送者获得发送者邮箱       String mail = Developer.getMail(info.getDeveloper());       if(mail!=null){         MailSenderInfo mailInfo = new MailSenderInfo();         //设置邮件的文本内容         mailInfo.setContent("负责人 : "+info.getDeveloper()+"==>服务器 ip:"+InetAddress.getLocalHost().getHostAddress()+"==>方法名: "+info.getMethod()+"==>地址:"+info.getUrl()+"==>异常信息: "+getEmessage(info.getE()));         //设置邮件接收者的地址         mailInfo.setToAddress(mail);         //邮件主题         mailInfo.setSubject("易卡爱途异常通知");         //发送邮件         sendTextMail(mailInfo);       }     } catch (UnknownHostException e) {       e.printStackTrace();     }   }      /**    * @descript:以文本格式发送邮件    * @param: mailInfo 待发送的邮件的信息    * @return: 发送成功返回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"))) {         // 如果需要身份认证,则创建一个密码验证器         authenticator = new MyAuthenticator(pro.getProperty("mail.sender.username"),pro.getProperty("mail.sender.password"));       }       // 根据邮件会话属性和密码验证器构造一个发送邮件的session       Session sendMailSession = Session.getDefaultInstance(pro, authenticator);       // 根据session创建一个邮件消息       Message mailMessage = new MimeMessage(sendMailSession);       // 创建邮件发送者地址       Address from = new InternetAddress(pro.getProperty("mail.sender.address"));       // 设置邮件消息的发送者       mailMessage.setFrom(from);       // 创建邮件的接收者地址,并设置到邮件消息中       Address to = new InternetAddress(mailInfo.getToAddress());       // Message.RecipientType.TO属性表示接收者的类型为TO       mailMessage.setRecipient(Message.RecipientType.TO, to);       // 设置邮件消息的主题       mailMessage.setSubject(mailInfo.getSubject());       // 设置邮件消息发送的时间       mailMessage.setSentDate(new Date());       // 设置邮件消息的主要内容       mailMessage.setText(mailInfo.getContent());       // 发送邮件       Transport.send(mailMessage);       return true;     } catch (MessagingException ex) {       ex.printStackTrace();     }     return false;   }    /**    * @descript:以HTML格式发送邮件    * @param mailInfo: 待发送的邮件的信息    * @param attachment:附件内容    * @return:发送成功返回true;失败返回false    */   public static boolean sendHtmlMail(MailSenderInfo mailInfo, String[] attachment) {     // 判断是否需要身份认证     MyAuthenticator authenticator = null;     Properties pro = mailInfo.getProperties();     try {       // 如果需要身份认证,则创建一个密码验证器       if ("true".trim().equals(pro.getProperty("mail.smtp.auth"))) {         // 如果需要身份认证,则创建一个密码验证器         authenticator = new MyAuthenticator(pro.getProperty("mail.sender.username"),pro.getProperty("mail.sender.password"));       }       // 根据邮件会话属性和密码验证器构造一个发送邮件的session       Session sendMailSession = Session.getDefaultInstance(pro, authenticator);       // 根据session创建一个邮件消息       Message mailMessage = new MimeMessage(sendMailSession);       // 创建邮件发送者地址       Address from = new InternetAddress(pro.getProperty("mail.sender.address"));       // 设置邮件消息的发送者       mailMessage.setFrom(from);       // 创建邮件的接收者地址,并设置到邮件消息中       Address to = new InternetAddress(mailInfo.getToAddress());       // Message.RecipientType.TO属性表示接收者的类型为TO       mailMessage.setRecipient(Message.RecipientType.TO, to);       // 设置邮件消息的主题       mailMessage.setSubject(mailInfo.getSubject());       // 设置邮件消息发送的时间       mailMessage.setSentDate(new Date());       // MiniMultipart类是一个容器类,包含MimeBodyPart类型的对象       Multipart mainPart = new MimeMultipart();       // 创建一个包含HTML内容的MimeBodyPart       BodyPart html = new MimeBodyPart();       // 设置HTML内容       html.setContent(mailInfo.getContent(), "text/html; charset=utf-8");       //添加HTML内容的MimeBodyPart       mainPart.addBodyPart(html);       // 添加附件的内容       if (attachment != null) {         for (String filePath : attachment) {           MimeBodyPart filePart = new MimeBodyPart();           DataSource source = new FileDataSource(filePath);           filePart.setDataHandler(new DataHandler(source));           try {             // 网上流传的解决文件名乱码的方法,其实用MimeUtility.encodeWord就可以很方便的搞定             filePart.setFileName(MimeUtility.encodeWord(source.getName()));           } catch (UnsupportedEncodingException e) {             e.printStackTrace();           }           mainPart.addBodyPart(filePart);         }       }       // 将MiniMultipart对象设置为邮件内容       mailMessage.setContent(mainPart);       //保持内容       mailMessage.saveChanges();       // 发送邮件       Transport.send(mailMessage);       return true;     } catch (MessagingException ex) {       ex.printStackTrace();     }     return false;   }         /**    * @descript:获得发送者方法的异常信息    * 使用字符串作为物理节点的字符输入输出流的用法,即StringReader和StringWriter的用法    * PrintWriter(Writer out, boolean autoFlush) 创建带自动行刷新的新 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:发送邮件以文本格式     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:发送邮件以html格式     MailSenderInfo mailInfo = new MailSenderInfo();     mailInfo.setToAddress("1522580013@qq.com");       // 设置接受者邮箱地址     mailInfo.setSubject("标题");      mailInfo.setContent("内容<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); // 发送html格式          System.out.println("发送成功");             }    } 

测试截图:

测试1:发送邮件以文本格式:

测试2:发送邮件以html格式:


项目结构截图:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持武林网。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表