springboot发送邮件

文章目录


前言

在现代的Web应用程序中,邮件发送功能是非常常见且重要的一部分。Spring Boot框架提供了简单且强大的方式来实现邮件发送功能,本文将介绍如何在Spring Boot项目中集成邮件发送功能,并通过示例展示其基本用法。

本文发送到的邮件是Microsoft Outlook

pom.xml

xml 复制代码
        <dependency>
            <groupId>javax.mail</groupId>
            <artifactId>mail</artifactId>
            <version>1.5.0-b01</version>
        </dependency>

bootstrap.yml

yml 复制代码
spring:
  mail:
    default-encoding: utf-8
    # 主机地址
    host: xx.xx.xx.xx
    # 设置用户名
    username: xxx
    # 授权码
    password: xxx

    #端口
    port: 25
    #配置
    properties:
      mail:
        smtp:
          ssl:
            enable: true
          timeout: 25000
          auth: true
          starttls:
            enable: true
            required: true
    #发送方
    from: Qixiansheng@xxx.com
    #接收方
    to:
      - QiFei@xxx.com
    #邮件主题
    warehouse-subject: 每日统计
    protocol: smtp
    enableMailSend: true

配置相关类

java 复制代码
package com.ctf.ics.constant;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.stereotype.Component;

import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;

@Component
@Data
@ConfigurationProperties(prefix = "spring.mail")
public class MailConstant {
    private static final Charset DEFAULT_CHARSET = StandardCharsets.UTF_8;
    private String host;
    private Integer port;
    private String username;
    private String password;
    private String protocol = "smtp";
    private Charset defaultEncoding = DEFAULT_CHARSET;
    private Map<String, String> properties = new HashMap<>();
    private String from;
    private String[] to;
    private Boolean enableMailSend=Boolean.FALSE;


    @Bean(value = "mailSender")
    public JavaMailSenderImpl mailSender() {
        JavaMailSenderImpl sender = new JavaMailSenderImpl();
        sender.setHost(this.host);
        sender.setDefaultEncoding(DEFAULT_CHARSET.name());
        sender.setPassword(this.password);
        sender.setUsername(this.username);
        sender.setProtocol(this.protocol);
        sender.setPort(this.port);
        return sender;
    }
}
java 复制代码
package com.ctf.ics.util;

import cn.hutool.core.collection.CollUtil;
import com.alibaba.fastjson.JSON;
import com.ctf.ics.constant.MailConstant;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.retry.annotation.Retryable;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import java.io.File;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;

@Component(value = "mailUtils")
@Slf4j
public class MailUtils {
    @Resource
    private JavaMailSender mailSender;
    @Resource
    private MailConstant mailConstant;

    /*
    *发送邮件异常时则重试
    */
    @Retryable(value = {Exception.class},maxAttempts = 5)
    public void sendMail(String subject,Object obj){
        MimeMessage mimeMessage = mailSender.createMimeMessage();
        try {

            MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
            helper.setTo(mailConstant.getTo());
            helper.setFrom(mailConstant.getFrom());
            helper.setSubject(subject);
            helper.setText("<html>\n"+
                    "<body>\n"+
                    "保存失败时间:<b>" + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:dd:ss")) + "</b><br>"+
                    "保存失败消息数据:<p>" + JSON.toJSONString(obj) + "</p>"+
                    "</body>\n"+
                    "</html>",true);
            mailSender.send(mimeMessage);
            log.info("发送成功,邮件内容:{}",JSON.toJSONString(obj));
        } catch (MessagingException e) {
            log.info("发送失败,邮件内容:{}",JSON.toJSONString(obj));
        }
    }

    public void sendMail(String subject,String body,String to){
        MimeMessage mimeMessage = mailSender.createMimeMessage();
        try {
            MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
            helper.setTo(mailConstant.getTo());
            helper.setFrom(mailConstant.getFrom());
            helper.setSubject(subject);
            helper.setText(body,true);
            mailSender.send(mimeMessage);
            log.info("发送成功,邮件内容:{}",body);
        } catch (MessagingException e) {
            log.info("发送失败,邮件内容:{}",body);
        }

    }

    /**
     * 发送普通邮件信息
     *
     * @param subject 邮件主题
     * @param content 邮件内容(发送内容)
     */
    public void sendMail(String subject, String content) throws MessagingException {
        try {
            MimeMessage mimeMessage = mailSender.createMimeMessage();
            MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
            if (mailConstant.getTo().length == 0) {
                return;
            }
            for (String to : mailConstant.getTo()) {
                if (StringUtils.isNotEmpty(to)) {
                    //设置接收方
                    helper.addTo(to);
                }
            }
            helper.setFrom(mailConstant.getFrom());
            helper.setSubject(subject);
            helper.setText(content, true);
            log.info("邮件开始发送");
            // 发送邮件
            if (mailConstant.getEnableMailSend()) {
                mailSender.send(mimeMessage);
            }
            log.info("发送成功,邮件内容:{}", content);
        } catch (Exception e) {
            log.info("发送失败,邮件内容:{},异常信息:{}", content, e.getMessage());
            throw e;
        }
    }

    public void sendMail(String subject, String content,List<String> tos,List<String> ccs) throws MessagingException {
        try {
            MimeMessage mimeMessage = mailSender.createMimeMessage();
            MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
            if (CollUtil.isEmpty(tos)) {
                return;
            }
            for (String to : tos) {
                if (StringUtils.isNotEmpty(to)) {
                    helper.addTo(to);
                }
            }
            if(CollUtil.isNotEmpty(ccs)){
                for (String cc : ccs) {
                    if (StringUtils.isNotEmpty(cc)) {
                        helper.addCc(cc);
                    }
                }
            }
            helper.setFrom(mailConstant.getFrom());
            helper.setSubject(subject);
            helper.setText(content, true);
            log.info("邮件开始发送");
            // 发送邮件
            if (mailConstant.getEnableMailSend()) {
                mailSender.send(mimeMessage);
            }
            log.info("发送成功,邮件内容:{}", content);
        } catch (Exception e) {
            log.info("发送失败,邮件内容:{},异常信息:{}", content, e.getMessage());
            throw e;
        }
    }

    /**
     * 发送带附件的邮件信息
     *
     * @param subject 邮件主题
     * @param content 邮件内容(发送内容)
     * @param files   文件数组 // 可发送多个附件
     */
    public void sendMessageCarryFiles(String subject, String content, File[] files, List<String> tos,List<String> ccs) throws MessagingException {
        try {
            log.info("subject:\n{}, content:\n{}", subject, content);
            MimeMessage mimeMessage = mailSender.createMimeMessage();
            MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
            // 设置发送发
            helper.setFrom(mailConstant.getFrom());
            if (CollUtil.isEmpty(tos)) {
                return;
            }
            for (String to : tos) {
                if (StringUtils.isNotEmpty(to)) {
                    helper.addTo(to);
                }
            }
            if(CollUtil.isNotEmpty(ccs)){
                for (String cc : ccs) {
                    if (StringUtils.isNotEmpty(cc)) {
                        helper.addCc(cc);
                    }
                }
            }
            // 设置邮件主题
            helper.setSubject(subject);
            // 设置邮件内容
            helper.setText(content, true);
            // 添加附件(多个)
            if (files != null && files.length > 0) {
                for (File file : files) {
                    helper.addAttachment(file.getName(), file);
                }
            }
            log.info("附件邮件开始发送");
            // 发送邮件
            if (mailConstant.getEnableMailSend()) {
                mailSender.send(mimeMessage);
            }
            log.info("附件邮件发送成功,邮件内容:{}", content);
        } catch (Exception e) {
            log.info("发送失败,邮件内容:{},异常信息:{}", content, e.getMessage());
            throw e;
        }

    }
}

测试

java 复制代码
    @Resource
    private MailUtils mailUtils;
    @GetMapping("/test")
    public void test() {
        String content = "<html>\n"+ "<body>\n"+ "<br>"+ "<p>每日统计</p>\n"+ "</body>\n"+ "</html>";
        try {
            mailUtils.sendMail("每日统计",content);
        } catch (MessagingException e) {
            //异常相关处理
        }
    }

相关推荐
Hello eveybody2 小时前
Java发明者介绍
java·开发语言
Micro麦可乐2 小时前
最新Spring Security实战教程(十五)快速集成 GitHub 与 Gitee 的社交登录
java·spring boot·spring·gitee·github·spring security·社交登陆
u0104058362 小时前
企业微信会话存档API对接中的敏感信息审计日志架构(Java版)
java·架构·企业微信
Voyager First2 小时前
ApereoCas学习系列一——从github克隆cas-server源码并启动
java
像少年啦飞驰点、2 小时前
Spring Boot 从入门到实践:快速构建一个 RESTful API 服务
java·spring boot·后端开发·快速入门·restful api·编程小白
编程彩机2 小时前
互联网大厂Java面试:从Spring Cloud到Kafka的技术场景深度解析
java·spring cloud·微服务·kafka·技术面试
波波0072 小时前
每日一题:.NET 中什么是 LOH(大对象堆)?为什么频繁使用大数组或大字符串可能导致性能问题?如何优化?
java·jvm·算法
小北方城市网2 小时前
JVM 调优实战指南:从 GC 频繁到性能稳定
jvm·数据库·spring boot·后端·mysql·mybatis
Gofarlic_OMS2 小时前
Fluent许可证使用合规性报告自动化生成系统
java·大数据·运维·人工智能·算法·matlab·自动化