专栏首页用户6517667的专栏走进Java接口测试之使用JavaMailSender发送邮件

走进Java接口测试之使用JavaMailSender发送邮件

来源: 7DGroup

作/译者:左泽位

引言

一般我们在做接口自动化时,都会通过钉钉或者邮件的方式通知测试结果信息。而且基本上邮件的内容都是测试报告。所以,今天就来讲讲如何利用 pring提供的 JavaMailSender接口,实现邮件发送功能。

背景

讲解前,我们先来简单了解下相关邮件知识。最早期的时候我们会使用 JavaMail相关 api来写发送邮件的相关代码,后来spring推出了 JavaMailSender更加简化了邮件发送的过程,在之后 springboot对此进行了封装就有了现在的 spring-boot-starter-mail,本文的介绍主要来自于此包。

JavaMail介绍

JavaMail是由 Sun定义的一套收发电子邮件的 API,不同的厂商可以提供自己的实现类。但它并没有包含在 JDK中,而是作为 JavaEE的一部分。而 JavaMailSender底层也是基于 JavaMailjar包的。

邮件通信协议

  • SMTP:简单邮件传输协议,用于发送电子邮件的传输协议;
  • POP3:用于接收电子邮件的标准协议;
  • IMAP:互联网消息协议,是POP3的替代协议。

这三种协议都有对应 SSL加密传输的协议,分别是 SMTPS, POP3S和 IMAPS。除 JavaMail服务提供程序之外, JavaMail还需要 JAF( JavaBeansActivationFramework)来处理不是纯文本的邮件内容,这包括 MIME(多用途互联网邮件扩展)、 URL页面和文件附件等内容

JavaMail关键对象

  • Properties:属性对象。针对不同的的邮件协议, JavaMail规定了服务提供者必须支持一系列属性。
  • Session会话对象 这个不要混淆了,和 web中的 session不一样的,简单来说,它就是配置的集合。 Session的主要作用包括两个方面:
    • 接收各种配置属性信息:通过 Properties对象设置的属性信息;
    • 初始化 JavaMail环境:根据 JavaMail的配置文件,初始化 JavaMail环境,以便通过 Session对象创建其他重要类的实例。
  • Transport和 Store:传输和存储邮件操作只有发送或接收两种处理方式,JavaMail将这两种不同操作描述为传输( javax.mail.Transport)和存储( javax.mail.Store),传输对应邮件的发送,而存储对应邮件的接收。
  • Message:消息对象一旦获得 Session对象,就可以继续创建要发送的消息。Message是个抽象类,常用的实现类为: javax.mail.internet.MimeMessage
  • Address:地址创建了 Session和 Message,并将内容填入消息后,就可以用 Address确定信件地址了。 Address也是个抽象类。对应常用实现类: javax.mail.internet.InternetAddress。

Spring封装后,使用起来基本上都不需要去关心这些对象值了,简单了解下即可。有兴趣,可以去官网查看:https://java.net/projects/javamail/pages/Home

SpringBoot集成

pom包配置

pom包里面添加包引用

邮箱配置

在 application.yml中添加邮箱配置

发送纯文本格式

编写mailService接口并实现

编写test类进行测试

查看收件箱

本发送就完成了。

发送html邮件

但是在正常接口测试的过程中,我们通常在邮件中加入附件完整HTML测试报告来通知测试结果,下面讲介绍如何使用 springboot来发送 html报告的邮件。

发送html格式邮件

其它都不变在 MailService添加 sendHtmlMail方法

编写test类进行测试

查看收件箱

发送带附件的邮件

在 MailService添加 sendAttachmentsMail方法

添加多个附件可以使用多条 helper.addAttachment(fileName,file)

编写test类进行测试

查看收件箱

发送带静态资源的邮件

邮件中的静态资源一般就是指图片,在 MailService添加 sendAttachmentsMail方法

测试类中添加test方法

查看收件箱

添加多个图片可以使用多条 <imgsrc='cid:" + rscId + "'> 和 helper.addInline(rscId,res) 来实现

发送模板邮件

我们希望收到这样的ExtentReports邮件

其中只有邮件这个报告内容在变化,其它邮件内容均不变,因此对于这类邮件需求,都建议做成邮件模板来处理。模板的本质很简单,就是在模板中替换变化的参数,转换为html字符串即可,这里以 thymeleaf为例来演示。

把emailable-report.html放到在 resorces/templates下(正式测试需要修改其生成目录)

解析 Html报告并发送

查看收件箱

发送失败

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

  • 接收到发送邮件请求,首先记录请求并且入库。
  • 调用邮件发送接口发送邮件,并且将发送结果记录入库。
  • 启动定时系统扫描时间段内,未发送成功并且重试次数小于3次的邮件,进行再次发送

本文代码:

https://github.com/7DGroup/Java-API-Test-Examples

星云测试

http://www.teststars.cc

奇林软件

http://www.kylinpet.com

联合通测

http://www.quicktesting.net

本文分享自微信公众号 - 软件测试培训(iTestTrain)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-12-28

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Java网络编程和NIO详解7:浅谈 Linux 中NIO Selector 的实现原理

    本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看

    Java技术江湖
  • Java网络编程和NIO详解5:Java 非阻塞 IO 和异步 IO

    本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看

    Java技术江湖
  • 面试官:解释一下Java字节码文件中的JVM指令

    Java 之所以流行,一个很重要的原因就是它的跨平台特性,Compile Once, Run Anywhere,编译一次,到处运行。即 Java 源码只需要编译...

    南风
  • Java 8,Jenkins,Jacoco和Sonar进行持续集成

    本文的范围是解释安装和设置必要工具的所有步骤,以使Java 8的CI服务器完全正常运行。请注意,该证明已在Windows 7的开发人员机器上完成,但很容易做到。...

    八音弦
  • 找寻gvcf失败的原因(java啊java,配置啊配置)

    因为我只想保留recal后的bam和,call出来的gvcf文件,但是发现有些样本根本就走不通这个流程,就需要debug了。

    生信技能树
  • TagLayout自定义流式布局

    这是一个继承ViewGourp来实现的自定义布局。他的核心只有一个,即当子View的宽度超出自身最大宽度时,自动换行。那么,我们先来看核心代码:

    饮水思源为名
  • 前后端分离,我怎么就选择了 Spring Boot + Vue 技术栈?

    前两天又有小伙伴私信松哥,问题还是职业规划,Java 技术栈路线这种,实际上对于这一类问题我经常不太敢回答,每个人的情况都不太一样,而小伙伴也很少详细介绍自己的...

    Java技术江湖
  • 用过XA分布式事务吗?

    下图说明了一个DTP系统的本地实例,其中AP调用TM来构造事务。这些框表示X/Open DTP模型中的软件组件。箭头指示控制流的方向。

    Criss@陈磊
  • 新手也能看懂的线程池学习总结

    线程池提供了一种限制和管理资源(包括执行一个任务)。每个线程池还维护一些基本统计信息,例如已完成任务的数量。

    范蠡
  • 深入理解JVM虚拟机5:虚拟机字节码执行引擎

    本文转自:https://www.cnblogs.com/snailclimb/p/9086337.html

    Java技术江湖

扫码关注云+社区

领取腾讯云代金券