springBoot整合发送邮件功能

2020-05-14  本文已影响0人  贪挽懒月

本文将介绍spring官方提供的集成了邮件服务的JavaMailSenderImpl,开箱即用,十分方便。

一、开启邮件服务

开启POP3/SMTP/IMAP服务。以QQ邮箱为例,登录QQ邮箱,然后设置 ---> 账户:

开启邮件服务

开启后点击“生成授权码”,记住授权码。


欢迎大家关注我的公众号 javawebkf,目前正在慢慢地将简书文章搬到公众号,以后简书和公众号文章将同步更新,且简书上的付费文章在公众号上将免费。


二、springBoot整合邮件服务

1、pom.xml:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-mail</artifactId>
</dependency>

2、application.yml:

# 端口&根路径
server:
  port: 8888
  servlet:
    context-path: /

spring:
  application:
    # 服务名
    name: java-mail-sender
  mail:
    #邮箱的SMTP服务器地址
    host: smtp.qq.com
    #登录账号
    username: 你QQ邮箱登录账号
    #授权码或者密码
    password: 刚才获取的授权码
    properties:
      #真实邮箱
      from: 你的QQ邮箱
      
  #限制上传和请求文件的大小  
  servlet:
    multipart:
      max-file-size: 10MB
      max-request-size: 50MB

3、封装的返回对象JsonResult:

@Data
@NoArgsConstructor
@AllArgsConstructor
public class JsonResult {
    private Integer code;
    private String msg;
    private Object data;
    
    public JsonResult(Integer code, String msg) {
        super();
        this.code = code;
        this.msg = msg;
    }
}

4、返回信息&返回码枚举类:

@Getter
@AllArgsConstructor
public enum ResultEnum {
    SUCCESS(200,"成功"),
    SERVER_ERROR(500,"内部异常"),
    BAD_REQUEST(400,"参数错误"),
    ;

    private Integer code;
    private String msg;
}

5、用来接收邮件内容的表单对象:

@Data
public class MailForm {
    private String id;
    // 发件人
    private String from;
    // 收件人
    @NotBlank(message = "收件人不能为空!")
    @Pattern(regexp = "[\\w!#$%&'*+/=?^_`{|}~-]+(?:\\.[\\w!#$%&'*+/=?^_`{|}~-]+)*@(?:[\\w](?:[\\w-]*[\\w])?\\.)+[\\w](?:[\\w-]*[\\w])?", message = "邮箱格式不正确!")
    private String to;
    // 主题
    @NotEmpty(message = "邮件主题不能为空!")
    private String subject;
    // 内容
    @NotEmpty(message = "邮件内容不能为空!")
    private String text;
    // 抄送
    private String cc;
    // 暗抄送
    private String bcc;
    // 时间
    private Date date;
    // 附件
    @JsonIgnore
    private MultipartFile[] multipartFiles;
}

6、发送邮件的service:

@Service
@Slf4j
public class MailServiceImpl implements MailService {

    @Autowired
    private JavaMailSenderImpl mailSender;

    @Override
    public void sendMail(MailForm mailForm) {
        try {
            MimeMessageHelper messageHelper = new MimeMessageHelper(mailSender.createMimeMessage(), true);
            
            // 从配置文件读取发件人
            getMailSendFrom(mailForm);
            
            // 设置发件人
            messageHelper.setFrom(mailForm.getFrom());
            // 设置收件人
            messageHelper.setTo(mailForm.getTo().split(","));
            // 设置主题
            messageHelper.setSubject(mailForm.getSubject());
            // 设置内容
            messageHelper.setText(mailForm.getText());
            // 设置抄送
            if (!StringUtils.isEmpty(mailForm.getCc())) {
                messageHelper.setCc(mailForm.getCc().split(","));
            }
            // 设置暗抄送
            if (!StringUtils.isEmpty(mailForm.getBcc())) {
                messageHelper.setCc(mailForm.getBcc().split(","));
            }
            // 设置附件
            if (mailForm.getMultipartFiles() != null) {
                for (MultipartFile multipartFile : mailForm.getMultipartFiles()) {
                    messageHelper.addAttachment(multipartFile.getOriginalFilename(), multipartFile);
                }
            }
            // 设置日期
            if (mailForm.getDate() == null) {
                mailForm.setDate(new Date());
                messageHelper.setSentDate(mailForm.getDate());
            }
            // 发送邮件
            mailSender.send(messageHelper.getMimeMessage());
            
            log.info("发送邮件成功:{} ---> {}", mailForm.getFrom(), mailForm.getTo());
        } catch (Exception e) {
            log.error(e.getMessage());
            throw new RuntimeException(e);
        }
    }

    
    /**
     * 从配置文件中获取发件人
     * @return
     */
    private String getMailSendFrom(MailForm mailVo) {
        String from = mailSender.getJavaMailProperties().getProperty("from");
        mailVo.setFrom(from);
        return from;
    }
}

7、发送邮件的controller:

@RestController
@RequestMapping("/java-mail")
@Slf4j
public class MailController {
    
    @Autowired
    private MailService mailService;
    
    @PostMapping("/mail")
    public JsonResult sendMail(@Valid MailForm mailForm, BindingResult bindingResult) {
        try {
            if (bindingResult.hasErrors()){
                log.error("【sendMail】" + ResultEnum.BAD_REQUEST.getMsg() + ",msg={}",bindingResult.getFieldErrors());
                return new JsonResult(ResultEnum.BAD_REQUEST.getCode(),bindingResult.getFieldError().getDefaultMessage());
            } else {
                mailService.sendMail(mailForm);
                return new JsonResult(ResultEnum.SUCCESS.getCode(), ResultEnum.SUCCESS.getMsg());
            }
        } catch (Exception e) {
            log.error(e.getMessage());
            return new JsonResult(ResultEnum.SERVER_ERROR.getCode(), ResultEnum.SERVER_ERROR.getMsg());
        }
    }
}

三、测试

打开postman,设置相关参数,访问上面这个controller,就可以愉快地发邮件了。

上一篇下一篇

猜你喜欢

热点阅读