美文网首页
springBoot整合发送邮件功能

springBoot整合发送邮件功能

作者: 贪挽懒月 | 来源:发表于2020-05-14 10:31 被阅读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,就可以愉快地发邮件了。

    相关文章

      网友评论

          本文标题:springBoot整合发送邮件功能

          本文链接:https://www.haomeiwen.com/subject/lsvznhtx.html