日常项目开发中需要做一个发送邮件的服务,供一些系统调用发送一些通知类的邮件。了解完需求之后,便着手使用springBoot框架构建整个项目,详细项目代码如下:
1)构建项目结构,如下图:
2)构建springboot项目,引入相关涉及到的jar包
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.5.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j</artifactId>
<version>1.3.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4.1</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.18</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
3)根据需求(发送邮件需要收件人地址,邮件主题,邮件正文,发件人地址,发件人密码五个参数)封装实体对象
@Data
public class MailBean implements Serializable {
/**
* 发送地址,可以是多个,逗号分隔
*/
private String [] toAddressList;
/**
* 发送邮箱用户
*/
private String userName;
/**
* 发送邮箱用户密码
*/
private String password;
/**
* 邮件主题
*/
private String subject;
/**
* 邮件内容
*/
private String content;
}
4)定义实现的接口方法
public interface MailService {
/**
* 发送普通格式邮件
* @param mailBean
*/
public boolean sendSimpleMail(MailBean mailBean);
/**
* 发送HTML格式邮件
* @param mailBean
*/
public boolean sendHtmlMail(MailBean mailBean);
}
5)然后就是接口的具体实现。具体实现代码如下,实现步骤注释都有详细说明
@Service
@Slf4j
public class MailServiceImpl implements MailService {
@Value("${spring.mail.host}")
private String host;
@Value("${spring.mail.port}")
private int port;
/**
* 校验用户名和密码
* @param mailBean
* @return
*/
private JavaMailSenderImpl checkUsernameAndPwd(MailBean mailBean){
JavaMailSenderImpl senderImpl = new JavaMailSenderImpl();
senderImpl.setHost(host);
senderImpl.setPort(port);
senderImpl.setUsername(mailBean.getUserName());
senderImpl.setPassword(mailBean.getPassword());
Properties prop = new Properties();
prop.put(" mail.smtp.auth ", " true ");
prop.put(" mail.smtp.timeout ", " 25000 ");
senderImpl.setJavaMailProperties(prop);
return senderImpl;
}
/**
* 发送简单的文本邮件
* @param mailBean
*/
@Override
public boolean sendSimpleMail(MailBean mailBean){
boolean flag=false;
log.info("发送邮件开始。相关参数:{}",mailBean.toString());
try{
/**
* 1)调用校验用户名和密码
*/
JavaMailSenderImpl senderImpl=checkUsernameAndPwd(mailBean);
/**
* 2)拼接发送邮件的参数
*/
SimpleMailMessage simpleMailMessage=new SimpleMailMessage();
//收件人
String[] toAddressList = mailBean.getToAddressList();
simpleMailMessage.setTo(toAddressList);
//邮件主题
simpleMailMessage.setSubject(mailBean.getSubject());
//邮件内容
simpleMailMessage.setText(mailBean.getContent());
//发件人
simpleMailMessage.setFrom(mailBean.getUserName());
//发送时间
simpleMailMessage.setSentDate(new Date());
/**
* 3)发送邮件
*/
senderImpl.send(simpleMailMessage);
flag=true;
log.info("发送邮件成功!");
}catch (Exception e){
log.error("发送邮件失败:{}",e.getMessage());
}
return flag;
}
/**
* 发送HTML格式的邮件
* @param mailBean
*/
@Override
public boolean sendHtmlMail(MailBean mailBean){
boolean flag=false;
log.info("发送邮件开始。相关参数:{}",mailBean.toString());
try{
/**
* 1)调用校验用户名和密码
*/
JavaMailSenderImpl senderImpl=checkUsernameAndPwd(mailBean);
/**
* 2)拼接发送邮件的参数
*/
MimeMessage mimeMessage=senderImpl.createMimeMessage();
MimeMessageHelper mimeMessageHelper=new MimeMessageHelper(mimeMessage,true,"GBK");
//收件人
String[] toAddressList = mailBean.getToAddressList();
mimeMessageHelper.setTo(toAddressList);
//邮件主题
mimeMessageHelper.setSubject(mailBean.getSubject());
//邮件内容
mimeMessageHelper.setText(mailBean.getContent(),true);
//发件人
mimeMessageHelper.setFrom(mailBean.getUserName());
//发送时间
mimeMessageHelper.setSentDate(new Date());
/**
* 3)发送邮件
*/
senderImpl.send(mimeMessage);
flag=true;
log.info("发送邮件成功!");
}catch (Exception e){
log.error("发送邮件失败:{}",e.getMessage());
}
return flag;
}
}
核心逻辑就是前端通过传参,获取到发件人的用户名和密码,校验用户名和密码件是否可以成功登陆邮件服务器;然后通过【SimpleMailMessage】或者【MimeMessageHelper】封装邮件的发送实体,最后调用发送邮件的方法即可
6)因为是作为一个供其他程序调用的服务,所以需要提供访问的路径,提供action
@Controller
@RequestMapping("/mail")
public class SendMailMainAction {
@Autowired
private MailServiceImpl mailServiceImpl;
/**
* 对前端发送邮件的参数做实体封装
* @param toAddressList
* @param userName
* @param password
* @param subject
* @param content
* @return
*/
private MailBean getMailBean(String [] toAddressList,String userName,String password,String subject,String content){
MailBean mailBean=new MailBean();
mailBean.setToAddressList(toAddressList);
mailBean.setUserName(userName);
mailBean.setPassword(password);
mailBean.setSubject(subject);
mailBean.setContent(content);
return mailBean;
}
/**
* 发送普通邮件
* @return
*/
@RequestMapping(value = "/sendTextMail",method = {RequestMethod.POST})
@ResponseBody
public CommonReturnType sendTextMail(@RequestParam(name="toAddressList")String [] toAddressList ,@RequestParam(name="userName")String userName,
@RequestParam(name="password")String password,@RequestParam(name="subject")String subject,
@RequestParam(name="content")String content) {
CommonReturnType commonReturnType=null;
if (toAddressList.length==0 || StringUtils.isEmpty(userName) ||StringUtils.isEmpty(password) || StringUtils.isEmpty(subject) || StringUtils.isEmpty(content)){
commonReturnType=CommonReturnType.create("调用参数不能为空(必传参数:收件人,发件人,密码,主题,正文五个参数)","false");
}else{
/**
* 1)根据传参获取封装的实体
*/
MailBean mailBean= getMailBean(toAddressList,userName,password,subject,content);
/**
* 2)调用底层发送邮件的方法
*/
boolean flag =mailServiceImpl.sendSimpleMail(mailBean);
if (flag){
commonReturnType=CommonReturnType.create("邮件发送成功!","success");
}else{
commonReturnType=CommonReturnType.create("邮件发送失败!","false");
}
}
return commonReturnType;
}
/**
* 发送HTML格式的邮件
* @return
*/
@RequestMapping(value = "/sendHtmlMail",method = {RequestMethod.POST})
@ResponseBody
public CommonReturnType sendHtmlMail(@RequestParam(name="toAddressList")String [] toAddressList ,@RequestParam(name="userName")String userName,
@RequestParam(name="password")String password,@RequestParam(name="subject")String subject,
@RequestParam(name="content")String content) {
CommonReturnType commonReturnType=null;
if (toAddressList.length==0 || StringUtils.isEmpty(userName) ||StringUtils.isEmpty(password) || StringUtils.isEmpty(subject) || StringUtils.isEmpty(content)){
commonReturnType=CommonReturnType.create("调用参数不能为空(必传参数:收件人,发件人,密码,主题,正文五个参数)","false");
}else{
/**
* 1)根据传参获取封装的实体
*/
MailBean mailBean= getMailBean(toAddressList,userName,password,subject,content);
/**
* 2)调用底层发送邮件的方法
*/
boolean flag =mailServiceImpl.sendHtmlMail(mailBean);
if (flag){
commonReturnType=CommonReturnType.create("邮件发送成功!","success");
}else{
commonReturnType=CommonReturnType.create("邮件发送失败!","false");
}
}
return commonReturnType;
}
}
7)程序基本完成,下面用postman测试一下
程序完成
完整项目代码详见:https://download.csdn.net/download/weixin_36898373/16267783