介绍

springboot提供了mail的发送jar包,当然你可以选择其他jar包实现,比如阿里云提供的sdk来实现,腾讯云的sdk实现。
我们用阿里云的简单例子,来解释发送邮箱,需要的必须参数。

public class email {
	public static void main(String[] args) throws EmailException {
		SimpleEmail email =new SimpleEmail();
		//邮箱发送的地址
		email.setHostName("smtp.qq.com");
		//发信人账号和密码或授权码(授权码会过期)
		email.setAuthentication("***3457107", "your code");
		//邮箱标题
		email.setFrom("***3457107@qq.com","你好!");
		// ssl协议
		email.setSSLOnConnect(true);
		//发送邮箱地址
		email.addTo("***7887868@qq.com");
		//邮箱正文标题
		email.setSubject("我是一封简单文本邮件标题!");
		//邮箱内容
		email.setMsg("hello world!");
		//发送
		email.send();
	}
}

从上面看,必选参数有邮件的服务器地址、发信人账号和授权码、邮件标题、邮件收信人、邮件正文标题、邮件内容。

这就是基本参数,而一些抄送、密送、发送时间、附件等都是可选参数。

而授权码则需要我们手动配置一下,登录QQ邮箱,找到设置->账户->生成授权码,发送对应的短信后,就会出现授权码。

spring boot 对接 springboot对接腾讯云邮箱服务_spring

知识储备

在学习邮件发送之前,我们先来学习一下jasypt配置文件加解密
当我们的application.yml配置文件一些敏感数据,不希望直接暴露在文件中,而使用密钥加密后,得到一串密码。
就比如,授权码这类信息过于敏感,那么我们可以进行加密。
选择jasypt技术,和springboot整合后,就不需要程序员去管加密解密过程,只需要在配置文件中,将加密字符串放在对应位置,以HNC(加密字符串)格式,springboot会自动识别,无需在写其他代码。
注意:加密字符串需要在@test生成,一旦你改变了密码,那么需要重新生成,并且配置文件的加密字符串需要空处理,当然你可以使用jar包来生成密文。

jasypt技术

引入依赖

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.1.RELEASE</version>
    </parent>
    <dependencies>
        <!-- Spring Boot 邮件依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-mail</artifactId>
        </dependency>
        
        <!--jasypt配置文件加解密-->
        <dependency>
            <groupId>com.github.ulisesbocchio</groupId>
            <artifactId>jasypt-spring-boot-starter</artifactId>
            <version>${jasypt.version}</version>
        </dependency>
        
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        
    </dependencies>

测试类

@RunWith(SpringRunner.class)
@SpringBootTest
public class Encryptor {

	/**
	 * 密码解码器自动注入
	 */
	@Autowired
	StringEncryptor encryptor;

	//加密
	@Test
	public void getPass() {
		String name = encryptor.encrypt("javaJunitPassword");
		System.out.println("加密结果:" + name);//解密
	}

	@Test
	public void passDecrypt() {
		String username = encryptor.decrypt("7nVX7m3/rNiz+i+oMxGwa/fAOK8cBrsep0CmXZB8JuHtD9K5lNsjW0Jli3wn9X8U");
		System.out.println("解密结果:" + username);
	}
}

然后将密文放到配置文件中。
application.yml

# 敏感数据时,可用jasypt加密,格式:ENC(加密字符串),算法:
username: HNC(your code)
# 为 jasypt 配置解密秘钥
jasypt:
  encryptor:
    password: hikktn
    # 自定义算法,默认算法:PBEWithMD5AndDES
    ivGeneratorClassname: org.jasypt.salt.RandomIVGenerator

正式开始

pom
<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.1.RELEASE</version>
    </parent>
    
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <jasypt.version>2.1.1</jasypt.version>
    </properties>
    <dependencies>
        <!-- Spring Boot 邮件依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-mail</artifactId>
        </dependency>
        
        <!--jasypt配置文件加解密-->
        <dependency>
            <groupId>com.github.ulisesbocchio</groupId>
            <artifactId>jasypt-spring-boot-starter</artifactId>
            <version>${jasypt.version}</version>
        </dependency>
        
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.4.1</version>
        </dependency>
        
        <!-- Spring Boot 模板依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
    </dependencies>
    
    <build>
        <finalName>spring-boot-demo-email</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

application.yml

spring:
  mail:
    host: smtp.qq.com #SMTP服务器地址
    port: 465
    username:  ***3457107 #登陆账号
    # 敏感数据时,可用jasypt加密,格式:ENC(加密字符串),算法:
    password: ENC(your encryptor code) #登陆密码(或授权码)
    #服务协议
    protocol: smtp
    # 连接失败,跳过错误
    test-connection: true
    # 编码集
    default-encoding: UTF-8
    properties:
      from: ***3457107@qq.com #邮件发信人(即真实邮箱)
      to: ***7887868@qq.com # 邮件接信人(为方便测试)
      # 设置是否需要认证
      mail.smtp.auth: true
      #
      mail.smtp.starttls.enable: true
      mail.smtp.starttls.required: true
      # ssl
      mail.smtp.ssl.enable: true
  servlet:
    multipart:
      max-file-size: 10MB #限制单个文件大小
      max-request-size: 50MB #限制请求总量
# 为 jasypt 配置解密秘钥
jasypt:
  encryptor:
    password: hikktn
    # 自定义算法,默认算法:PBEWithMD5AndDES
    ivGeneratorClassname: org.jasypt.salt.RandomIVGenerator

MailService.java

public class MailService {
/**
	 * java邮件发送类
	 */
	@Autowired
	private JavaMailSender mailSender;
	/**
	 * 发件人邮箱
	 */
	@Value("${spring.mail.properties.from}")
	private String from;
	/**
	 * 收件人邮箱
	 */
	@Value("${spring.mail.properties.to}")
	private String to;
	
	/**
	 * 发送文本邮件
	 *
	 * @param subject 邮件主题
	 * @param content 邮件内容
	 * @param cc      抄送地址
	 */
	public void sendSimpleMail(String subject, String content, String... cc) {
		// 创建文本邮箱消息类
		SimpleMailMessage message = new SimpleMailMessage();
		// 设置发件人邮箱
		message.setFrom(from);
		// 设置收件人邮箱
		message.setTo(to);
		// 设置邮箱标题
		message.setSubject(subject);
		// 设置邮箱主体内容
		message.setText(content);
		// 抄送人不为空的场合
		if (ArrayUtil.isNotEmpty(cc)) {
			// 设置抄送人
			message.setCc(cc);
		}
		// 发送消息
		mailSender.send(message);
	}
}

测试类

@RunWith(SpringRunner.class)
@SpringBootTest
public class MailServiceTest {

	@Autowired
	private MailService mailService;
/**
	 * 测试简单邮件
	 */
	@Test
	public void sendSimpleMail() {
		mailService.sendSimpleMail("这是一封简单邮件", "这是一封普通的SpringBoot测试邮件");
	}
}

结果

spring boot 对接 springboot对接腾讯云邮箱服务_spring_02