Springboot 集成邮件服务 QQ邮箱

登录QQ邮箱打开设置,点击账号

找到服务

按照提示开通POP3/SMTP服务,根据提示完成

新建Springboot项目,这里有个链接供大家参考:https://blog.csdn.net/xwd718/article/details/80640357

接下来开始正式的编码啦,

1、在pom文件中添加依赖

      springboot支持邮件服务,只要加入相应的依赖即可,如下:

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

2、在 application.yml中添加参数

 #邮箱设置
  mail:
    host: smtp.qq.com
    username: XXX@XXXXX.com
    #邮箱授权码
    password: XXXXX
    default-encoding: UTF-8
    form: ${spring.mail.username}
    protocol: smtp
    port: 25

host:服务器

userName:你的邮箱地址

password:邮箱授权码是刚才开启POP3/SMTP服务时生成的链接字符

form:发送人

protocol:SMTP 可以理解为协议

port:端口号

3、编码

  1)controller: 我的项目是前后端分离的,有多个服务,我的参数基本上都封装了

@RestController
@RequestMapping("/a/email")
public class MailController {
    @Autowired
    private IMailServic mailServic;

    @ApiOperation("发送简单邮件")
    @PostMapping("/sendSimpleEmail/u")
    public Result sendSimpleEmail(@RequestBody MailDto dto) {
        ValidatorUtils.validateEntity(dto);
        return mailServic.sendSimpleEmail(dto);
    }

    @ApiOperation("发送复杂邮件,附件是file")
    @PostMapping("/complexEmailByFiles/u")
    public Result complexEmailByFiles(MailDto dto, MultipartFile[] files) {
        ValidatorUtils.validateEntity(dto);
        return mailServic.sendComplexEmail(dto, files);
    }

    @ApiOperation("发送复杂邮件,附件是filepath")
    @PostMapping("/complexEmailByFilePath/u")
    public Result complexEmailByFilePath(@RequestBody MailDto dto) {
        ValidatorUtils.validateEntity(dto);
        return mailServic.sendComplexEmail(dto);
    }

    @ApiOperation("发送HTML邮件")
    @PostMapping("/sendHtmlEmail/u")
    public Result sendHtmlEmail(@RequestBody MailDto dto) {
        ValidatorUtils.validateEntity(dto);
        return mailServic.sendComplexEmail(dto, null);
    }

    @ApiOperation("查询邮件发送记录")
    @PostMapping("/getList/u")
    public Result getList(@RequestBody MailSearchDto dto) {
        return mailServic.searchList(dto);
    }
}

dto封装:

    @ApiModelProperty(value = "发件人id", required = true)
    @NotEmpty(message = "发件人id不能为空")
    private String send;
    @ApiModelProperty(value = "收件人id,多个用逗号分隔", required = true)
    @NotEmpty(message = "收件人id不能为空")
    private String receiver;

    @ApiModelProperty(value = "收件人邮箱,多个用逗号分隔", required = true)
    @NotEmpty(message = "收件人邮箱不能为空")
    private String receiverEmail;

    @ApiModelProperty(value = "抄送人id,多个用逗号分隔", required = true)
    private String ccid;

    @ApiModelProperty(value = "抄送人邮箱,多个用逗号分隔", required = true)
    private String ccEmail;

    @ApiModelProperty(value = "邮件主题")
    private String subject;

    @ApiModelProperty(value = "邮件内容")
    private String content;

2)service:我的代码牵扯业务太多,复制主要的部分


    @Autowired
    private JavaMailSender javaMailSender;

    @Value("${spring.mail.form}")
    private String from;

    public void sendSimpleMail(MailDto dto) {
        String[] to = validEmail(dto.getReceiverEmail());
        if (to != null && to.length > 0) {
            try {
                SimpleMailMessage message = new SimpleMailMessage();
                message.setTo(to);
                if (StringUtils.isNotEmpty(dto.getCcEmail())) {
                    message.setCc(validEmail(dto.getCcEmail()));
                }
                message.setSubject(dto.getSubject());
                message.setText(dto.getContent());
                message.setFrom(from);
                javaMailSender.send(message);
            } catch (Exception e) {
                log.error(e.getMessage());
                invalidAddress(dto, e);
                sendSimpleMail(dto);
                //throw new EcmException(MailEnum.ERROR.getMsg() + ":" + e.getMessage());
            }

        }
    }


    public void sendHtmlMail(MailDto dto) {
        String[] to = validEmail(dto.getReceiverEmail());
        if (to != null && to.length > 0) {
            try {
                MimeMessage message = javaMailSender.createMimeMessage();
                MimeMessageHelper helper = new MimeMessageHelper(message, true);
                //true代表支持多组件,如附件,图片等
                helper.setFrom(from);
                helper.setTo(to);
                if (StringUtils.isNotEmpty(dto.getCcEmail())) {
                    helper.setCc(validEmail(dto.getCcEmail()));
                }
                helper.setSubject(dto.getSubject());
                helper.setText(dto.getContent(), true);
                javaMailSender.send(message);
            } catch (Exception e) {
                log.error(e.getMessage());
                throw new EcmException(MailEnum.ERROR.getMsg());
            }
        }
    }


    public void sendAttachmentMail(MailDto dto, MultipartFile[] files) {
        String[] to = validEmail(dto.getReceiverEmail());
        if (to != null && to.length > 0) {
            try {
                MimeMessage message = javaMailSender.createMimeMessage();
                MimeMessageHelper helper;
                helper = new MimeMessageHelper(message, true);
                //true代表支持多组件,如附件,图片等
                helper.setFrom(from);
                helper.setTo(to);
                String[] cc = validEmail(dto.getCcEmail());
                if (cc != null && cc.length > 0) {
                    helper.setCc(validEmail(dto.getCcEmail()));
                }
                helper.setSubject(dto.getSubject());
                helper.setText(dto.getContent(), true);
                if (files != null) {
                    for (int i = 0; i < files.length; i++) {
                        helper.addAttachment(files[i].getOriginalFilename(), files[i]);
                    }
                }
                javaMailSender.send(message);
            } catch (Exception e) {
                log.error(e.getMessage());
                invalidAddress(dto, e);
                sendAttachmentMail(dto, files);
            }
        }
    }


    private String[] validEmail(String emails) {
        if (StringUtils.isNotBlank(emails)) {
            return Arrays.asList(emails.split(","))
                    .stream()
                    .filter(itme -> isEmail(itme))
                    .distinct()
                    .toArray(String[]::new);
        }
        return null;
    }

    private Boolean isEmail(String email) {
        String regEx1 = "^([a-z0-9A-Z]+[-|\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}$";
        return Pattern.compile(regEx1).matcher(email.trim()).matches();
    }


    private void invalidAddress(MailDto dto, Throwable e) {
        String s = getInvalidAddresses(e);
        if (StringUtils.isNotBlank(s)) {
            List<String> list = Arrays.asList(dto.getReceiverEmail().split(","));
            StringBuffer sb = new StringBuffer();
            list.stream().forEach(s1 -> {
                if (!s.contains(s1)) {
                    sb.append(s1 + ",");
                }
            });
            dto.setReceiverEmail(sb.toString());
        } else {
            throw new EcmException(MailEnum.ERROR.getMsg() + ":" + e.getMessage());
        }
    }

    private static String getInvalidAddresses(Throwable e) {
        if (e == null) {
            return null;
        }
        if (e instanceof MailSendException) {
            for (Exception exception : ((MailSendException) e).getMessageExceptions()) {
                if (exception instanceof SendFailedException) {
                    return getStringAddress(((SendFailedException) exception).getInvalidAddresses());
                }
            }
        }
        if (e instanceof SendFailedException) {
            return getStringAddress(((SendFailedException) e).getInvalidAddresses());
        }
        return null;
    }

    private static String getStringAddress(Address[] address) {
        List<String> invalid = new ArrayList<>();
        for (Address a : address) {
            String aa = ((InternetAddress) a).getAddress();
            if (!StringUtils.isEmpty(aa)) {
                invalid.add(aa);
            }
        }
        return invalid.stream().distinct().collect(Collectors.joining(","));
    }

保存测试,因为我用的是swagger 直接启动项目进行测试就可以了

 企业邮箱做邮箱服务器和这个差不太多,欢迎交流

交流邮箱 664616192@qq.com

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用Spring Boot集成JavaMail来发送电子邮件,包括QQ邮箱。首先,你需要在Spring Boot项目的pom.xml文件中添加以下依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency> ``` 然后,在你的application.properties(或application.yml)文件中配置QQ邮箱的SMTP服务器信息: ```properties spring.mail.host=smtp.qq.com spring.mail.port=587 spring.mail.username=your-email@qq.com spring.mail.password=your-email-password spring.mail.properties.mail.smtp.auth=true spring.mail.properties.mail.smtp.starttls.enable=true ``` 请确保将 "your-email@qq.com"和"your-email-password" 替换为你自己的QQ邮箱地址和密码。 接下来,你可以创建一个包含邮件发送逻辑的Service类。下面是一个简单的示例: ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.mail.SimpleMailMessage; import org.springframework.mail.javamail.JavaMailSender; import org.springframework.stereotype.Service; @Service public class EmailService { private JavaMailSender javaMailSender; @Autowired public EmailService(JavaMailSender javaMailSender) { this.javaMailSender = javaMailSender; } public void sendEmail(String to, String subject, String text) { SimpleMailMessage message = new SimpleMailMessage(); message.setTo(to); message.setSubject(subject); message.setText(text); javaMailSender.send(message); } } ``` 在你的Controller或其他地方使用这个Service类来发送邮件。例如: ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class EmailController { private EmailService emailService; @Autowired public EmailController(EmailService emailService) { this.emailService = emailService; } @GetMapping("/sendEmail") public String sendEmail() { String to = "recipient-email@example.com"; String subject = "Test Email"; String text = "This is a test email from Spring Boot."; emailService.sendEmail(to, subject, text); return "Email sent successfully!"; } } ``` 记得将 "recipient-email@example.com" 替换为你要发送邮件的收件人地址。 这样,当你访问 "/sendEmail" 路径时,就会触发邮件发送。确保你的应用程序能够连接到互联网以及QQ邮箱的SMTP服务器。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值