Spring boot 项目(十五)——实现163邮箱发送邮件

引言

对于某些项目来说,需要发送邮件来完成,例如,发送验证码,发送附件(文档,压缩包之类的),发送链接。本博客利用163邮箱来实现功能需求。

前期准备

修改163邮箱的POP3配置,并备份授权码,方便项目中使用
在这里插入图片描述
在这里插入图片描述

代码编写

在这里插入图片描述

01、pom文件

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-thymeleaf</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<!--邮件-->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-mail</artifactId>
		</dependency>

02、application.properties文件

# 邮箱配置
spring.mail.host=smtp.163.com
# 你的163邮箱
spring.mail.username=liuxing121380110@163.com
# 注意这里不是邮箱密码,而是SMTP授权密码
spring.mail.password=xxxxx
spring.mail.port=25
spring.mail.protocol=smtp
spring.mail.default-encoding=UTF-8

在这里插入图片描述
03、邮件工具类

package com.information.util;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.FileSystemResource;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;

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

/**
 * Description
 * Author  流星
 * Date 2022/1/13 22:06
 **/
@Service
public class MailUtil {

    private final Logger logger = LoggerFactory.getLogger(this.getClass());

    @Value("${spring.mail.username}")
    private String from;

    @Autowired
    private JavaMailSender mailSender;

    /**
     * 简单文本邮件
     * @param to 接收者邮件
     * @param subject 邮件主题
     * @param content 邮件内容
     */
    public void sendSimpleMail(String to, String subject, String content){

        SimpleMailMessage message = new SimpleMailMessage();
        message.setTo(to);
        message.setSubject(subject);
        message.setText(content);
        message.setFrom(from);

        mailSender.send(message);
    }

    /**
     * HTML 文本邮件
     * @param to 接收者邮件
     * @param subject 邮件主题
     * @param content HTML内容
     * @throws MessagingException
     */
    public void sendHtmlMail(String to, String subject, String content) throws MessagingException {
        MimeMessage message = mailSender.createMimeMessage();

        MimeMessageHelper helper = new MimeMessageHelper(message, true);
        helper.setTo(to);
        helper.setSubject(subject);
        helper.setText(content, true);
        helper.setFrom(from);

        mailSender.send(message);
    }

    /**
     * 附件邮件
     * @param to 接收者邮件
     * @param subject 邮件主题
     * @param content HTML内容
     * @param filePath 附件路径
     * @throws MessagingException
     */
    public void sendAttachmentsMail(String to, String subject, String content,
                                    String filePath) throws MessagingException {
        MimeMessage message = mailSender.createMimeMessage();

        MimeMessageHelper helper = new MimeMessageHelper(message, true);
        helper.setTo(to);
        helper.setSubject(subject);
        helper.setText(content, true);
        helper.setFrom(from);

        FileSystemResource file = new FileSystemResource(new File(filePath));
        String fileName = file.getFilename();
        helper.addAttachment(fileName, file);

        mailSender.send(message);
    }

    /**
     * 图片邮件
     * @param to 接收者邮件
     * @param subject 邮件主题
     * @param content HTML内容
     * @param rscPath 图片路径
     * @param rscId 图片ID
     * @throws MessagingException
     */
    public void sendInlinkResourceMail(String to, String subject, String content,
                                       String rscPath, String rscId) {
        logger.info("发送静态邮件开始: {},{},{},{},{}", to, subject, content, rscPath, rscId);

        MimeMessage message = mailSender.createMimeMessage();
        MimeMessageHelper helper = null;

        try {

            helper = new MimeMessageHelper(message, true);
            helper.setTo(to);
            helper.setSubject(subject);
            helper.setText(content, true);
            helper.setFrom(from);

            FileSystemResource res = new FileSystemResource(new File(rscPath));
            helper.addInline(rscId, res);
            mailSender.send(message);
            logger.info("发送静态邮件成功!");

        } catch (MessagingException e) {
            logger.info("发送静态邮件失败: ", e);
        }
    }
}

04、controller

package com.information.controller;

import com.information.util.MailUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;

import javax.annotation.Resource;
import javax.mail.MessagingException;

/**
 * Description
 * Author  流星
 * Date 2022/1/13 22:11
 **/

@RestController
@RequestMapping
public class MailTestController {

    @Autowired
    private MailUtil mailUtil;

    @Resource
    private TemplateEngine templateEngine;

    /**
     * 测试一个简单的、由自己撰写邮件标题和内容的邮件
     **/
    @RequestMapping("mail01")
    public String sendSimpleMail() {
        mailUtil.sendSimpleMail("liuxing121380110@163.com","测试spring boot mail-主题","测试spring boot mail - 内容");
        return "发送成功";
    }

    /**
     * 测试一个简单的html邮件
     **/
    @RequestMapping("mail02")
    public String sendHtmlMail() throws MessagingException {

        String content = "<html>\n" +
                "<body>\n" +
                "<h3>hello world</h3>\n" +
                "<h1>html</h1>\n" +
                "<body>\n" +
                "</html>\n";

        mailUtil.sendHtmlMail("liuxing121380110@163.com","hello world邮件",content);
        return "发送成功";
    }

    /**
     * 测试文档之类附件传输的邮件
     **/
    @RequestMapping("mail03")
    public String sendAttachmentsMail() throws MessagingException {
        String filePath = "src/main/resources/static/redis.docx";
        String content = "<html>\n" +
                "<body>\n" +
                "<h3>hello world</h3>\n" +
                "<h1>html</h1>\n" +
                "<h1>附件传输</h1>\n" +
                "<body>\n" +
                "</html>\n";
        mailUtil.sendAttachmentsMail("liuxing121380110@163.com","附件传输",content, filePath);
        return "发送成功";
    }

    /**
     * 测试图片之类的、且显示在邮件内容上的邮件
     **/
    @RequestMapping("mail04")
    public String sendInlinkResourceMail() throws MessagingException {
        //TODO 相对路径
        String imgPath = "src/main/resources/static/test01.png";
        String rscId = "test";
        String content = "<html>" +
                "<body>" +
                "<h3>hello world</h3>" +
                "<h1>html</h1>" +
                "<h1>图片邮件</h1>" +
                "<img src='cid:"+rscId+"'></img>" +
                "<body>" +
                "</html>";

        mailUtil.sendInlinkResourceMail("liuxing121380110@163.com","这是一封图片邮件",content, imgPath, rscId);
        return "发送成功";
    }

    /**
     * 测试一个HTML模板的邮件
     **/
    @RequestMapping("mail05")
    public String testTemplateMailTest() throws MessagingException {
        Context context = new Context();
        context.setVariable("id","liuxing121380110");

        String emailContent = templateEngine.process("emailTemplate", context);
        mailUtil.sendHtmlMail("liuxing121380110@163.com","这是一封HTML模板邮件",emailContent);
        return "发送成功";

    }
}

05、emailTemplate.html

<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8"/>
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"/>
    <meta http-equiv="X-UA-Compatible" content="ie=edge"/>
    <title>注册-测试邮件模板</title>
</head>
<body>
你好,感谢你的注册,这是一封验证邮件,请点击下面的连接完成注册,感谢您的支持。
<!--<a href="#" th:href="@{https://github.com/{id}(id=${id})}">激活账户</a>-->
</body>
</html>

测试结果(postman测试)

在这里插入图片描述
在这里插入图片描述

扩展资料

电子邮件服务器

用户要在Internet上提供电子邮件功能,必须有专门的电子邮件服务器。这些邮件服务器就类似于现实生活中的邮局,它主要负责接收用户投递过来的邮件,并把邮件投递到邮件接收者的电子邮箱中。
邮件服务器就好像是互联网世界的邮局。按照功能划分,邮件服务器可以划分为两种类型:
1、SMTP邮件服务器:用户替用户发送邮件和接收外面发送给本地用户的邮件。
2、POP3/IMAP邮件服务器:用户帮助用户读取SMTP邮件服务器接收进来的邮件。

电子邮箱

电子邮箱也称为E-mail地址,用户可以通过E-mail地址来标识自己发送的电子邮件,也可以通过这个地址接收别人发来的电子邮件。电子邮箱需要到邮件服务器进行申请,也就是说,电子邮箱其实就是用户在邮件服务器上申请的账户。
邮件服务器会把接收到的邮件保存到为该账户所分配的邮箱空间中,用户通过用户名密码登录到邮件服务器查收该地址已经收到的邮件。 一般来讲,邮件服务器为用户分配的邮箱空间是有限的。

邮件传输协议

电子邮件需要在邮件客户端和邮件服务器之间,以及两个邮件服务器之间进行邮件传递,那就必须要遵守一定的规则,这个规则就是邮件传输协议。下面我们分别简单介绍几种协议:

  1. SMTP协议:全称为 Simple Mail Transfer Protocol,简单邮件传输协议。它定义了邮件客户端软件和SMTP邮件服务器之间,以及两台SMTP邮件服务器之间的通信规则。
  2. POP3协议:全称为 Post Office Protocol,邮局协议。它定义了邮件客户端软件和POP3邮件服务器的通信规则。
  3. IMAP协议:全称为 Internet Message Access Protocol,Internet消息访问协议,它是对POP3协议的一种扩展,也是定义了邮件客户端软件和IMAP邮件服务器的通信规则。

附:源代码

163邮箱发送邮件

  • 4
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
在个人博客系统中,拓展模块是非常重要的,因为它可以提供给用户更多的功能和服务。在本文中,我们将介绍如何在 Spring Boot 项目实现一个拓展模块。 首先,我们需要先定义一个接口,用于规范拓展模块的实现: ```java public interface BlogModule { String moduleName(); // 获取模块名称 void start(); // 模块启动方法 void stop(); // 模块停止方法 List<String> addPage(String pageName); // 增加页面 } ``` 接下来,我们需要创建一个基础的拓展模块,作为其他拓展模块的基类: ```java public abstract class BaseBlogModule implements BlogModule { private String moduleName; public BaseBlogModule(String moduleName) { this.moduleName = moduleName; } @Override public String moduleName() { return moduleName; } } ``` 在基类中,我们实现了 `moduleName()` 方法,返回拓展模块的名称,并在构造函数中初始化了名称。 然后,我们可以开始实现具体的拓展模块了。假设我们需要实现一个功能,可以在博客系统中添加页面。我们可以创建一个名为 `AddPageModule` 的拓展模块: ```java public class AddPageModule extends BaseBlogModule { private List<String> pages = new ArrayList<>(); public AddPageModule() { super("AddPageModule"); } @Override public void start() { System.out.println("AddPageModule starting..."); } @Override public void stop() { System.out.println("AddPageModule stopping..."); } @Override public List<String> addPage(String pageName) { pages.add(pageName); return pages; } } ``` 在这个拓展模块中,我们实现了 `start()` 和 `stop()` 方法,用于在模块启动和停止时执行一些操作。同时,我们还实现了 `addPage()` 方法,用于添加页面,并返回当前系统中所有的页面。 最后,我们需要在 Spring Boot 项目中将这个拓展模块注入到容器中,并在需要的地方调用它的方法。我们可以使用 `@Autowired` 注解将拓展模块注入到其他组件中: ```java @Service public class BlogService { @Autowired private List<BlogModule> modules; public List<String> addPage(String pageName) { List<String> pages = new ArrayList<>(); for (BlogModule module : modules) { pages.addAll(module.addPage(pageName)); } return pages; } } ``` 在这个示例中,我们使用 `@Autowired` 注解将 `BlogModule` 的实现类自动注入到 `modules` 列表中,并在 `addPage()` 方法中循环遍历所有的模块,调用它们的 `addPage()` 方法。 通过这种方式,我们可以轻松地实现一个可拓展的 Spring Boot 项目,并在需要的时候动态地增加或删除拓展模块。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

--流星。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值