在SpringBoot手动编码发送邮件

SpringBoot提供了开箱即用的邮件发送starter,通过简单的配置,就可以发送邮件。参考如下。

直接用starter的弊端

开箱即用的starter,需要把邮箱配置等信息,都配置在配置文件中,如果需要更改邮箱信息,则需要重新配置,编译打包。比较麻烦,一个灵活的系统,一般都是从把邮箱信息配置在数据库中,甚至可以配置多个邮箱。

执行邮件发送业务的时候,从数据库中读取,邮箱信息,邮件模板等等数据。来进行发送。

灵活的发送邮件

本质上还是使用spring-boot-starter-mail提供的邮件发送api来完成功能

依赖

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

发送方法的实现

import java.nio.file.Paths;
import java.io.UnsupportedEncodingException;
import java.nio.file.Files;
import java.util.Properties;

import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;

import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.mail.javamail.MimeMessageHelper;

public class EmailHelper {
	
	public static void main(String[] args) throws UnsupportedEncodingException, MessagingException {
		sendTest();
	}
	
	public static void sendTest() throws MessagingException, UnsupportedEncodingException {
		
		JavaMailSenderImpl javaMailSenderImpl = new JavaMailSenderImpl();

		javaMailSenderImpl.setDefaultEncoding("utf-8");

		javaMailSenderImpl.setHost("smtp.exmail.qq.com"); 					// 邮箱服务器主机
		javaMailSenderImpl.setPort(465); 									// 端口
		javaMailSenderImpl.setUsername("no-reply@springboot.io"); 			// 登录账户
		javaMailSenderImpl.setPassword("123456789"); 	// 登录密码
		javaMailSenderImpl.setProtocol("smtps"); 							// 协议

		Properties properties = new Properties();
		properties.put("mail.smtp.auth", "true"); 							// 配置项
		properties.put("mail.smtp.starttls.enable", "true");
		properties.put("mail.smtp.starttls.required", "true");

		javaMailSenderImpl.setJavaMailProperties(properties);

		// 创建邮件消息
		MimeMessage message = javaMailSenderImpl.createMimeMessage();

		// 通过Helper 设置邮件消息内容
		MimeMessageHelper helper = new MimeMessageHelper(message, true);
		
		// 基本信息
		helper.setFrom("no-reply@springboot.io", "SpringBoot中文社区");		// 设置发件人与别名
		helper.setTo("747692844@qq.com");									// 收件人
		helper.setSubject("你好,这是测试邮件");									// 主题
		
		// 邮件文本内容,通过boolean参数指定内容是否是HTML
		helper.setText("<h3>Hello SpringBoot</h3>", true);

		// 邮件附件,指定附件名称,流,ContentType
		helper.addAttachment("logo.png", () -> Files.newInputStream(Paths.get("D:\\logo.png")), "image/png");

		// 发送邮件
		javaMailSenderImpl.send(message);
	}
}

收到邮件

别名,内容,附件都没有问题

我看到你说弊端 我以为你要重新写结果还是用的starter :upside_down_face:

嗯,我觉得把邮箱信息写在配置文件不灵活。维护在后台数据库比较好。api还是用它的,只是要自己编码完成一些东西。

我明白你意思了 :+1: