最近从零开始学习SpringBoot框架,试着借助SpringBoot实现几个简单功能,发送邮件是我参考gitHub上的示例后借助Spring Boot实现的第一个功能,在这里做下学习笔记。如果有错误的地方,欢迎在评论区指出。

SpringBoot版本:2.4.0

发送的邮件根据所发送内容可以简单分为以下四类:

  1. 发送简单文本邮件;
  2. 发送html邮件;
  3. 发送带附件的邮件;
  4. 发送正文中有静态资源(图片)的邮件;

SpringBoot org.springframework.mail 包下提供了SimpleMailMessage、MimeMessageHelper和JavaMailSender API,借助这些API我们可以轻松实现邮件发送功能。

SimpleMailMessage:用来发送简单的文本邮件;

MimeMessage:用来发送html邮件、带附件的邮件、有静态资源(图片)的邮件。

发送简单文本邮件代码示例:



mail内容设定  
        SimpleMailMessage message = new SimpleMailMessage();
	// 设置邮件发送人
        message.setFrom(username);
        // 设置邮件接收人
        message.setTo(to);
        // 设置抄送(可选),有普通抄送(setCc)和 盲抄送(setBcc)两种类型,普通抄送邮件接收者可以看到邮件都抄送给了哪些人,而盲抄送邮件接收者则看不到
        if(!StringUtil.isEmpty(cc)) {
        	message.setBcc(cc);
        }
        // 设置邮件主题
        message.setSubject(subject);
        // 设置邮件正文内容
        message.setText(content);
        try {
            // 发送邮件
            mailSender.send(message);
            logger.info("简单邮件已经发送。");
        } catch (MailException e) {
            logger.error("发送简单邮件时发生异常!", e);
        }



发送html邮件代码示例:



try {
	              mail内容设定  
	             MimeMessage message = mailSender.createMimeMessage();
	            //true表示需要创建一个multipart message
	            MimeMessageHelper helper = new MimeMessageHelper(message, true);
	            // 设置邮件发送人
	            helper.setFrom(username);
	            // 设置邮件接收人
	            helper.setTo(to);
	            // 设置抄送
	            if(!StringUtil.isEmpty(cc)) {
	            	helper.setBcc(cc);
	            }
	            // 设置邮件主题
	            helper.setSubject(subject);
	            // 设置邮件正文内容 第二个参数为true表示将发送内容设置为"text/html"
	            helper.setText(content, true);
	            // 发送邮件
	            mailSender.send(message);
	            logger.info("html邮件发送成功");
	        } catch (MessagingException e) {
	            logger.error("发送html邮件时发生异常!", e);
	        }



发送带附件的邮件代码示例:



try {
             mail内容设定  
            MimeMessage message = mailSender.createMimeMessage();
            MimeMessageHelper helper = new MimeMessageHelper(message, true);
            // 设置邮件发送人
            helper.setFrom(username);
            // 设置邮件接收人
            helper.setTo(to);
            //  设置抄送
            if(!StringUtil.isEmpty(cc)) {
            	helper.setBcc(cc);
            }
            // 设置邮件主题
            helper.setSubject(subject);
            // 设置邮件正文内容 第二个参数为true表示将发送内容设置为"text/html"
            helper.setText(content, true);
           // 发送的附件
            FileSystemResource file = new FileSystemResource(new File(filePath));
            String fileName = filePath.substring(filePath.lastIndexOf(File.separator));
            helper.addAttachment(fileName, file);
            mailSender.send(message);
            logger.info("带附件的邮件已经发送。");
        } catch (Exception e) {
            logger.error("发送带附件的邮件时发生异常!", e);
        }



发送正文中有静态资源(图片)的邮件代码示例:



try {
             mail内容设定  
            MimeMessage message = mailSender.createMimeMessage();
            MimeMessageHelper helper = new MimeMessageHelper(message, true);
            // 设置邮件发送人
            helper.setFrom(username);
            // 设置邮件接收人
            helper.setTo(to);
            // 设置抄送
            if(!StringUtil.isEmpty(cc)) {
            	helper.setBcc(cc);
            }
            // 设置邮件主题
            helper.setSubject(subject);
            // 设置邮件正文内容 第二个参数为true表示将发送内容设置为"text/html"
            helper.setText(content, true);
            // 图片
            FileSystemResource res = new FileSystemResource(new File(rscPath));
            helper.addInline(rscId, res);
            // 发送邮件
            mailSender.send(message);
            logger.info("嵌入静态资源的邮件已经发送。");
        } catch (Exception e) {
            logger.error("发送嵌入静态资源的邮件时发生异常!", e);
        }



application.properties配置文件中与邮件发送有关的配置:



#邮件设定
#邮件发送的主机,我这里使用是qq邮箱
spring.mail.host=smtp.qq.com
#邮件发送的端口 SMTP协议默认端口是25
spring.mail.port=25
#邮件发送的邮箱地址
spring.mail.username=xxxx@qq.com
#这里的password是邮箱SMTP认证所需的password,不是username邮箱的登录密码,QQ邮箱的SMTP在设置页面开通
spring.mail.password=
#开启SMTP认证
spring.mail.properties.mail.smtp.auth=true
#邮件的默认编码格式
spring.mail.default-encoding=UTF-8
spring.mail.properties.mail.smtp.starttls.enable=false



测试代码:



import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.annotation.PropertySource;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;

/**
 * springboot mail Demo
 * 
 * @version 16.33 2020-12-06
 * @author Yolo
 *
 */

@SpringBootTest
@PropertySource(value= {"classpath:mailConfig.properties", "file:./config/mailConfig.properties"},ignoreResourceNotFound = true)
public class MailServiceTest {

    @Autowired
    private MailService mailService;

    @Autowired
    private TemplateEngine templateEngine;
    
    @Value("${mail.to}")
    private String to;
    
    @Value("${mail.cc}")
    private String cc;
    
    /**
	 * host
	 */
	@Value("${host}")
	private String host;

	/**
	 * port
	 */
	@Value("${port}")
	private String port;

	/**
	 * username
	 */
	@Value("${username}")
	private String username;

	/**
	 * password
	 */
	@Value("${password}")
	private String password;

    @Test
    public void testSimpleMail() throws Exception {
    	System.out.println(Thread.currentThread().getStackTrace()[1].getMethodName() + " Start");
        mailService.sendSimpleMail(to, cc, "test simple mail"," hello this is simple mail");
        System.out.println(Thread.currentThread().getStackTrace()[1].getMethodName() + " End");
    }

    @Test
    public void testHtmlMail() throws Exception {
    	System.out.println(Thread.currentThread().getStackTrace()[1].getMethodName() + " Start");
        String content="<html>n" +
                "<body>n" +
                "    <h3>hello world ! 这是一封html邮件!</h3>n" +
                "</body>n" +
                "</html>";
        mailService.sendHtmlMail(to, cc,"test simple mail",content);
        System.out.println(Thread.currentThread().getStackTrace()[1].getMethodName() + " End");
    }

    @Test
    public void sendAttachmentsMail() {
    	System.out.println(Thread.currentThread().getStackTrace()[1].getMethodName() + " Start");
        String filePath="D:TesttmpjustTest.xlsx";
        mailService.sendAttachmentsMail(to, cc, "主题:带附件的邮件", "有附件,请查收!", filePath);
        System.out.println(Thread.currentThread().getStackTrace()[1].getMethodName() + " End");
    }


    @Test
    public void sendInlineResourceMail() {
    	System.out.println(Thread.currentThread().getStackTrace()[1].getMethodName() + " Start");
        String rscId = "avatar";
        String content="<html><body>这是有图片的邮件:<img src='cid:" + rscId + "' ></body></html>";
        String imgPath = "D:Testtmpavatar.jpg";
        mailService.sendInlineResourceMail(to, null, "主题:这是有图片的邮件", content, imgPath, rscId);
        System.out.println(Thread.currentThread().getStackTrace()[1].getMethodName() + " End");
    }


    @Test
    public void sendTemplateMail() {
    	System.out.println(Thread.currentThread().getStackTrace()[1].getMethodName() + " Start");
        //创建邮件正文
        Context context = new Context();
        context.setVariable("id", "007");
        String emailContent = templateEngine.process("emailTemplate", context);
        mailService.sendHtmlMail(to,null, "主题:这是模板邮件",emailContent);
        System.out.println(Thread.currentThread().getStackTrace()[1].getMethodName() + " End");
    }
}



Tip:SpringBoot从2.2版本开始junit从junit4升级到junit5,测试代码的写法稍有不同,在junit5中不再需要使用@RunWith(SpringRunner.class)注解。

测试结果:




springboot实现聊天室 springboot message_邮件发送


简单文本邮件

springboot实现聊天室 springboot message_springboot实现聊天室_02

简单html邮件


springboot实现聊天室 springboot message_html_03

带附件的邮件

springboot实现聊天室 springboot message_spring_04

带静态资源的邮件

springboot实现聊天室 springboot message_springboot可选参数_05

模板邮件,使用模板,利用thymeleaf对值进行绑定