SpringBoot 发送邮件功能实现

185 阅读2分钟

1、准备工作

首先需要准备一个可以正常发送邮件的邮箱,以我自己用的网易邮箱为例,先要获取授权码,接下来是获取授权码的步骤:

image.png

image.png

接下来开启服务,会提示发送短信验证,验证通过后会得到一个授权码,这个是配置文件中需要配置的。

2、引入邮件发送依赖

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

3、配置文件

spring:
  mail:
    # 邮件服务地址
    host: smtp.163.com
    # 端口,可不写默认
    port: 465
    # 编码格式
    default-encoding: utf-8
    # 用户名
    username: xxx@163.com
    # 授权码,刚才准备工作获取的代码
    password: xxx
    # 其它参数
    properties:
      mail:
        smtp:
          # 如果是用 SSL 方式,需要配置如下属性,使用qq邮箱的话需要开启
          ssl:
            enable: true
            required: true
          # 邮件接收时间的限制,单位毫秒
          timeout: 10000
          # 连接时间的限制,单位毫秒
          connectiontimeout: 10000
          # 邮件发送时间的限制,单位毫秒
          writetimeout: 10000

4、邮件发送工具类

@Component
public class MailService {

    private static final Logger logger = LoggerFactory.getLogger(MailService.class);

    @Resource
    private JavaMailSender mailSender;

    @Value("${spring.mail.username}")
    private String sender;

    /**
     * 发送普通邮件
     * @param to        收件人
     * @param subject   主题
     * @param content   内容
     */
    public void sendSimpleMail(String to, String subject, String content) {

        SimpleMailMessage mailMessage = new SimpleMailMessage();
        mailMessage.setFrom(sender);
        mailMessage.setTo(to);
        mailMessage.setSubject(subject);
        mailMessage.setText(content);
        mailSender.send(mailMessage);

        logger.info("发送成功!");
    }

    /**
     * 发送 html 邮件
     * @param to        收件人
     * @param subject   主题
     * @param content   内容
     * @throws MessagingException
     */
    public void sendHtmlMail(String to,String subject,String content) throws MessagingException {
        MimeMessage mimeMessage = mailSender.createMimeMessage();
        //true表示需要创建一个multipart message
        MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage, true);
        messageHelper.setFrom(sender);
        messageHelper.setTo(to);
        messageHelper.setSubject(subject);
        messageHelper.setText(content,true);
        mailSender.send(mimeMessage);

        logger.info("发送成功!");
    }

    /**
     * 发送带附件的邮件
     * @param to        收件人
     * @param subject   主题
     * @param content   内容
     * @param filePath  附近路径
     * @throws MessagingException
     */
    public void sendAttachmentsMail(String to, String subject, String content, String filePath) throws MessagingException {
        MimeMessage mimeMessage = mailSender.createMimeMessage();
        //true表示需要创建一个multipart message
        MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage, true);
        messageHelper.setFrom(sender);
        messageHelper.setTo(to);
        messageHelper.setSubject(subject);
        messageHelper.setText(content,true);
        FileSystemResource resource = new FileSystemResource(new File(filePath));
        String filename = resource.getFilename();
        messageHelper.addAttachment(filename,resource);
        mailSender.send(mimeMessage);

        logger.info("发送成功!");
    }

    /**
     * 发送带静态文件的邮件
     * @param to        收件人
     * @param subject   主题
     * @param content   内容
     * @param picMap    需要替换的静态文件
     */
    public void sendPicMail(String to, String subject, String content, Map<String,String> picMap) throws MessagingException {
        MimeMessage mimeMessage = mailSender.createMimeMessage();
        //true表示需要创建一个multipart message
        MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage, true);
        messageHelper.setFrom(sender);
        messageHelper.setTo(to);
        messageHelper.setSubject(subject);
        messageHelper.setText(content,true);

        for (Map.Entry<String, String> entry : picMap.entrySet()) {
            FileSystemResource resource = new FileSystemResource(new File(entry.getValue()));
            messageHelper.addInline(entry.getKey(),resource);
        }
        mailSender.send(mimeMessage);

        logger.info("发送成功!");
    }
 }

5、编写测试类

@RunWith(SpringRunner.class)
@SpringBootTest
class DemoApplicationTests {

    @Resource
    private MailService mailService;

    private static final String to = "xxx@qq.com";

    private static final String subject = "测试发送邮件";

    private static final String content = "测试发送邮件";

    @Test
    void testSimple() {

        mailService.sendSimpleMail(to,subject,content);
    }

    @Test
    void testHtml() throws MessagingException {
        String htmlStr = "<h1>test</h1>";
        mailService.sendHtmlMail(to, subject, htmlStr);
    }

    @Test
    void testAttachMail() throws Exception {
        File file = ResourceUtils.getFile("classpath:1.txt");
        String filePath = file.getAbsolutePath();
        mailService.sendAttachmentsMail(to,subject,content,filePath);
    }

    @Test
    void testPicMail() throws Exception{
        String htmlStr = "<html><body>测试:图片1 <br> <img src='cid:pic1'/> <br>图片2 <br> <img src='cid:pic2'/></body></html>";
        HashMap<String, String> map = new HashMap<>();
        map.put("pic1",ResourceUtils.getFile("classpath:pic1.jpg").getAbsolutePath());
        map.put("pic2",ResourceUtils.getFile("classpath:pic2.jpg").getAbsolutePath());
        mailService.sendPicMail(to,subject,htmlStr,map);
    }