Java后端邮件发送

邮件发送

邮箱需要开启POP3/SMTP服务

发送

1. 搭建环境

使用SpringBoot发送邮件,搭建环境非常容易,首先在创建项目时添加邮件依赖,代码如下:

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-mail</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>


项目创建成功后,在application.yml中完成邮件基本消息配置,代码如下:

spring:
  mail:
    host: smtp.qq.com
    port: 465
    username: ***@qq.com
    password: *****
    default-encoding: UTF-8
    properties: 
      mail: 
        smtp: 
          socketFactory: 
            class: javax.net.ssl.SSLSocketFactory
        debug: true

这里配置了邮件服务器的地址、端口(可以是465或者587)、用户的账号和密码以及默认编码、SSL连接配置等,
最后开启debug,这样方便开发者查看邮件发送日志。注意,SSL的配置可以在QQ邮箱帮助中心看到相关文档。

完成这些配置后,基本的邮件发送环境就搭建成功了,接下来就可以发送邮件了。邮件从简单到复杂有多种类型,下面分别给予介绍。

2. 发送简单邮件

创建一个MailService用来封装邮件的发送,代码如下:

@Component
public class MailService {
    @Autowired
    JavaMailSender javaMailSender;

    public void sendSimpleMail(String from,String to,String cc, String subject,String content) {
        SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
        simpleMailMessage.setFrom(from);
        simpleMailMessage.setTo(to);
        simpleMailMessage.setCc(cc);
        simpleMailMessage.setSubject(subject);
        simpleMailMessage.setText(content);
        javaMailSender.send(simpleMailMessage);
    }
}

代码解释:

  • JavaMailSender是SpringBoot在MailSenderPropertiesConfiguration类中配置好的,该类在Mail自动配置类MailSenderAutoConfiguration中导入,
    因此这里注入JavaMailSender就可以使用了。

  • sendSimpleMail方法的5个参数分别表示发送者、收件人、抄送人、邮件主题以及邮件内容。

  • 简单邮件可以直接构建一个SimpleMailMessage对象进行配置,配置完成以后,通过javaMailSender将邮件发送出去。

配置完成后,在单元测试中写一个测试方法,代码如下:

@SpringBootTest
class Chapter131ApplicationTests {

    @Autowired
    MailService mailService;

    @Test
    void contextLoads() {
    }

    @Test
    public void sendSimpleMail(){
        mailService.sendSimpleMail("**@qq.com","**@163.com","**@outlook.com","测试邮件主题","测试邮件内容");
    }


}

执行该方法,即可看到邮件发送成功。

3. 发送带附件的邮件

要发送一个带附件的邮件也非常容易,通过调用Attachment方法即可添加附件,该方法调用多次即可添加多个附件。
在MailService中添加如下方法:

   /**
     * 发送带附件的邮件
     * @param from
     * @param to
     * @param subject
     * @param content
     * @param file
     */
    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();
        }
    }
}

这里使用MimeMessageHelper简化了邮件的配置,它的构造方法的第二个参数true表示构造一个multipart message类型的邮件,
multipart message类型的邮件包含多个正文、附件以及内嵌资源,邮件的表现形式更加丰富。最后通过addAttachment方法添加附件。

在单元测试中添加如下方法进行测试:

    @Test
    public void sendAttachFileMail(){
        mailService.sendAttachFileMail("**@qq.com","**@163.com","测试邮件主题","测试邮件内容",new File("C:\\Users\\yulu\\Desktop\\images\\app\\uploads\\2020052109530CE775EF-A42A-4F6F-8C86-86E8DB7A80FA.jpeg"));
    }
4. 发送带图片资源的邮件

有的邮件正文中可能要插入图片,使用FileSystemResource可以实现这一功能,代码如下:

    /**
     * 发送带图片资源的邮件
     *
     * @param from
     * @param to
     * @param subject
     * @param content
     * @param srcPath
     * @param resIds
     */
    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 resource = new FileSystemResource(new File(srcPath[i]));
                helper.addInline(resIds[i], resource);
            }
            javaMailSender.send(message);
        } catch (MessagingException e) {
            e.printStackTrace();
        }
    }
}

在发送有件事分别传入图片资源路径和资源id,通过FileSystemResource构造静态资源,然后调用addInline方法将资源加入到邮件对象中,
在调用MimeMessageHelper中的setText方法时,第二个参数表示邮件正文是html格式的,该参数不传默认为false。

接下来在测试类中添加如下方法进行测试:

    @Test
    public void sendMailWithImg(){
        mailService.sendMailWithImg("**@qq.com",
                "**@163.com",
                "测试邮件主题(图片)",
                "    <div>hello,这是一封带图片资源的邮件<br>\n" +
                        "        这是图片1:<div><img src='cid:p01'></div>\n" +
                        "        这是图片2:<div><img src='cid:p02'></div>\n" +
                        "    </div>",
                new String[]{"C:\\Users\\yulu\\Desktop\\temporary\\images\\index.jpg","C:\\Users\\yulu\\Desktop\\temporary\\images\\tx.jpg"},
                new String[]{"p01","p02"});
    }
5. 使用FreeMarker构建邮件模板

对于各式复杂的邮件,如果采用字符串进行HTML拼接,不但容易出错,而且不易于维护,使用HTML模板可以很好地解决这一问题。
使用FreeMarker构建邮件模板,首先加入FreeMarker依赖,代码如下:

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

然后在MailService中添加如下方法:

    /**
     * 使用FreeMarker构建邮件模板
     * @param from
     * @param to
     * @param subject
     * @param content
     */
    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目录下创建ftl目录作为模板存放位置,在该目录下创建mailtemplate.ftl作为邮件模板,内容如下:

<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://wwww.baidu.com">核对无误请点击本链接激活邮箱</a>
</div>

当然在创建一个User实体类,代码如下:

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

}

最后在单元测试类中添加如下方法进行测试:

    @Test
    public void sendHtmlMail(){
        try {
            Configuration configuration = new Configuration(Configuration.VERSION_2_3_0);
            ClassLoader loader = Chapter131Application.class.getClassLoader();
            configuration.setClassLoaderForTemplateLoading(loader,"ftl");
            Template template = configuration.getTemplate("mailtemplate.ftl");
            StringWriter mail = new StringWriter();
            User user = new User();
            user.setUsername("yulu");
            user.setGender("男");
            template.process(user,mail);
            mailService.sendHtmlMail("**@qq.com","**@163.com","测试邮件主题",mail.toString());
        } catch (IOException | TemplateException e) {
            e.printStackTrace();
        }
    }

首先,配置FreeMarker模板位置,配置模板文件,然后结合user对象渲染模板,将渲染结果发送出去,执行该方法,邮件发送结果如下:
在这里插入图片描述

6. 使用Thymeleaf构建邮件模板

既然可以使用FreeMarker构建邮件模板,当然也可以用Thymeleaf构建邮件模板,使用Thymeleaf构建邮件模板相对来说更加方便。
使用Thymeleaf构建邮件模板,首先添加Thymeleaf依赖,代码如下:

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

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

<!DOCTYPE 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://wwww.baidu.com">核对无误请点击本链接激活邮箱</a>
</div>
</body>
</html>

然后在单元测试类中添加如下代码进行测试:

    @Autowired
    ISpringTemplateEngine templateEngine;
    @Test
    public void sendHtmlMailThymeleaf(){
        Context context = new Context();

        context.setVariable("username","yulu");
        context.setVariable("gender","男");
        String mail = templateEngine.process("mailtemplate.html", context);
        mailService.sendHtmlMail("**@qq.com", "**@163.com", "测试邮件主题", mail.toString());

    }

不同于FreeMarker,Thymeleaf提供了ISpringTemplateEngine,来对模板进行渲染,通过Context构造模板中变量所需要的值,这种方式比FreeMarker构建邮件模板更加方便。

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值