Springboot 发送电子邮件

80 阅读2分钟

准备工作

下面以 QQ 邮箱为例,其他的邮箱的配置也大同小异。

登录 QQ 邮箱,点击设置->账户,开启IMAP/SMTP服务,并生成授权码

一、创建项目并添加依赖

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

二、编写邮件相关的配置文件

spring:
  mail:
    default-encoding: utf-8
    host: smtp.qq.com
    port: 465
    username: xxxxxx@qq.com
    #    这个是SMTP,而不是QQ密码
    password: xxxxxx
    protocol: smtps
    properties:
      mail:
        smtp:
          ssl:
            enable: true
          # 邮件接收时间的限制,单位毫秒
          timeout: 10000
          # 连接时间的限制,单位毫秒
          connectiontimeout: 10000
          # 邮件发送时间的限制,单位毫秒
          writetimeout: 10000

三、编写邮件服务类

package com.mjg.service.impl;

import com.mjg.common.CallBack;
import com.mjg.service.MailService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.mail.MailException;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import java.io.File;

/**
 * 邮件服务impl
 *
 * @author Administrator
 * @date 2021/03/26
 */
@Service
@Slf4j
public class MailServiceImpl implements MailService {
    @Resource
    private JavaMailSender javaMailSender;

    private static final String SENDER = "xxxxxxxxxx@qq.com";

    @Override
    public void sendMimeMessage(String to, String subject, String content, CallBack callBack) {
        MimeMessage message = javaMailSender.createMimeMessage();
        try {
            //true表示需要创建一个multipart message
            MimeMessageHelper helper = new MimeMessageHelper(message, true);
            helper.setFrom(SENDER);
            helper.setTo(to);
            helper.setSubject(subject);
            helper.setText(content, true);
            javaMailSender.send(message);
            callBack.onResponse("send email success");
        } catch (MessagingException e) {
            callBack.onResponse("send email error");
            e.printStackTrace();
        }
    }

    /**
     * 发送简单的邮件消息
     *
     * @param to      来
     * @param subject 主题
     * @param content 内容
     */
    @Override
    public void sendSimpleMailMessage(String to, String subject, String content, CallBack callBack) {
        SimpleMailMessage message = new SimpleMailMessage();
        message.setFrom(SENDER);
        message.setTo(to);
        message.setSubject(subject);
        message.setText(content);
        try {
            javaMailSender.send(message);
            callBack.onResponse("send email success");
        } catch (MailException e) {
            callBack.onResponse("send email error");
            e.printStackTrace();
        }

    }

    /**
     * 发送附件信息
     *
     * @param file     文件
     * @param callBack 回电话
     */
    @Override
    public void sendAttachmentMessage(String to, String subject, String content, File file, CallBack callBack) {
        MimeMessage mimeMessage = javaMailSender.createMimeMessage();
        try {
            MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage, true);
            messageHelper.setFrom(SENDER);
            messageHelper.setTo(to);
            messageHelper.setSubject(subject);
            messageHelper.setText(content, true);
            messageHelper.addAttachment(file.getName(), file);
            callBack.onResponse("send email success");
        } catch (MessagingException e) {
            callBack.onResponse("send email error");
            e.printStackTrace();
        }


    }
}

四、编写测试类

package com.mjg;

import com.mjg.service.MailService;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import javax.annotation.Resource;
import java.io.File;

@SpringBootTest
class SpringbootEmailApplicationTests {

    private static final String TO = "xxxxx@163.com";
    private static final String SUBJECT = "测试邮件";
    private static final String CONTENT = "test content ";
    @Resource
    MailService mailService;

    @Test
    void contextLoads() {
        mailService.sendSimpleMailMessage(TO, SUBJECT, CONTENT, data -> {
            System.out.println(data.toString());
        });
    }

    /**
     * 测试html邮件
     */
    @Test
    @DisplayName("测试html邮件")
    public void testHtmlMail() {
        String htmlStr = "<h1>Hello World mjg</h1>";
        mailService.sendMimeMessage(TO, SUBJECT, htmlStr, System.out::println);
    }

    /**
     * 测试发送附件信息
     */
    @Test
    public void testSendAttachmentMessage() {
        File file = new File("C:\\Users\\Administrator\\Pictures\\my.jpg");
        System.out.println(file.getName());
        mailService.sendAttachmentMessage(TO, SUBJECT, CONTENT, file, System.out::println);
    }
}