SpringBoot如何实现邮件发送呢?

戚薇 SpringBoot 发布时间:2023-05-14 20:46:08 阅读数:1183 1
下文笔者讲述使用SpringBoot发送(简单邮件、带附件邮件、带图片资源的邮件、使用邮件模板)的方法及示例分享,如下所示

SpringBoot发送邮件的实现思路

1.邮箱账户上设置 POP3/SMTP设置
2.引入相应的jar包
3.将邮件服务器的信息设置到 application.properties文件中
4.直接调用mailService发送邮件
例:

发送邮件基本配置

创建项目
添加依赖

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

在application.properties中进行配置

#邮件服务器
spring.mail.host=smtp.qq.com 
#端口(465或587)
spring.mail.port=465 
# 邮箱
spring.mail.username=xxxx@qq.com  
# 授权码
spring.mail.password=232324213114
spring.mail.default-encoding=UTF-8
spring.mail.properties.mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory
spring.mail.properties..mail.debug=true

发送简单邮件

创建一个MailService用来封装邮件的发送:

@Component
public class MailService {
    
    @Autowired
    JavaMailSender javaMailSender;
    
    public void sendSimpleMail(String from, String to, String cc, String subject, String content){
        SimpleMailMessage simpMsg = new SimpleMailMessage();
        simpMsg.setFrom(from);//发送者
        simpMsg.setTo(to);//收件人
        simpMsg.setCc(cc);//抄送人
        simpMsg.setSubject(subject);//邮件主题
        simpMsg.setText(content);//邮件内容
        javaMailSender.send(simpMsg);
    }
}
 
JavaMeailSender
 是SpringBoot
   在MailSenderPropertiesConfiguration类中配置好
   该类在mail自动配置类MailSenderAutoConfiguration中导入
   所以直接注入JavaMailSender就可以使用了。
   简单邮件可以直接构建一个SimpleMailMessage对象进行配置
    配置完成后
    通过JavaMailSender将邮件发送出去。

@RunWith(SpringRunner.class)
@SpringBootTest
class DemoApplicationTests {
    @Autowired
    MailService mailService;

    @Test
    void sendSimpleMail() {
        mailService.sendSimpleMail("1xx@qq.com",
                "xxxx@163.com",
                "xxxxx313@qq.com",
                "邮件测试主题",
                "邮件测试内容");
    }
}

发送带附件的邮件

发送带附件的邮件
    我们只需使用attachment方法添加附件
public void sendAttachFileMail(String from, String to, String subject, String content, File file){
try {
	MimeMessage message = javaMailSender.createMimeMessage();
	MimeMessageHelper helper = new MimeMessageHelper(message, true);
	helper.setFrom(from);
	helper.setTo(to);
	helper.setSubject(subject);
	helper.setText(content);
	helper.addAttachment(file.getName(), file);
	javaMailSender.send(message);
  }catch (MessagingException e){
	e.printStackTrace();
  }
}
  
@Test
public void sendAttachFileMail(){
	String path = this.getClass().getClassLoader().getResource("application.properties").getPath();

	mailService.sendAttachFileMail("xx@qq.com",
			"xxx@163.com",
			"测试邮件主题",
			"测试邮件内容",
			new File(path));
}

发送带图片资源的邮件

邮件正文中要插入图片
  需使用FileSystemResource 
public void sendMailWithImg(String from, String to, String subject, String content, String[] srcPath, String[] resIds){
        if(srcPath.length != resIds.length){
            System.out.println("发送失败!");
            return;
        }
        try{
            MimeMessage message = javaMailSender.createMimeMessage();
            MimeMessageHelper helper = new MimeMessageHelper(message, true);
            helper.setFrom(from);
            helper.setTo(to);
            helper.setSubject(subject);
            helper.setText(content, true);
            for(int i = 0; i < srcPath.length; i++){
                FileSystemResource res = new FileSystemResource(new File(srcPath[i]));
                helper.addInline(resIds[i], res);
            }
            javaMailSender.send(message);
        }catch (MessagingException e){
            System.out.println("发送失败!");
        }
    }

//在调用MimeMessageHelper中的setText方法时
//第二个参数为true表示邮件正文是HTML格式
//该参数不传默认为false。

@Test
public void sendMailWithImg(){
	String imgPaht1 = this.getClass().getClassLoader().getResource("img/2.jpg").getPath();
	String imgPaht2 = this.getClass().getClassLoader().getResource("img/3.jpg").getPath();

	mailService.sendMailWithImg("xxxx@qq.com",
			"xxxx@163.com",
			"测试邮件主题(图片)",
			"<div>hello,这是一封带图片资源的邮件:" +
					"这是图片1:<div><img src='cid:p01'/></div>" +
					"这是图片2:<div><img src='cid:p02'/></div>" +
					"</div>",
			new String[]{imgPaht1, imgPaht2},
			new String[]{"p01", "p02"});
}

使用FreeMarker构建邮件模板

对于格式复杂的邮件
 采用字符串进行拼接
  不但容易出错,而且不易维护
使用HTML模板可以很好的解决这一问题
  使用FreeMarker构建邮件模板,首先加入FreeMarker依赖:
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
public void sendHtmlMail(String from, String to, String subject, String content){
        try{
            MimeMessage message = javaMailSender.createMimeMessage();
            MimeMessageHelper helper = new MimeMessageHelper(message, true);
            helper.setFrom(from);
            helper.setTo(to);
            helper.setSubject(subject);
            helper.setText(content, true);
            javaMailSender.send(message);
        }catch (MessagingException e){
            System.out.println("发送失败!");
        }
    }
resources目录下
创建mailtemplate.ft1作为邮件模板:
<div>邮箱激活</div>
<div>您的注册信息是:
<table border="1">
    <tr>
        <td>用户名</td>
        <td>${username}</td>
    </tr>
    <tr>
        <td>用户性别</td>
        <td>${gender}</td>
    </tr>
</table>
</div>
<div>
    <a href="http://www.baidu.com">核对无误请点击本链接激活邮箱</a>
</div>

User实体类

public class User {
    private String username;
    private String gender;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }
}
 
//测试
@Test
public void sendHtmlMail(){
	try{
		Configuration configuration = new Configuration(Configuration.VERSION_2_3_0);
		ClassLoader loader = DemoApplicationTests.class.getClassLoader();
		configuration.setClassLoaderForTemplateLoading(loader,"ft1");
		Template template = configuration.getTemplate("mailtemplate.ft1");
		StringWriter mail = new StringWriter();
		User user = new User();
		user.setUsername("测试用户");
		user.setGender("男");
		template.process(user, mail);
		mailService.sendHtmlMail("xxxx@qq.com",
				"xxx@163.com",
				"测试邮件主题(FreeMarker)",
				mail.toString());
	}catch (Exception e){
		e.printStackTrace();
	}
}

使用Thymeleaf构建邮件模板

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

Thymeleaf邮件模板默认位置是在resources/templates目录下
创建相应目录,然后创建邮件模板mailtemplate.html:

<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>邮件</title>
</head>
<body>
    <div>邮箱激活</div>
    <div>您的注册信息是:
        <table border="1">
            <tr>
                <td>用户名</td>
                <td th:text="${username}"></td>
            </tr>
            <tr>
                <td>用户性别</td>
                <td th:text="${gender}"></td>
            </tr>
        </table>
    </div>
    <div>
        <a href="http:www.baidu.com">核对无误清点击本链接激活邮箱</a>
    </div>
</body>

 
测试
@Autowired
TemplateEngine templateEngine;

@Test
public void sendHtmlMailThymeleaf(){
	Context ctx = new Context();
	ctx.setVariable("username", "tom");
	ctx.setVariable("gender", "男");
	String mail = templateEngine.process("mailtemplate.html", ctx);
	mailService.sendHtmlMail("xxxx@qq.com",
			"xxxx@163.com",
			"测试邮件主题(Thymeleaf)",
			mail);
}
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/JavaFramework/SpringBoot/202305/6436.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者