课程表

Spring Boot课程

工具箱
速查手册

Boot 邮件服务

当前位置:免费教程 » Java相关 » Spring Boot

发送邮件是网站的必备功能之一,什么注册验证,忘记密码或者是给用户发送推送信息。早期Java应用使用 JavaMail 相关 api 来写发送邮件的相关代码,后来 Spring 推出了 JavaMailSender 更加简化了邮件发送的过程,在之后 Spring Boot 对此进行了封装就有了现在的 spring-boot-starter-mail ,本章文章的介绍主要来自于此包。


一、简单使用

1、Pom.xml配置

Pom.xml 中 <dependencies> 和 </dependencies> 之间,添加如下依赖代码:

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

2、添加application配置

如果使用的是 application.properties,则添加如下配置:

spring.mail.host=smtp.126.com //邮箱服务器地址,此处为126真实的SMTP服务器地址,请确保你发送邮件的主体账号开通了smtp服务
spring.mail.username=xxxxx //发送邮件的主体账号用户名
spring.mail.password=xxyyooo    //发送邮件的主体账号密码
spring.mail.default-encoding=UTF-8

mail.fromMail.addr=xxxxx@126.com  //以谁来发送邮件,一般默认为账号名+邮局域名

这里的邮箱服务器地址,需要去各个提供Email服务的网站查看,一般在“设置”里面。

相应的,如果用的是 application.yml,则在spring根节点下面加上如下配置:

mail:
  host: smtp.126.com #邮箱服务器地址,此处为126真实的SMTP服务器地址,请确保你发送邮件的主体账号开通了smtp服务
  username: xxxxx #发送邮件的主体账号用户名
  password: xxyyooo    #发送邮件的主体账号密码
  default-encoding: UTF-8

新建mail根节点:

mail:
  fromMail:
    addr: xxxxx@oo.com  #以谁来发送邮件,一般默认为账号名+邮局域名

3、编写service层

在主程序的service文件夹,新建一个邮件类接口 MailService接口 ,完整代码如下:

package com.w3xue.jiaocheng.service;

public interface MailService {
    public String sendSimpleMail(String to, String title, String content);

}

这里只预定义了一个方法sendSimpleMail。下面,我们在service文件夹,再新建一个邮件接口实现类 MailServiceImpl类 ,完整代码如下:

package com.w3xue.jiaocheng.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.stereotype.Component;

@Component
public class MailServiceImpl implements MailService{

    @Autowired
    private JavaMailSender mailSender;

    @Value("${mail.fromMail.addr}")
    private String from;

    @Override
    public String sendSimpleMail(String to, String title, String content) {
        SimpleMailMessage message = new SimpleMailMessage();
        message.setFrom(from);
        message.setTo(to);
        message.setSubject(title);
        message.setText(content);

        try {
            mailSender.send(message);
            return "简单邮件已经发送。";
        } catch (Exception e) {
            return "发送简单邮件时发生异常!";
        }

    }
}

4、应用到Controller层

下面,我们在Controller层中,使用刚才定义的方法。在 MainRestController类 中,先自动装配一个MailServiceImpl类

@Autowired
private MailServiceImpl mailServiceImpl;

然后,再定义一个方法和路由进行使用:

//发送简要邮件
@RequestMapping(value = "/email1")
public String email1() {
    return mailServiceImpl.sendSimpleMail("xxxxx@qq.com","test simple mail","hello this is simple mail");
}

我们在浏览器中,访问“http://localhost:8080/jiaocheng/email1”,如果一切顺利,就会显示如下文字:

简单邮件已经发送。

然后,我们打开xxxxx@qq.com邮箱,就会发现,收到了一封邮件,标题为“test simple mail”,内容为“hello this is simple mail”。至此,我们的第一封邮件发送成功!


二、发送富文本邮件

在上一节中,我们已经成功发送了一封简单的邮件。但是,它只有文本,没有任何形式的图片、链接、附件等等。毫无疑问,我们需要这些富文本形式丰富我们的邮件的功能和样式。

1、发送HTML格式邮件

在上一节配置的基础上,我们在 MailService 添加 sendHtmlMail 方法:

public String sendHtmlMail(String to, String title, String content);

相应的,我们在MailServiceImpl类 详细定义这个方法:

@Override
public String sendHtmlMail(String to, String subject, String content) {
    MimeMessage message = mailSender.createMimeMessage();
    try {
        //true表示需要创建一个multipart message
        MimeMessageHelper helper = new MimeMessageHelper(message, true);
        helper.setFrom(from);
        helper.setTo(to);
        helper.setSubject(subject);
        helper.setText(content, true);

        mailSender.send(message);
        return "html邮件发送成功";
    } catch (MessagingException e) {
        return "发送html邮件时发生异常!";
    }
}

我们要相应的引入某些包:

import org.springframework.mail.javamail.MimeMessageHelper;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;

最后,我们在在 MainRestController类 中定义一个方法和路由进行使用刚才定义的方法:

//发送HTML邮件
@RequestMapping(value = "/email2")
public String email2() {
    String content="<html>\n" +
            "<body>\n" +
            "    <h3>hello world ! 这是一封Html邮件!</h3>\n" +
            "</body>\n" +
            "</html>";
    return mailServiceImpl.sendHtmlMail("xxxxx@qq.com","test html mail",content);
}

我们在浏览器中,访问“http://localhost:8080/jiaocheng/email2”,如果一切顺利,就会显示如下文字:

html邮件发送成功

然后,我们打开xxxxx@qq.com邮箱,就会发现,收到了一封邮件,标题为“test html mail”,内容为:

hello world ! 这是一封Html邮件!

至此,我们的第一封邮件发送成功!

2、发送带附件的邮件

首先,我们在 MailService 添加 sendAttachmentsMail 方法:

public String sendAttachmentsMail(String to, String subject, String content, String filePath);

相应的,我们在MailServiceImpl类 详细定义这个方法:

@Override
public String sendAttachmentsMail(String to, String subject, String content, String filePath){
    MimeMessage message = mailSender.createMimeMessage();
    try {
        MimeMessageHelper helper = new MimeMessageHelper(message, true);
        helper.setFrom(from);
        helper.setTo(to);
        helper.setSubject(subject);
        helper.setText(content, true);

        FileSystemResource file = new FileSystemResource(new File(filePath));
        String fileName = filePath.substring(filePath.lastIndexOf(File.separator));
        helper.addAttachment(fileName, file);

        mailSender.send(message);
        return "带附件的邮件已经发送。";
    } catch (MessagingException e) {
        return "发送带附件的邮件时发生异常!";
    }
}

添加多个附件可以使用多条 helper.addAttachment(fileName2, file2)...以此类推。

当然,我们需要在MailServiceImpl类中引入如下依赖包:

import org.springframework.core.io.FileSystemResource;
import java.io.File;

最后,我们在 MainRestController类 中定义一个方法和路由进行使用刚才定义的方法:

//发送带附件的邮件
@RequestMapping(value = "/email3")
public String email3() {
    String filePath="H:\\图片\\eagle.jpg";
    return mailServiceImpl.sendAttachmentsMail("xxxxx@qq.com", "主题:带附件的邮件", "有附件,请查收!", filePath);
}

我们在浏览器中,访问“http://localhost:8080/jiaocheng/email3”,如果一切顺利,就会显示如下文字:

带附件的邮件已经发送。

然后,我们打开xxxxx@qq.com邮箱,就会发现,收到了一封邮件,标题为“主题:带附件的邮件”,内容为:"有附件,请查收!",而且还带了一个图片附件:

eagle.jpg

3、发送带静态资源的邮件

邮件中的静态资源一般就是指图片,首先,我们在 MailService接口 添加 sendAttachmentsMail 方法:

public String sendInlineResourceMail(String to, String subject, String content, String rscPath, String rscId);

然后,我们相应的,MailServiceImpl类 详细定义这个方法:

@Override
public String sendInlineResourceMail(String to, String subject, String content, String rscPath, String rscId){
    MimeMessage message = mailSender.createMimeMessage();
    try {
        MimeMessageHelper helper = new MimeMessageHelper(message, true);
        helper.setFrom(from);
        helper.setTo(to);
        helper.setSubject(subject);
        helper.setText(content, true);

        FileSystemResource res = new FileSystemResource(new File(rscPath));
        helper.addInline(rscId, res);

        mailSender.send(message);
        return  "嵌入静态资源的邮件已经发送。";
    } catch (MessagingException e) {
        return  "发送嵌入静态资源的邮件时发生异常!";
    }
}

同发送附件邮件一样,我们可以添加多个图片可以使用多条 <img src='cid:" + rscId + "' > 和 helper.addInline(rscId, res) 来实现。

然后,我们在 MainRestController类 中定义一个方法和路由进行使用刚才定义的方法:

//发送带附件的邮件
@RequestMapping(value = "/email4")
public String email4() {
    String rscId = "neo006";
    String content="<html><body>这是有图片的邮件:<img src=\'cid:" + rscId + "\' ></body></html>";
    String imgPath = "H:\\图片【\\eagle.jpg";
    return mailServiceImpl.sendInlineResourceMail("xxxxx@qq.com", "主题:这是有图片的邮件", content, imgPath, rscId);
}

我们在浏览器中,访问“http://localhost:8080/jiaocheng/email4”,如果一切顺利,就会显示如下文字:

嵌入静态资源的邮件已经发送。

然后,我们打开xxxxx@qq.com邮箱,就会发现,收到了一封邮件,标题为“主题:这是有图片的邮件”,内容为:"这是有图片的邮件:"+雕的图片,刚才的雕的图片是嵌入的,而不是作为附件形式。

学习了以上3种方式发送邮件后,市面上支持的邮件功能基本都已经实现。


三、其他问题

如果学会了上面这些,我们基本已经可以正常发送邮件了。但是,还有些问题,需要我们做好思想准备。

1、发送失败

因为各种原因,总会有邮件发送失败的情况,比如:邮件发送过于频繁、网络异常等。在出现这种情况的时候,我们一般会考虑重新重试发送邮件,会分为以下几个步骤来实现:

(1)接收到发送邮件请求,首先记录请求并且入库。

(2)调用邮件发送接口发送邮件,并且将发送结果记录入库。

(3)启动定时系统扫描时间段内,未发送成功并且重试次数小于3次的邮件,进行再次发送

2、异步发送

很多时候邮件发送并不是我们主业务必须关注的结果,比如通知类、提醒类的业务可以允许延时或者失败。这个时候可以采用异步的方式来发送邮件,加快主交易执行速度,在实际项目中可以采用RabbitMQ发送邮件相关参数,监听到消息队列之后启动发送邮件,此处不再详述。

参考自:https://www.cnblogs.com/ityouknow/p/6823356.html

转载本站内容时,请务必注明来自W3xue,违者必究。
 友情链接: NPS  问卷模板