欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2024-03-12 16:42:38
在实际运用中,比如你淘宝购物,申请退款,这时你在邮箱中看到退款邮件,或者你注册某个账号,申请验证邮箱通知等等,这些都是邮件发送,这里将介绍下系统捕获异常发送邮件案例。...

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

准备工作:
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:发送邮件以文本格式:

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

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

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

项目结构截图:

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

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