admin管理员组

文章数量:1634824

分析

工作中难免会用到邮箱服务,这里整理了五种邮件发送模式:发送文本邮件,发送HTML邮件,发送附件邮件,发送内联资源邮件,发送模板邮件。以供大家学习参考。最后实战部分模拟邮箱注册含源码。

看一下图(有图有真相)

提前准备

pom.xml 配置

<!-- 添加spring-boot-starter-mail包引用 -->
<dependencies>
    <dependency> 
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-mail</artifactId>
    </dependency> 
</dependencies>

application.properties中添加邮箱配置

#邮箱服务器地址
spring.mail.protocol=smtp
spring.mail.host=smtp.qq
#邮箱服务器地址
spring.mail.username=************@qq
#邮箱密码
spring.mail.password=***********
spring.mail.default-encoding=UTF-8
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true

注意:若是QQ spring.mail.password=QQ授权码,需要开启QQ授权码

发送简单文本邮件

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

    @Autowired
    private JavaMailSender javaMailSender;

    @Autowired
    private TemplateEngine templateEngine;

    //读取配置文件中的参数
    @Value("${spring.mail.username}")
    private String sender;

    private static final String recipient = "*************@163" ;

    /**
     * 发送简单文本邮件
     */
    @Test
    public void sendSimpleEmail() {
        SimpleMailMessage message = new SimpleMailMessage();
        // 发送者
        message.setFrom(sender);
        // 接收者
        message.setTo(recipient);
        //邮件主题
        message.setSubject("主题:文本邮件");
        // 邮件内容
        message.setText("骚扰邮件勿回");
        javaMailSender.send(message);
    }
}

发送HTML邮件

新增发送HTML邮件测试方法

/**
     * 发送Html邮件
     */
    @Test
    public void sendHtmlEmail() {
        MimeMessage message = javaMailSender.createMimeMessage();
        try {
            MimeMessageHelper helper = new MimeMessageHelper(message, true);
            helper.setFrom(sender);
            helper.setTo(recipient);
            helper.setSubject("主题:HTML邮件");
            StringBuffer sb = new StringBuffer();
            sb.append("<h1>大标题-h1</h1>")
                    .append("<p style='color:#F00'>红色字</p>")
                    .append("<p style='text-align:right'>右对齐</p>");
            helper.setText(sb.toString(), true);
        } catch (MessagingException e) {
            throw new RuntimeException("Messaging  Exception !", e);
        }
        javaMailSender.send(message);
    }

发送内联资源邮件

新增发送内联资源邮件测试方法

/**
     * 发送内联资源邮件
     */
    @Test
    public void sendInlineResourceMail() {
        MimeMessage message = javaMailSender.createMimeMessage();
        try {
            MimeMessageHelper helper = new MimeMessageHelper(message, true);
            helper.setFrom(sender);
            helper.setTo(recipient);
            helper.setSubject("主题:这是有图片的邮件");
            String imgId = "avatar";
            String content="<html><body>宫崎骏电影图片:<img src=\'cid:" + imgId + "\' ></body></html>";
            helper.setText(content, true) ;
            FileSystemResource res = new FileSystemResource(new File("src/main/resources/static/images/avatar.jpg"));
            helper.addInline(imgId, res);
        } catch (MessagingException e) {
            throw new RuntimeException("Messaging  Exception !", e);
        }
        javaMailSender.send(message);
    }

发送模板邮件 重点

pom中导入thymeleaf的包

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

新增模板emailTemplate.html

<!DOCTYPE html>
<html lang="zh" xmlns:th="http://www.thymeleaf">
    <head>
        <meta charset="UTF-8"/>
        <title>Javazhan验证邮件</title>
    </head>
    <body>
        您好,这是验证邮件,请点击下面的链接完成验证,
        <a href="#" th:href="@{ http://www.javazhan/user/activation/{id}(id=${id}) }">激活账号</a></body>
</html>

新增发送模板邮件测试方法

    /**
     * 发送模板邮件
     */
    @Test
    public void sendTemplateMail() {
        MimeMessage message = javaMailSender.createMimeMessage();
        try {
            MimeMessageHelper helper = new MimeMessageHelper(message, true);
            helper.setFrom(sender);
            helper.setTo(recipient);
            helper.setSubject("主题:模板邮件");

            Context context = new Context();
            context.setVariable("id", "wenter");
            String emailContent = templateEngine.process("emailTemplate", context);
            helper.setText(emailContent, true);
        } catch (MessagingException e) {
            throw new RuntimeException("Messaging  Exception !", e);
        }
        javaMailSender.send(message);
    }

注:很多时候邮采用异步的方式来发送邮件,加快主交易执行速度,在实际项目中可以采用MQ发送邮件相关参数,监听到消息队列之后启动发送邮件。

实战部分模拟邮箱注册
很多网站都支持邮箱注册,以下将实现邮箱注册
功能:支持登录,注册,激活,重置密码。

效果如图

注册成功

未激活登录

激活邮件 去激活

激活后,登录成功

重置密码

重置密码邮件

输入之前的密码登陆

输入重置密码登陆

错误邮箱提示

代码

引入架包,修改pom.xml

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </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-devtools</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
            <version>RELEASE</version>
        </dependency>
        <!-- 模板引擎 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-mail</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- https://mvnrepository/artifact/com.google.code.gson/gson -->
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.8.2</version>

新建实体类User.java与RequestData.java
略了(看代码)

导入静态资源
css/js/….

编写js

$("#js-btn").click(function() {
    var data = {} ;
    var name = $("#js-btn").attr('class') ;
    var url = "" ;
    if(name.indexOf("rtn")>0) {
        data.userEmail = $("#js-field__email").val() ;
        data.userPass = $("#js-field__pass").val() ;
        url = "/user/login" ;
    } else if(name.indexOf("new")>0) {
        data.userEmail = $("#js-field__email").val() ;
        data.userPass = $("#js-field__pass").val() ;
        data.userRepass = $("#js-field__r-pass").val() ;
        url = "/user/register" ;
    } else if(name.indexOf("rst")>0) {
        data.userEmail = $("#js-field__email").val() ;
        url = "/user/forget" ;
    }
    submit(data, url) ;
});

function submit(data,url) {
    $.ajax({
        cache: !1,
        type: "POST",
        url: url,
        data: data,
        async: !0,
        beforeSend: function () {
            $("#js-btn").html("提交中..."), $("#js-btn").attr("disabled", "disabled")
        },
        success: function (data) {
            var result  = jQuery.parseJSON(data);
            layer.alert(result.message);
        },
        complete: function () {
            $("#js-btn").html("success"), $("#js-btn").removeAttr("disabled")
        }
    })
}

编写controler

/**
 * Created by yando on 2017/11/22.
 */
@RestController
@RequestMapping(value = "user")
public class UserController {

    @Autowired
    private JavaMailSender javaMailSender;

    @Autowired
    private TemplateEngine templateEngine;

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

    private RequestData requestData = new RequestData() ;

    public static Map<String, User> map = new HashMap<String, User>();

    @RequestMapping(value = "login", method = RequestMethod.POST)
    public String login(User user) {
        for(User u : map.values()) {
            if(u!=null && u.getUserPass().equals(user.getUserPass()) && u.getUserEmail().equals(user.getUserEmail())) {
                if(u.getState()==0) {
                    requestData.setCode("9999");
                    requestData.setState("500");
                    requestData.setMessage("请前往"+user.getUserEmail()+"邮箱激活");
                    return new Gson().toJson(requestData);
                }
                requestData.setMessage("登录成功");
                return new Gson().toJson(requestData);
            }
        }
        requestData.setCode("9999");
        requestData.setState("500");
        requestData.setMessage("邮箱或者密码错误");
        return new Gson().toJson(requestData);

    }

    @RequestMapping(value = "register", method = RequestMethod.POST)
    public String register(User user) {
        map.put(user.getUserId(), user);
        // 发送注册邮件
        sendTemplateMail(user.getUserEmail(), user.getUserId());
        requestData.setMessage("注册成功, 快去激活");
        return new Gson().toJson(requestData);
    }
    @RequestMapping(value = "forget", method = RequestMethod.POST)
    public String forget(User user) {
        for(User u : map.values()) {
            if(u!=null || u.getUserEmail()== user.getUserEmail()) {
                u.setUserPass("6666");
                map.remove(u.getUserId());
                map.put(u.getUserId(), u);
                requestData.setMessage("密码已经重置,快去查看你的邮箱");
                sendSimpleEmail(u.getUserEmail(), "您好,您密码已重置,初始密码:6666,为了你的安全请尽快修改密码。");
                return new Gson().toJson(requestData);
            }
        }
        requestData.setCode("9999");
        requestData.setState("500");
        requestData.setMessage("无效邮箱");
        return new Gson().toJson(requestData);
    }
    @RequestMapping(value = "activation/{userId}", method = RequestMethod.GET)
    public void activation(@PathVariable String userId, HttpServletResponse response) throws IOException {
        User user = map.get(userId);
        if(user!=null) {
            user.setState(1);
            map.remove(user.getUserId());
            map.put(user.getUserId(), user);
        }
        response.sendRedirect("../../login.html");
    }

    public void sendSimpleEmail(String recipient,String text) {
        SimpleMailMessage message = new SimpleMailMessage();
        // 发送者
        message.setFrom(sender);
        // 接收者
        message.setTo(recipient);
        //邮件主题
        message.setSubject("Java资源分享网密码重置邮件");
        // 邮件内容
        message.setText(text);
        javaMailSender.send(message);
    }

    public void sendTemplateMail(String recipient,String userId) {
        MimeMessage message = javaMailSender.createMimeMessage();
        try {
            MimeMessageHelper helper = new MimeMessageHelper(message, true);
            helper.setFrom(sender);
            helper.setTo(recipient);
            helper.setSubject("Java资源分享网验证邮件");
            Context context = new Context();
            context.setVariable("id", userId);
            String emailContent = templateEngine.process("emailTemplate", context);
            helper.setText(emailContent, true);
        } catch (MessagingException e) {
            throw new RuntimeException("Messaging  Exception !", e);
        }
        javaMailSender.send(message);
    }

}

结束了

执行RunApplication.java,看效果吧。

请测试邮件用自己的 不要给博主造成不必要的影响 谢谢

源码下载

SpringBoot进阶邮件服务(实战模拟邮箱注册含源码)

版权声明:本文为博主原创文章,未经博主允许不得转载。转载请注明出处:http://blog.csdn/wenteryan

本文标签: 进阶实战源码邮箱邮件