本项目详细介绍地址:https://zhuanlan.zhihu.com/p/74054179
在web应用中经常需要发送邮件,比如用户找回密码、系统异常时提醒开发人员、提醒用户生日、获取通知用户一些重要消息等等。
1.配置邮箱
1.1开启SMTP
这里以163为例
1.2开启邮箱授权码
授权码是用于登录第三方邮件客户端的专用密码。不同于邮箱密码,你用java代码发送邮箱时,使用邮箱密码是发不出去的,一定要填写自己在163设置的邮箱授权码。
2.使用java发送邮件
2.1导入依赖
你可以直接导入jar包,我这里使用的maven,直接导入坐标(GAV)让maven帮我下载jar。
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>1.5.6<version>
</dependency>
2.2使用java发送邮件
有了jar包支撑后,可以调用jmail的api了。
这个代码是在jmail的api上在进行一层封装,只需要将里面的邮箱和授权码换成你自己的,就可使用了。
package com.taotao.search.utils;
import java.util.Properties;
import javax.mail.Address;
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 MailUtils {
public static void sendEmail(String email,String subject,String text) throws MessagingException {
//1.创建一个程序与邮件服务器会话对象 Session
Properties properties = new Properties();
properties.setProperty("mail.smtp.auth", "true");//设置访问smtp服务器需要认证
properties.setProperty("mail.transport.protocol", "smtp"); //设置访问服务器的协议
Session session = Session.getDefaultInstance(properties);
//session.setDebug(true); //打开debug功能
//2.创建一个Message,它相当于是邮件内容
Message msg = new MimeMessage(session);
// 设置发送者
msg.setFrom(new InternetAddress("123456798@163.com"));
msg.setSubject(subject); //设置邮件主题
msg.setText(text); //设置邮件内容
//3.发送邮件
Transport trans = session.getTransport();
//连接邮箱smtp服务器;25为默认端口;163邮箱;客户端授权密码(注意,不是登录密码)
trans.connect("smtp.163.com", 25, "123456798@163.com", "123456798");
//邮件接收者
if(email==null)email="123456798@163.com";
trans.sendMessage(msg, new Address[]{new InternetAddress(email)}); //发送邮件
//关闭连接
trans.close();
}
}
2.3MailUtils测试
我这里是自己发给自己,只需要修改邮件接收者的email即可
邮件发送成功,通过这种方式,可以给别人发送。
3.发送web系统异常给开发人员
在全局异常处理器,增加发送邮件代码
由于邮件发送太慢,所以新增线程发送
//发邮件、发短信
Runnable runnable =new Runnable() {
@Override
public void run() {
try {
MailUtils.sendEmail(null,"搜索页面出现异常", StackTrace.getStackTrace(e));
} catch (AddressException e) {
e.printStackTrace();
} catch (MessagingException e) {
e.printStackTrace();
}
}
};
Thread thread = new Thread(runnable);
thread.start();
将抛出的异常堆栈信息转换为字符串,因为邮箱发送的是字符串,而我们无法直接将堆栈信息当成字符串来传,所以就需要转一下,新建工具类StackTrace
package com.taotao.search.utils;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.io.Writer;
public class StackTrace {
public static String getStackTrace(Throwable throwable) {
final Writer result = new StringWriter();
final PrintWriter printWriter = new PrintWriter(result);
throwable.printStackTrace(printWriter);
return result.toString();
}
}
当系统发送异常,全局异常处理器就会将异常信息通过邮件发送给开发人员