欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

SpringBoot 之集成邮件服务.

程序员文章站 2022-04-26 12:43:34
一、前言 Spring Email 抽象的核心是 MailSender 接口,MailSender 的实现能够把 Email 发送给邮件服务器,由邮件服务器实现邮件发送的功能。 Spring 自带了一个 MailSender 的实现 JavaMailSenderImpl,它会使用 JavaMail ......

一、前言

    spring email 抽象的核心是 mailsender 接口,mailsender 的实现能够把 email 发送给邮件服务器,由邮件服务器实现邮件发送的功能。

SpringBoot 之集成邮件服务.

    spring 自带了一个 mailsender 的实现 javamailsenderimpl,它会使用 javamail api 来发送 email。spring 或 springboot 应用在发送 email 之前,我们必须要 javamailsenderimpl 装配为 spring应用上下文的一个 bean。

二、配置

    1、pom.xml 

<dependency>
     <groupid>org.springframework.boot</groupid>
     <artifactid>spring-boot-starter-mail</artifactid>
</dependency>

    2、application.yml

spring:
  mail:
    host: smtp.163.com
    port: 25
    username: 159****2662@163.com
    password: ***********

    host 属性默认是 javamail 会话的主机;port 端口默认监听标准的 smtp 端口25;如果邮件服务器需要认证的,还需要设置 userrname 和 password。

    这里我用的是 163 的邮件服务器,需要在 163 邮箱中开启客户端授权密码,否则会报 550 认证错误。

    SpringBoot 之集成邮件服务.

    3、emailconfig.java

    在这里,我们把 javamailsenderimpl 装配为 spring 应用上下文的一个 bean。同时需要注意的是,这里使用了@configurationproperties 注解,该注解需要属性有 setter 方法并在启动类中使用 @enableconfigurationproperties 注解使之生效。

@configuration
@configurationproperties(prefix = "spring.mail")
public class emailconfig {

    private string host;
    private integer port;
    private string username;
    private string password;

    @bean
    public mailsender javamailsender() {
        javamailsenderimpl javamailsender = new javamailsenderimpl();
        javamailsender.sethost(host);
        javamailsender.setport(port);
        javamailsender.setusername(username);
        javamailsender.setpassword(password);
        return javamailsender;
    }

    public void sethost(string host) {
        this.host = host;
    }
    public void setport(integer port) {
        this.port = port;
    }
    public void setusername(string username) {
        this.username = username;
    }
    public void setpassword(string password) {
        this.password = password;
    }
}

三、发送

    有了 javamailsender,那么邮件发送就是一件再简单不过的事情了。我们只需要将 javamailsender 的 bean 注入到我们自己的实现类中,然后使用 javamail api 来发送 email。

    1、文本邮件发送

public void sendsimpleemail() {
    // 构造email消息
    simplemailmessage message = new simplemailmessage();
    message.setfrom("159****2662@163.com");
    message.setto("****@qianxx.com");
    message.setsubject("邮件主题");
    message.settext("邮件内容");
    javamailsender.send(message);
}

    纯文本的 email 在于构造 simplemailmessage 实例,这个对象可以很便捷地发送email消息。

    2、附件邮件发送

    spring 的 email 功能并不局限于纯文本的 email。我们还可以添加附件。如果要发送带有附件的 email,关键技巧是创建 multipart 类型的消息 ———— email由多个部分组成,其中一部分是 email 体,其他部分是附件。为了发送 multipart 类型的 email,你需要创建一个mime(multipurpose internet mail extensions)的消息。

public void mimeemail() throws messagingexception {
    // mimemessage 本身的 api 有些笨重,我们可以使用 mimemessagehelper
    mimemessage mimemessage = javamailsender.createmimemessage();
    // 第二个参数是 true ,表明这个消息是 multipart类型的/
    mimemessagehelper mimemessagehelper = new mimemessagehelper(mimemessage, true);
    mimemessagehelper.setfrom("159****2662@163.com");
    mimemessagehelper.setto("****@qianxx.com");
    mimemessagehelper.setsubject("附件邮件主题");
    mimemessagehelper.settext("附件邮件内容");
    //添加附件,第一个参数表示添加到 email 中附件的名称,第二个参数是图片资源
    mimemessagehelper.addattachment("boot.png", new classpathresource("public/images/boot.png"));
    javamailsender.send(mimemessage);
}

    3、富文本邮件发送

     spring 的 email 功能除了可以添加附件外,甚至可以使用 html 来美化消息体的内容。发送富文本的 email 与发送简单文本的 email 并没有太大区别,关键是将settext() 方法的消息文本设置为 html,并将第二个参数设置为 true,表示这是 html 的富文本。

public void htmlemail() throws messagingexception {
    mimemessage mimemessage = javamailsender.createmimemessage();
    mimemessagehelper mimemessagehelper = new mimemessagehelper(mimemessage, true);
    mimemessagehelper.setfrom("159****2662@163.com");
    mimemessagehelper.setto("****@qianxx.com");
    mimemessagehelper.setsubject("富文本邮件主题");
    string html = "<html><body><h4>hello,springboot</h4><img src='cid:boot' /></body></html>";
    mimemessagehelper.settext(html, true);
    // 设置内嵌元素 cid,第一个参数表示内联图片的标识符,第二个参数标识资源引用
    mimemessagehelper.addinline("boot", new classpathresource("public/images/boot.png"));
    javamailsender.send(mimemessage);
}

四、结语

    html 标签的字符串拼接是一件很棘手的事。因为在你的大脑中解析html标签并想象它在渲染时会是什么样子是挺困难的。而将html混合在java代码中又会使得这个问题更加复杂。

    因此 spring 给出的解决方案是 使用模板生成email,有多种模板方案可供选择,包括apache velocity和thymeleaf。(由于对这两个模板语法不是很擅长,就不多做介绍了)。

 

演示源代码:https://github.com/jmcuixy/boot