当前位置 主页 > 网站技术 > 代码类 > 最大化 缩小

    Spring boot搭建邮件服务的完整步骤

    栏目:代码类 时间:2019-09-13 13:14

    前言:

    发送邮件,肯定是每个公司都会有的基本业务。很多公司都会选择把发送邮件作为一个基础服务,对外提供接口。直接调用就可发邮件了。但是我们都知道发送邮件耗时都比较长。那么今天就介绍下使用Spring boot+eventbus来打造一个简单邮件服务

    规划接口列表

    发送邮件的类型准备的有三种

    发送普通邮件 发送html邮件 发送图文邮件

    还有一个细节,如果我们同步的取发送邮件会有两个问题。

    接口响应时间比较长 遇到并发的情况,容易导致服务器压力过大或者邮箱服务封ip

    所以我们准备使用队列来执行发送邮件的操作。可以解决这个问题。队列我选用的是Google的eventbus。是一款很轻量的队列。直接走的内存

    准备工作

    首先要在pom.xml中引入 需要使用的包

     <dependency>   <groupId>org.springframework.boot</groupId>   <artifactId>spring-boot-starter-mail</artifactId> </dependency> <dependency>   <groupId>com.google.guava</groupId>   <artifactId>guava</artifactId>   <version>23.0</version>  </dependency>  <dependency>   <groupId>org.projectlombok</groupId>   <artifactId>lombok</artifactId>  </dependency>
    spring-boot-starter-mail :spring-boot提供的发邮件的maven库 guava:google提供的开源库。里面包含来很多工具 lombok:可以帮你省去编写实体类的工具

    引入之后,我们还需要配置发送邮件所需要的必要配置

    在application.properties中配置邮箱

    spring.mail.host=smtp.mail.me.com //邮箱发送服务器spring.mail.port=587//服务器端口spring.mail.username=xxx6666@icloud.com//发件人邮箱spring.mail.password=password//客户端专用密码//如果和我一样使用的icloud邮箱 还需要下列两个配置,别的有的邮箱不需要spring.mail.properties.mail.smtp.starttls.enable=truespring.mail.properties.mail.smtp.starttls.required=true

    做到这里其实就已经完成了,发邮件所需要的配置了。但是我们是要用队列来发送,所以还需要配置下队列

    @Configurationpublic class AsyncEventBusConfig { //实例化bean,采用单例形式注入容器 @Bean @Scope("singleton") public AsyncEventBus asyncEventBus(){  //创建线程池对象  final ThreadPoolExecutor executor=executor();  return new AsyncEventBus(executor); } //创建线程池方法 private ThreadPoolExecutor executor(){  return new    ThreadPoolExecutor(2,    2,0L,    TimeUnit.MICROSECONDS,    new LinkedBlockingQueue<>()); }}

    封装EmailService

    准备好了之后,就可以直接来封装发送邮件的业务了。之前有提到我们需要三个接口,同样的,我们也需要三个service方法

    @Servicepublic class EmailService { @Autowired private JavaMailSender javaMailSender; /**  * 发件人。这里发件人一般是同使用的发件邮箱一致  */ @Value("${spring.mail.username}") private String from; /**  * 发送文本邮件  * @param to 收件人邮箱地址  * @param subject 主题  * @param content 内容  */ public void sendTextMail(String to,        String subject,        String content) {  SimpleMailMessage simpleMailMessage = new SimpleMailMessage();  simpleMailMessage.setTo(to);  simpleMailMessage.setSubject(subject);  simpleMailMessage.setText(content);  simpleMailMessage.setFrom(from);  javaMailSender.send(simpleMailMessage); } /**  * 发送html内容的邮件  * @param to 收件人  * @param htmlContent html内容  * @param subject 主题  * @throws MessagingException  */ public void sendHtmlMail(String to,        String htmlContent,        String subject) throws MessagingException {  MimeMessage message = javaMailSender.createMimeMessage();  MimeMessageHelper messageHelper = new MimeMessageHelper(message, true);  messageHelper.setTo(to);  messageHelper.setSubject(subject);  messageHelper.setFrom(from);  messageHelper.setText(htmlContent, true);  javaMailSender.send(message); } /**  * 发送图文邮件  * @param to 收件人  * @param imgContent 图文内容  * @param subject 主题  * @param rscId 资源id  * @param imgPath 资源路径  * @throws MessagingException  */ public void sendImgMail(String to,       String imgContent,       String subject,       String rscId,       String imgPath) throws MessagingException {  MimeMessage message = javaMailSender.createMimeMessage();  MimeMessageHelper messageHelper = new MimeMessageHelper(message, true);  messageHelper.setTo(to);  messageHelper.setSubject(subject);  messageHelper.setFrom(from);  messageHelper.setText(imgContent, true);  messageHelper.addInline(rscId, new File(imgPath));  javaMailSender.send(message); }}