发送邮件前的准备
包括邮箱授权码、邮件服务器服务器地址、邮件服务器端口号
一、引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</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-validation</artifactId>
</dependency>
<!-- swagger -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.7.0</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.7.0</version>
</dependency>
二、邮件相关配置
# JavaMailSender ???????
server.port=8001
# 邮件服务器地址(以QQ为例)
spring.mail.host=smtp.qq.com
# 你的邮箱账号
spring.mail.username=zxxxxxxx
# 邮箱授权码
spring.mail.password=xxxxxxxxxx
# ssl ??
spring.mail.port=465
spring.mail.default-encoding=UTF-8
# SSL连接配置
spring.mail.properties.mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory
三、其他全局配置
3.1 配置swagger
package com.example.mailsend.config.swagger;
import com.google.common.base.Predicates;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.web.bind.annotation.RestController;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
import java.util.ArrayList;
/**
* @author zhmsky
* @date 2022/7/23 22:04
*/
@Configuration
@EnableSwagger2
public class SwaggerConfig {
/**
* 配置文档生成最佳实践
* @param apiInfo
* @return
*/
@Bean
public Docket createRestApi(ApiInfo apiInfo) {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo)
.groupName("SwaggerGroupOneAPI")
.select()
.apis(RequestHandlerSelectors.withClassAnnotation(RestController.class))
.paths(PathSelectors.any())
.build();
}
/**
* 配置基本信息
* @return
*/
@Bean
public ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("Swagger Test App Restful API")
.description("swagger test app restful api")
.termsOfServiceUrl("https://github.com/zhmsky")
.contact(new Contact("zhmsky","https://blog.csdn.net/weixin_42194695?type=blog","zhmsky@gmail.com"))
.version("1.0")
.build();
}
}
3.2 全局异常处理
使用Validator完成接口参数校验,做统一异常拦截处理;
springboot完成接口参数校验可见接口参数校验
本册测试邮件发送实体类:
package com.example.mailsend.entity;
import lombok.Data;
import javax.validation.constraints.Email;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.io.InputStream;
import java.io.Serializable;
/**
* @author zhmsky
* @date 2022/7/23 18:08
*/
@Data
public class EmailSendModel implements Serializable {
//序列化
private static final long serialVersionUID = -8840079326802564269L;
//发送者
@Email(message = "请填写正确的邮箱地址")
private String from;
//接受者
@Email(message = "请填写正确的邮箱地址")
private String[] to;
//抄送人
private String[] cc;
//邮件主题
@NotBlank(message = "邮件主题不能为空")
private String subject;
//邮件内容
@NotNull(message = "邮件内容不能为空")
private String text;
//附件路径
private String path;
private InputStream is;
}
接口参数校验,全局异常处理:
package com.example.mailsend.config.handler;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.validation.UnexpectedTypeException;
/**
* @author zhmsky
* @date 2022/7/23 22:25
*/
@ControllerAdvice
public class ExceptionHandler {
/**
* 特定异常处理
* @param e
* @return
*/
@ResponseBody
@org.springframework.web.bind.annotation.ExceptionHandler(UnexpectedTypeException.class)
public String error(UnexpectedTypeException e){
e.printStackTrace();
return "请检查邮件发送参数!相关参数不能为空";
}
}
四、service
package com.example.mailsend.service;
import com.example.mailsend.entity.EmailSendModel;
import java.io.File;
/**
* @author zhmsky
* @date 2022/7/23 17:58
*/
public interface MailSendService {
/**
* 发送简单文本邮件
* @param emailSendModel
*/
void sendTextMail(EmailSendModel emailSendModel);
/**
* 发送带附件的邮件
* @param emailSendModel
*/
void sendAttachmentsMail(EmailSendModel emailSendModel,String filePath);
}
4.1 impl
package com.example.mailsend.service.impl;
import com.example.mailsend.entity.EmailSendModel;
import com.example.mailsend.service.MailSendService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.AutoConfigureOrder;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import java.io.File;
import java.text.Normalizer;
/**
* @author zhmsky
* @date 2022/7/23 17:59
*/
@Service
public class MailSendServiceImpl implements MailSendService {
@Autowired
private JavaMailSender javaMailSender;
/**
* 发送简单文本邮件
* @param emailSendModel
*/
@Override
public void sendTextMail(EmailSendModel emailSendModel) {
SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
simpleMailMessage.setFrom(emailSendModel.getFrom());
simpleMailMessage.setTo(emailSendModel.getTo());
simpleMailMessage.setCc(emailSendModel.getCc());
simpleMailMessage.setSubject(emailSendModel.getSubject());
simpleMailMessage.setText(emailSendModel.getText());
//发送邮件
javaMailSender.send(simpleMailMessage);
}
/**
* 发送带附件的邮件
* @param emailSendModel
* @param filePath 附件路径
*/
@Override
public void sendAttachmentsMail(EmailSendModel emailSendModel, String filePath) {
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
try {
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
helper.setFrom(emailSendModel.getFrom());
helper.setTo(emailSendModel.getTo());
helper.setSubject(emailSendModel.getSubject());
helper.setText(emailSendModel.getText());
//添加附件
File file = new File(filePath);
helper.addAttachment(file.getName(),file);
//发带附件的邮件发出去
javaMailSender.send(mimeMessage);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
五、controller
package com.example.mailsend.controller;
import com.example.mailsend.entity.EmailSendModel;
import com.example.mailsend.service.MailSendService;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author zhmsky
* @date 2022/7/23 21:52
*/
@RestController
@RequestMapping("/mailSend")
public class MailSendController {
@Autowired
private MailSendService mailSendService;
@PostMapping("/sendMail")
@ApiOperation("简单文本邮件发送")
public String sendMail(@Validated EmailSendModel emailSendModel){
mailSendService.sendTextMail(emailSendModel);
return "success";
}
/*
当主题为空是,异常:UnexpectedTypeException
当text为空时,异常:UnexpectedTypeException
*/
}