SpringBoot集成邮件发送——springboot原生邮件类库

使用SpringBoot原生邮件类库,进行SpringBoot集成邮件发送。

1.新建项目

新建SpringBoot项目
添加maven依赖

 <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-mail</artifactId>
        </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>
 </dependencies>

2.新建配置文件

新建application.yml

spring:
  #配置springboot集成邮件服务
  mail:
    host: smtp.qq.com
    username:     #发送方邮箱账号
    password:     #发送方邮箱授权码
    port: 587     #端口号 QQ邮箱是587
    #配置模板引擎
  thymeleaf:
      prefix: classpath:/templates/
      suffix: .html
      mode: HTML
      encoding: UTF-8
      servlet:
        content-type: text/html
      cache: false

3. 新建邮件实体类——MailBean

package com.example.email.bean;

/**
 * @author: 
 * Date: 2021/1/5 20:58
 * @version: 1.0
 * description: 邮件实体类
 */
public class MailBean {

    private static final long serialVersionUID = -2116367492649751914L;
    /**
     * 邮件接收人
     */
    private String recipient;

    /**
     * 邮件主题
     */
    private String subject;

    /**
     * 邮件内容
     */
    private String content;

    public static long getSerialVersionUID() {
        return serialVersionUID;
    }

    public String getRecipient() {
        return recipient;
    }

    public void setRecipient(String recipient) {
        this.recipient = recipient;
    }

    public String getSubject() {
        return subject;
    }

    public void setSubject(String subject) {
        this.subject = subject;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    @Override
    public String toString() {
        return "MailBean{" +
                "recipient='" + recipient + '\'' +
                ", subject='" + subject + '\'' +
                ", content='" + content + '\'' +
                '}';
    }

}

4.新建邮件工具类——EmailUtil

package com.example.email.utils;

import com.example.email.bean.MailBean;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.FileSystemResource;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Component;

import javax.mail.internet.MimeMessage;
import java.io.File;


/**
 * @author: 
 * Date: 2021/1/5 20:52
 * @version:
 * description: 邮件工具类
 */
@Component
public class EmailUtil {

    /**
     * 邮件发送者
     */
    @Value("${spring.mail.username}")
    private String MAIL_SENDER;

    @Autowired
    private JavaMailSender javaMailSender;

    private Logger logger = LoggerFactory.getLogger(EmailUtil.class);

    /**
     * 发送文本邮件
     *
     * @param mailBean    邮件实体类
     * code = 0 发送成功
     * code = 1 发送失败
     */
    public int sendSimpleMail(MailBean mailBean) {
        try {
            SimpleMailMessage mailMessage = new SimpleMailMessage();
            mailMessage.setFrom(MAIL_SENDER);
            mailMessage.setTo(mailBean.getRecipient());
            mailMessage.setSubject(mailBean.getSubject());
            mailMessage.setText(mailBean.getContent());
            //mailMessage.copyTo(copyTo);
            javaMailSender.send(mailMessage);
            return 0;
        } catch (Exception e) {
            logger.error("邮件发送失败", e.getMessage());
            return 1;
        }
    }

    /**
     * 发送HTML邮件
     *
     * @param mailBean   邮件实体类
     */
    public void sendHTMLMail(MailBean mailBean) {
        MimeMessage mimeMailMessage = null;
        try {
            mimeMailMessage = javaMailSender.createMimeMessage();
            //true 表示需要创建一个multipart message
            MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMailMessage, true);
            mimeMessageHelper.setFrom(MAIL_SENDER);
            mimeMessageHelper.setTo(mailBean.getRecipient());
            mimeMessageHelper.setSubject(mailBean.getSubject());
            //邮件抄送
            //mimeMessageHelper.addCc("抄送人");
            mimeMessageHelper.setText(mailBean.getContent(), true);
            javaMailSender.send(mimeMailMessage);
            logger.info("邮件发送成功");
        } catch (Exception e) {
            logger.error("邮件发送失败", e.getMessage());
        }
    }

    /**
     * 发送附件邮件
     *
     * @param mailBean    邮件实体类
     */
    public void sendAttachmentMail(MailBean mailBean) {
        MimeMessage mimeMailMessage = null;
        try {
            mimeMailMessage = javaMailSender.createMimeMessage();
            //true 表示需要创建一个multipart message
            MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMailMessage, true);
            mimeMessageHelper.setFrom(MAIL_SENDER);
            mimeMessageHelper.setTo(mailBean.getRecipient());
            mimeMessageHelper.setSubject(mailBean.getSubject());
            mimeMessageHelper.setText(mailBean.getContent());
            //文件路径 目前写死在代码中,之后可以当参数传过来,或者在MailBean中添加属性absolutePath
            String absolutePath = "E:\\picture\\123.png";
            FileSystemResource file = new FileSystemResource(new File(absolutePath));
            //FileSystemResource file = new FileSystemResource(new File("src/main/resources/static/image/email.png"));
            String fileName = absolutePath.substring(absolutePath.lastIndexOf(File.separator));
            //添加附件,第一个参数表示添加到 Email 中附件的名称,第二个参数是图片资源
            mimeMessageHelper.addAttachment(fileName, file);
            //多个附件 mimeMessageHelper.addAttachment(fileName1, file1);
            javaMailSender.send(mimeMailMessage);
        } catch (Exception e) {
            logger.error("邮件发送失败", e.getMessage());
        }
    }
}

根据自己的需求,调用工具类方法即可。
参考链接:https://blog.csdn.net/AttleeTao/article/details/107999970

因为邮件发送的时候会占用一个进程,如果发送邮件过程中卡顿,会造成整个系统的卡顿,会影响其他功能模块的使用。因此邮件发送一般会使用异步发送。

5.在SpringBoot项目启动类新增注解

在启动类增加两个注解:
@EnableAsync——开启异步注解功能
@EnableScheduling ——开启基于注解的定时任务

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling;

/**
 * @author 
 */
@SpringBootApplication
@EnableAsync//开启异步注解功能
@EnableScheduling //开启基于注解的定时任务
public class EmailApplication {

    public static void main(String[] args) {
        SpringApplication.run(EmailApplication.class, args);
    }

}

6.新建异步任务类——AsyncService

import com.example.email.bean.MailBean;
import com.example.email.utils.EmailUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;

/**
 * @author:  
 * @version: 1.0
 * date: 2021/4/7 18:18
 * description:
 */

@Service
public class AsyncService {

    @Autowired
    private EmailUtil emailUtil;

    //告诉Spring这是一个异步方法
    @Async
    public int hello() {
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("邮件进行中....");
        MailBean mailBean = new MailBean();
        mailBean.setContent("测试邮件");
        mailBean.setSubject("测试主题");
        mailBean.setRecipient("xxx");//接收人邮箱账号
        int i = emailUtil.sendSimpleMail(mailBean);
        if (i == 0) {
            System.out.println("邮件发送成功");
            return 0;
        }
        return 1;
    }
}

启动项目,后续可根据自己需求,在发送邮件的类上增加异步注解,将其修改为异步任务。

7.使用定时任务

新建定时任务类——ScheduledService

package com.example.email.service;

import com.example.email.bean.MailBean;
import com.example.email.utils.EmailUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;

/**
 * @author:  
 * @version: 1.0
 * date: 2021/4/7 18:23
 * description:
 */

@Service
public class ScheduledService {

    @Autowired
    private EmailUtil emailUtil;

    @Scheduled(cron = "0 * * * * 0-7")
    public void hello() {
        System.out.println("hello.....");
    }

    @Scheduled(cron = "0 * * * * 0-7")
    public void hello1() {
        System.out.println("邮件进行中....");
        MailBean mailBean = new MailBean();
        mailBean.setContent("测试邮件");
        mailBean.setSubject("测试主题");
        mailBean.setRecipient("zhouzixin2020@126.com");
        int i = emailUtil.sendSimpleMail(mailBean);
        if (i == 0) {
            System.out.println("邮件发送成功");
        }
    }
}

corn使用:https://cron.qqe2.com/
狂神说链接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: 在Spring Boot集成多线程可以通过使用Spring框架提供的@Async注解来实现。使用Spring来实现多线程相比使用JDK原生的并发API更简单,因为Spring框架已经集成了多线程的支持,只需要在需要异步执行的方法上添加@Async注解即可。同时,通过在项目启动类中配置线程池的基本配置项,可以更好地控制线程的数量和执行规则。\[1\]\[2\]使用异步的方式可以提高系统的并发性能,当处理一些耗时的任务时,可以让系统继续执行其他代码,减少等待时间。\[3\]线程池ThreadPoolExecutor可以根据配置的核心线程数、最大线程数和队列容量来管理线程的执行规则,例如当任务数量超过核心线程数时,会将任务放入队列中等待执行,当队列已满时,会创建新的线程来执行任务,如果线程池中的线程数量超过最大线程数,会根据配置的拒绝策略来处理新的任务。\[4\] #### 引用[.reference_title] - *1* *3* [SpringBoot使用多线程](https://blog.csdn.net/csdn_life18/article/details/123082702)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [springboot集成多线程](https://blog.csdn.net/qq_19524879/article/details/97367021)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值