java 使用JavaMail 做异常邮件报警 ,支持163邮箱、outlook邮箱

1 篇文章 0 订阅
1 篇文章 0 订阅

需求

想要使用邮件来监控服务器上的异常信息,当程序抛出指定自定义异常的时候将异常信息以邮件的形式发送到监控的邮箱。

要求
1、发生异常时捕获异常信息
2、时实发送信息邮件到目标邮箱
解决方案
1、自定义一个基本的异常,其他的使用异常继承改异常
2、该异常的构造方法接收信息参数和具体异常实体,然后生成邮件信息,发送邮件
3、具体的程序发生异常时捕获抛出的异常,然后抛出一个自定义的基本异常的子类或他本身

自定义异常

用于异常信息采集和邮件发送

package exception;

import tool.MailTo;
import java.io.ByteArrayOutputStream;
import java.io.IOException;

/**
 * Created by yuyu on 2018/2/23.
 * 基本的自定义异常,所有接下来的自定义异常继承这个类
 */
public class BaseException extends RuntimeException {

    public BaseException(String message) {
        super(message);
    }

    public BaseException(String message, Throwable cause) {

        super(message, cause);

        //将异常信息发送出去
        String title="DOBEONE发生异常!";
        ByteArrayOutputStream buf = new java.io.ByteArrayOutputStream();
        cause.printStackTrace(new java.io.PrintWriter(buf, true));
        //设置发送信息
        String  body = "<h1>"+title+"</h1>"
                +"<p>异常信息:"+message+"</p>"
                +"<p>"+buf.toString()+"</p>";
        try {
            buf.close();
        } catch (IOException e1) {
            e1.printStackTrace();
        }
        //按实际需要选择
        MailTo.sendMail163(title,body);//163邮箱
        MailTo.sendMailOutLook(title,body);//outlook邮箱
    }
}

邮件发送工具

支持163邮箱、outlook邮箱

package tool;

import javax.mail.*;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Properties;

/**
 * 发送邮件工具类
 * Created by yuyu on 2018/2/23.
 */
public class MailTo {

    /**
     * 发送邮件到自己的163邮箱
     * @param title 需要传输的标题
     * @param body 需要传输的内容
     * @return
     */
    public static boolean sendMail163(String title, String body) {

        //设置参数
        Properties props = new Properties();
        props.put("mail.smtp.ssl.enable", "true");
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.host", "smtp.163.com");
        props.put("mail.transport.protocol", "smtp");
        props.put("mail.smtp.port", 465);
        //自定义信息
        props.put("username", "xxxx@163.com");//你的邮箱
        props.put("password", "xxxx");//你的密码
        props.put("to", "xxxx@163.com");//接收的邮箱

        return MailTo.send(props,title,body);
    }

    /**
     *  发送邮件到gmail
     *  国内网络无法访问(因为众所周知的原因)
     * @param title 标题
     * @param body  内容
     * @return
     */
    public  static boolean sendMailGmail(String title, String body){

        //设置参数
        Properties props = new Properties();
        props.put("mail.smtp.host", "smtp.gmail.com");
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.ssl.enable", "true");
        props.put("mail.smtp.port", "465");
        props.put("mail.smtp.socketFactory.port", "465");
        props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
        //自定义信息
        props.put("username", "xxxx@gmail.com");//你的邮箱
        props.put("password", "xxxx");//你的密码
        props.put("to", "xxxx@gmail.com");//接收的邮箱

        return MailTo.send(props,title,body);

    }
    /**
     *  发送邮件到outlook
     * @param title 标题
     * @param body  内容
     * @return
     */
    public  static boolean sendMailOutLook(String title, String body){

        //设置参数
        Properties props = new Properties();
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.starttls.enable", "true");
        props.put("mail.smtp.host", "smtp.outlook.com");
        props.put("mail.smtp.port", "587");
        //自定义信息
        props.put("username", "xxxx@outlook.com");//你的邮箱
        props.put("password", "xxxx");//你的密码
        props.put("to", "xxxx@outlook.com");//接收的邮箱

        return MailTo.send(props,title,body);

    }

    /**
     * 获取系统当前的时间
     * 以传入时间格式返回,传空返回默认格式
     * @param format 时间格式
     * @return
     */
    private static String getTitleTimeFormat(String format){
        if (format==null){
            format="yyyy-MM-dd HH:mm:ss/SSS";
        }
        SimpleDateFormat df = new SimpleDateFormat(format);//设置日期格式
        return df.format(new Date());// new Date()为获取当前系统时间
    }

    /**
     * 发送邮件,获取参数,和标题还有内容
     * @param props 参数
     * @param title 标题
     * @param body 内容
     * @return
     */
    private static Boolean send(Properties props, String title, String body){
        //发送邮件地址
        final String username=props.getProperty("username");
        //发送邮件名称
        final String password=props.getProperty("password");
        //接收邮件地址
        String to=props.getProperty("to");

        Session session = Session.getInstance(props,
                new javax.mail.Authenticator() {
                    protected PasswordAuthentication getPasswordAuthentication() {
                        return new PasswordAuthentication(username, password);
                    }
                });

        try {
            Message message = new MimeMessage(session);

            message.setFrom(new InternetAddress(username));
            message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
            message.setSubject(title+"("+MailTo.getTitleTimeFormat(null)+")");
            message.setContent(body,"text/html;charset=utf-8");

            Transport.send(message);
        } catch (AddressException e) {
            e.printStackTrace();
        } catch (MessagingException e) {
            e.printStackTrace();
        }

        System.out.println("发送完毕!");

        return true;
    }

}

测试

测试代码

package tool;

import exception.BaseException;
import org.junit.Test;
import java.io.ByteArrayOutputStream;
import java.io.IOException;

/**
 * Created by yuyu on 2018/2/23.
 * 用于测试异常邮件发送
 */
public class MailToTest {
    @Test
    public void testCatch(){
        try{
            throw new BaseException("测试",new Exception());
        }catch (Exception e){
            e.printStackTrace();
        }
    }

}

测试截图
这里写图片描述
163邮件截图
这里写图片描述
outlook邮件截图
这里写图片描述

总结

1、虽然工具类中给出了gmail的方法,但是因为众所周知的原因无法访问的,请使用telnet命令检查您与服务器的连接,使用:telnet smtp.gmail.com 465
2、发送给别的邮箱可能会被当成垃圾邮件退信,请不要包含敏感字符
3、具体邮件的内容请自己修改美化

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用Java发送电子邮件,您需要使用JavaMail API。以下是使用JavaMail API和163邮箱发送电子邮件的示例代码: ```java import java.util.Properties; 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; public class SendEmail { public static void main(String[] args) { String to = "recipient@example.com"; // 收件人电子邮件 String from = "your_email@163.com"; // 发件人电子邮件 String password = "your_email_password"; // 发件人电子邮件密码 // 配置SMTP服务器属性 Properties properties = new Properties(); properties.put("mail.smtp.host", "smtp.163.com"); properties.put("mail.smtp.port", "25"); properties.put("mail.smtp.auth", "true"); // 获取会话对象并进行身份验证 Session session = Session.getDefaultInstance(properties, new javax.mail.Authenticator() { protected javax.mail.PasswordAuthentication getPasswordAuthentication() { return new javax.mail.PasswordAuthentication(from, password); } }); try { // 创建MimeMessage对象 MimeMessage message = new MimeMessage(session); // 设置发件人 message.setFrom(new InternetAddress(from)); // 设置收件人 message.addRecipient(Message.RecipientType.TO, new InternetAddress(to)); // 设置邮件主题 message.setSubject("Test Email"); // 设置邮件正文 message.setText("Hello, this is a test email from Java."); // 发送电子邮件 Transport.send(message); System.out.println("Email sent successfully."); } catch (MessagingException e) { throw new RuntimeException(e); } } } ``` 请注意,您需要将您的电子邮件地址和密码替换为示例代码中的“your_email@163.com”和“your_email_password”。另外,请确保在使用此代码之前已经在您的帐户中启用了SMTP服务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值