1.添加依赖
<!-- JavaMail依赖 -->
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4.7</version>
</dependency>
2.新建MailEntity类用来保存发送邮件时需要的参数字段
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
/**
* @author Administrator
* 发送邮件的实体类
* MailEntity类来保存发送邮件时需要的参数字段
*/
public class MailEntity implements Serializable{
//此处填写SMTP服务器
private String smtpService;
//设置端口号
private String smtpPort;
//设置发送邮箱
private String fromMailAddress;
// 设置发送邮箱的STMP口令
private String fromMailStmpPwd;
//设置邮件标题
private String title;
//设置邮件内容
private String content;
//内容格式(默认采用html)
private String contentType;
//接受邮件地址集合
private List<String> list = new ArrayList<>();
public String getSmtpService() {
return smtpService;
}
public void setSmtpService(String smtpService) {
this.smtpService = smtpService;
}
public String getSmtpPort() {
return smtpPort;
}
public void setSmtpPort(String smtpPort) {
this.smtpPort = smtpPort;
}
public String getFromMailAddress() {
return fromMailAddress;
}
public void setFromMailAddress(String fromMailAddress) {
this.fromMailAddress = fromMailAddress;
}
public String getFromMailStmpPwd() {
return fromMailStmpPwd;
}
public void setFromMailStmpPwd(String fromMailStmpPwd) {
this.fromMailStmpPwd = fromMailStmpPwd;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getContentType() {
return contentType;
}
public void setContentType(String contentType) {
this.contentType = contentType;
}
public List<String> getList() {
return list;
}
public void setList(List<String> list) {
this.list = list;
}
}
3.创建一个MailSender也就是邮件发送者实体,主要作用就是用来配置发送邮件参数以及执行发送邮件
import com.example.echart.entity.MailEntity;
import com.example.echart.util.PropertiesUtil;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeUtility;
import java.util.List;
import java.util.Properties;
public class MailSender {
//邮件实体
private static MailEntity mail = new MailEntity();
/**
* 设置邮件标题
* @param title 标题信息
* @return
*/
public MailSender title(String title){
mail.setTitle(title);
return this;
}
/**
* 设置邮件内容
* @param content
* @return
*/
public MailSender content(String content)
{
mail.setContent(content);
return this;
}
/**
* 设置邮件格式
* @param typeEnum
* @return
*/
public MailSender contentType(MailContentTypeEnum typeEnum)
{
mail.setContentType(typeEnum.getValue());
return this;
}
/**
* 设置请求目标邮件地址
* @param targets
* @return
*/
public MailSender targets(List<String> targets)
{
mail.setList(targets);
return this;
}
/**
* 执行发送邮件
* @throws Exception 如果发送失败会抛出异常信息
*/
public void send() throws Exception
{
//默认使用html内容发送
if(mail.getContentType() == null)
mail.setContentType(MailContentTypeEnum.HTML.getValue());
if(mail.getTitle() == null || mail.getTitle().trim().length() == 0)
{
throw new Exception("邮件标题没有设置.调用title方法设置");
}
if(mail.getContent() == null || mail.getContent().trim().length() == 0)
{
throw new Exception("邮件内容没有设置.调用content方法设置");
}
if(mail.getList().size() == 0)
{
throw new Exception("没有接受者邮箱地址.调用targets方法设置");
}
//读取/resource/mail_zh_CN.properties文件内容
final PropertiesUtil properties = new PropertiesUtil("mail");
// 创建Properties 类用于记录邮箱的一些属性
final Properties props = new Properties();
// 表示SMTP发送邮件,必须进行身份验证
props.put("mail.smtp.auth", "true");
//此处填写SMTP服务器
props.put("mail.smtp.host", properties.getValue("mail.smtp.service"));
//设置端口号,QQ邮箱给出了两个端口465/587
props.put("mail.smtp.port", properties.getValue("mail.smtp.prot"));
// 设置发送邮箱
props.put("mail.user", properties.getValue("mail.from.address"));
// 设置发送邮箱的16位STMP口令
props.put("mail.password", properties.getValue("mail.from.smtp.pwd"));
// 构建授权信息,用于进行SMTP进行身份验证
Authenticator authenticator = new Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
// 用户名、密码
String userName = props.getProperty("mail.user");
String password = props.getProperty("mail.password");
return new PasswordAuthentication(userName, password);
}
};
// 使用环境属性和授权信息,创建邮件会话
Session mailSession = Session.getInstance(props, authenticator);
// 创建邮件消息
MimeMessage message = new MimeMessage(mailSession);
// 设置发件人
String nickName = MimeUtility.encodeText(properties.getValue("mail.from.nickname"));
InternetAddress form = new InternetAddress(nickName + " <" + props.getProperty("mail.user") + ">");
message.setFrom(form);
// 设置邮件标题
message.setSubject(mail.getTitle());
//html发送邮件
if(mail.getContentType().equals(MailContentTypeEnum.HTML.getValue())) {
// 设置邮件的内容体
message.setContent(mail.getContent(), mail.getContentType());
}
//文本发送邮件
else if(mail.getContentType().equals(MailContentTypeEnum.TEXT.getValue())){
message.setText(mail.getContent());
}
//发送邮箱地址
List<String> targets = mail.getList();
for(int i = 0;i < targets.size();i++){
try {
// 设置收件人的邮箱
InternetAddress to = new InternetAddress(targets.get(i));
message.setRecipient(Message.RecipientType.TO, to);
// 最后当然就是发送邮件啦
Transport.send(message);
}catch (Exception e)
{
continue;
}
}
}
}
4.可以看到使用到了MailContentTypeEnum以及PropertiesUtil工具类。
MailContentTypeEnum
这是一个自定义的枚举类型,枚举类型包含了邮件内容的类型,目前我仅仅添加了两种,一种是html另外一种则是text形式
public enum MailContentTypeEnum {
HTML("text/html;charset=UTF-8"), //html格式
TEXT("text")
;
private String value;
MailContentTypeEnum(String value) {
this.value = value;
}
public String getValue() {
return value;
}
}
PropertiesUtil
PropertiesUtil是用于读取*.properties配置文件的工具类,使用JavaMail需要配置SMTP以及用户名、密码等也就是MailEntity内的字段,那么我们在/resource目录下创建一个名字叫mail.properties的配置文件,里面存放我们定义的邮件发送参数配置,这样方便修改
import java.util.Enumeration;
import java.util.Locale;
import java.util.ResourceBundle;
public class PropertiesUtil {
private final ResourceBundle resource;
private final String fileName;
/**
* 构造函数实例化部分对象,获取文件资源对象
*
* @param fileName
*/
public PropertiesUtil(String fileName)
{
this.fileName = fileName;
Locale locale = new Locale("zh", "CN");
this.resource = ResourceBundle.getBundle(this.fileName, locale);
}
/**
* 根据传入的key获取对象的值 2016年12月17日 上午10:19:55 getValue
*
* @param key properties文件对应的key
* @return String 解析后的对应key的值
*/
public String getValue(String key)
{
String message = this.resource.getString(key);
return message;
}
/**
* 获取properties文件内的所有key值<br>
* 2016年12月17日 上午10:21:20 getKeys
*
* @return
*/
public Enumeration<String> getKeys(){
return resource.getKeys();
}
}
mail.properties
这里可能会有人疑问我这个地方的昵称是什么,这是为了解决之后发送出现中文乱码
#对应发送服务器的smtmp服务地址
mail.smtp.service=smtp.qq.com
#对应发送服务器的端口号
mail.smtp.prot=587
#发件人邮箱地址
mail.from.address=1226807499@qq.com
#smtmp授权密码
mail.from.smtp.pwd=cugvgatklzysggca
#发件人邮箱显示昵称
mail.from.nickname=\u5468\u56fd\u5e86
这下我们基本可以了,但是我们这里用的QQ邮箱所以需要配置一下,具体如下
1.点击设置,进入
2.第二步:点击“账户”后往下拉找到POP3/IMAP/SMTP…,
将这些开启,会让你发送短信,然后会有一个弹框出现,告诉你授权码,放入你的项目中就行了
发送邮件测试
这里需要注意的是,我们刚刚配置的邮箱是发送人的邮箱,这个地方填写的地址是接收人的地址
当我们测试的时候,就会发送一条信息到这个邮箱了,但是名称是乱码,这时候我们修改一下配置,
首先修改InteiiJ IDEA工具的properties文件的编码,点击File->Setting->Editor->File Encodings将下面的Default encoding设置为UTF-8。。。。
那么我们的mail.properties内使用ASCII编码进行配置昵称就可以了,具体中文如何转换ASCII,
请大家访问在线转换即可。修改完成后再次测试发送邮件,你就会发现乱码问题解决了。