实现Email的发送
项目中可能会遇到许多业务,需要验证,例如“忘记密码,通过邮件找回密码”,通过发送邮件验证能避免信息不安全的的可能性,下面我们一起来集成这个工具类。
如何配置账号信息,举例:qq 邮箱
(1).点开qq邮箱里面的设置
(2).点开账户
(3).点击生成授权码(不要乱传)
application.properties添加配置文件
<!-- 引入mail相关jar包 -->
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
</dependency>
直接上代码MailUtil.java
import java.util.Properties;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class MailUtil {
private static final Logger logger =LoggerFactory.getLogger(MailUtil.class);
// 邮件发送协议
private final static String PROTOCOL = "smtp";
// 是否要求身份认证
private final static String IS_AUTH = "true";
// 是否启用调试模式(启用调试模式可打印客户端与服务器交互过程时一问一答的响应消息)
private final static String IS_ENABLED_DEBUG_MOD = "true";
// SMTP邮件服务器默认端口
private final static String PORT = "25";
/**
* 发送邮件工具类:通过qq邮件发送,因为具有ssl加密,采用的是smtp协议
* @param mailServer 邮件服务器的主机名:如 "smtp.qq.com"
* @param loginAccount 登录邮箱的账号:如 "165468745@qq.com"
* @param loginAuthCode 登录qq邮箱时候需要的授权码:可以进入qq邮箱,账号设置那里"生成授权码"
* @param sender 发件人
* @param recipients 收件人:支持群发
* @param emailSubject 邮件的主题
* @param emailContent 邮件的内容
* @param emailContentType 邮件内容的类型,支持纯文本:"text/plain;charset=utf-8";,带有Html格式的内容:"text/html;charset=utf-8"
* @return
*/
public static boolean sendEmail(String mailServer,final String loginAccount,final String loginAuthCode,String sender,String[] recipients,
String emailSubject,String emailContent,String emailContentType){
boolean res=true;
try {
//跟smtp服务器建立一个连接
Properties p = new Properties();
//设置邮件服务器主机名
p.setProperty("mail.host",mailServer);
p.setProperty("mail.smtp.port", PORT);
//发送服务器需要身份验证,要采用指定用户名密码的方式去认证
p.setProperty("mail.smtp.auth", IS_AUTH);
//发送邮件协议名称
p.setProperty("mail.transport.protocol", PROTOCOL);
p.setProperty("mail.debug",IS_ENABLED_DEBUG_MOD);
//使用 STARTTLS安全连接(此句必加)
p.setProperty("mail.smtp.starttls.enable", "true");
/*--------------------------------华丽的分割线----------------------------------------*/
// 建立会话
Session session = Session.getInstance(p);
//声明一个Message对象(代表一封邮件),从session中创建
MimeMessage msg = new MimeMessage(session);
//邮件封装发件人
msg.setFrom(new InternetAddress(sender));
// 收件人
InternetAddress[] receptientsEmail=new InternetAddress[recipients.length];
for(int i=0;i<recipients.length;i++){
receptientsEmail[i]=new InternetAddress(recipients[i]);
}
//多个收件人
msg.setRecipients(Message.RecipientType.TO,receptientsEmail);
//3邮件内容:主题、内容
msg.setSubject(emailSubject);
msg.setContent(emailContent,emailContentType);//发html格式的文本
/*--------------------------------华丽的分割线----------------------------------------*/
// 邮件服务器进行验证
Transport tran = session.getTransport("smtp");
// *配置发送者的邮箱账户名和密码
tran.connect(mailServer, loginAccount, loginAuthCode);
//发送动作
tran.sendMessage(msg, msg.getAllRecipients());
logger.info("邮件发送成功!---发送人:{},收件人{}。",sender,receptientsEmail.toString());
res=1;
} catch (Exception e) {
logger.info("邮件发送失败: "+e.getMessage());
res=false;
}
return res;
}
public static void main(String[] args) throws Exception {
boolean res=sendEmail("smtp.qq.com", "登陆账户的qq邮箱", "授权码", "发送人的qq邮箱", new String[]{ "xxxxxxxxx@qq.com","xxxxxxxxxx@126.com" //这里就是一系列的收件人的邮箱了}, "mail测试标题", "mail测试内容: <a href='http://blog.csdn.net/u013871100'>我的blog</a>,祝您生活愉快!","text/html;charset=utf-8");
logger.info("\n发送结果:"+res);
}
遇到的问题
之前看过很多帖子,都有发送失败的。下面我总结一下失败原因。
相关报错提示: color=530 Error: A secure connection is requiered(such as ssl). More information at http://service.mail.qq.com/cgi-bin/help?id=28
之前有说加下面这段代码
MailSSLSocketFactory sf = new MailSSLSocketFactory();
sf.setTrustAllHosts(true);
p.put("mail.smtp.ssl.enable", "true");
p.put("mail.smtp.ssl.socketFactory", sf);
进过测试,结果还是行,经过多番查找,发现必须加下面段代码,类中代码已加。
//使用 STARTTLS安全连接(此句必加)
p.setProperty("mail.smtp.starttls.enable", "true");
到此,email的工具类集成完毕,若有问题希望大家即时提出,以便于解决。