最近再给公司写一个发送邮件的系统,收到同事反馈说收到的默认样式太丑了,于是我钻研了一下,设计了一下自己的邮箱前端样式,于是特此写下这篇文章
一.搭建环境
相信大家也在其余的博客中学习到了怎么使用qq邮箱来发送邮件,但是很有可能大家写的并不是很规范,没有考虑到复用性等等,那么我在这里提供一下自己的一个写法。
构建实体类
package com.znb.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private int id;
private String name;
private String email;
private String address;
}
书写配置环境
TestSent:
Icee:857787854@qq.com
Cy:1240152953@qq.com
emailinformation:
#发件人的 邮箱 和 密码(替换为自己的邮箱和密码)
serviceSendEmailAccount: xxxxx
serviceSendEmailPassword: xxxxxxx
# 发件人邮箱的 SMTP 服务器地址, 必须准确, 不同邮件服务器地址不同, 一般格式为: smtp.xxx.com 网易163邮箱的 SMTP 服务器地址为: smtp.163.com
# myEmailSMTPHost: smtp.qiye.163.com
myEmailSMTPHost: smtp.qiye.aliyun.com
#唯一标识 用来判断程序走哪个环境 dev test pro
devTestProSystem: pro
#项目发布地址,邮件跳转使用
ipAddress: www.baidu.com
创建一个类来接收配置文件中的数据
这里要注意一下,此处和上述配置文件的数据一一对应,这样的好处是当我们需要改变什么的时候,直接在配置文件修改就可以了。
package com.znb.common;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Component
@ConfigurationProperties(prefix = "emailinformation")
public class EmailInformationProperties {
//
private String MyEmailSMTPHost;
//
private String serviceSendEmailAccount;
//
private String serviceSendEmailPassword;
//
private String devTestProSystem;
private String IpAddress;
}
创建工具类
这里有三个关键的函数,一个是发送邮件,一个是创建邮件,一个是生成发送邮件的前端样式,样式我就随便写了一下,不要嫌弃
package com.znb.utils;
import com.znb.common.EmailInformationProperties;
import com.znb.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import javax.mail.*;
import javax.mail.internet.*;
import java.util.Date;
import java.util.Properties;
public class EmailUtils {
public static void SendEmilToUser(EmailInformationProperties emailInformationProperties,String addr,String title,String count) throws Exception {
// 1. 创建参数配置, 用于连接邮件服务器的参数配置
Properties props = new Properties(); // 参数配置
props.setProperty("mail.transport.protocol", "smtp"); // 使用的协议(JavaMail规范要求)
props.setProperty("mail.host", emailInformationProperties.getMyEmailSMTPHost()); // 发件人的邮箱的 SMTP 服务器地址
props.setProperty("mail.smtp.auth", "true"); // 请求认证,参数名称与具体实现有关
// 2. 根据配置创建会话对象, 用于和邮件服务器交互
javax.mail.Session session = javax.mail.Session.getDefaultInstance(props);
session.setDebug(false); // 设置为debug模式, 可以查看详细的发送 log
createEmail(emailInformationProperties,session, addr,title,count);
}
private static void createEmail(EmailInformationProperties emailInformationProperties,javax.mail.Session session,String addr,String title,String count) throws Exception {
MimeMessage message = createMimeMessage(session, emailInformationProperties.getServiceSendEmailAccount(), addr,title,count);
// 4. 根据 Session 获取邮件传输对象
Transport transport = session.getTransport();
// 5. 使用 邮箱账号 和 密码 连接邮件服务器
// 这里认证的邮箱必须与 message 中的发件人邮箱一致,否则报错
transport.connect(emailInformationProperties.getServiceSendEmailAccount(), emailInformationProperties.getServiceSendEmailPassword());
// 6. 发送邮件, 发到所有的收件地址, message.getAllRecipients() 获取到的是在创建邮件对象时添加的所有收件人, 抄送人, 密送人
transport.sendMessage(message, message.getAllRecipients());
// 7. 关闭连接
transport.close();
}
public static MimeMessage createMimeMessage(javax.mail.Session session, String sendMail, String addr, String title, String count) throws Exception {
// 1. 创建一封邮件
MimeMessage message = new MimeMessage(session);
// 2. From: 发件人
message.setFrom(new InternetAddress(sendMail, "华为商店", "UTF-8"));
// 3. To: 收件人(可以增加多个收件人、抄送、密送)
message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(addr, "", "UTF-8"));
// 4. Subject: 邮件主题
message.setSubject(title, "UTF-8");
// 5. Content: 邮件正文(可以使用html标签)
message.setContent(count, "text/html;charset=UTF-8");
// 6. 设置发件时间
message.setSentDate(new Date());
// 7. 保存设置
message.saveChanges();
return message;
}
public static String buildCopyCount(User userDO, String ipAddress) {
String count="尊敬的"+userDO.getName()+":";
count +="<br/>";
count +=" 您好。";
count +="<br/>";
count +=" 恭喜您抽中华为Mate40pro一部<a href='"+ipAddress+"'>点击前往查看</a>";
count +="<br/>";
count +="<table border=\"1\" cellspacing=\"0\" width=\"100%\" style=\"text-align: center\">" +
"<tr height=\"30px\" bgcolor=\"#00B83F\">" +
"<td colspan=\"5\" style=\"color: white\">信息</td>" +
"</tr>" +
"<tr bgcolor=\"#1186bb\" style=\"color: white\">" +
"<td>您的住址:</td>" +
"</tr>" +
"<tr>" +
"<td>"+userDO.getAddress()+"</td>" +
"</tr>" +
"</table>";
return count;
}
}
发送请求
在这里就不在数据库中添加用户信息了,就随便模拟了一个,值得一提的是,当配置环境是test的时候,我们可以不调用发邮箱的函数,或者把要发送的邮箱换成测试邮箱,这样就不会给客户造成困扰了
package com.znb.controller;
import com.znb.common.EmailInformationProperties;
import com.znb.pojo.User;
import com.znb.utils.EmailUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@RestController
public class EmailController {
@Autowired
private EmailInformationProperties emailInformationProperties;
public static List<User> getUser(){
User user1=new User(1,"萧炎","857787854@qq.com","斗气大陆");
User user2=new User(2,"唐三","243916422@qq.com","斗罗大陆");
User user3=new User(3,"图图","123456789@qq.com","翻斗街道");
List<User>userList=new ArrayList<>();
// userList.add(user2);
userList.add(user1);
// userList.add(user3);
return userList;
}
@RequestMapping("/senduser")
public String Send(){
List<User>list=EmailController.getUser();
list.forEach((user)->{
String count = EmailUtils.buildCopyCount(user, emailInformationProperties.getIpAddress());
try {
if (!emailInformationProperties.getDevTestProSystem().equals("test")){
EmailUtils.SendEmilToUser(emailInformationProperties,user.getEmail(),"您中奖啦",count);
}else {
System.out.println("成功");
}
} catch (Exception e) {
e.printStackTrace();
}
});
return "发送成功";
}
}
这个…样式是有点丑,我随便写的,大家可以自己写的好看一点