(八)Java版接口自动化-邮件发送测试报告(java代码实现)
一、设置邮箱
1、以qq邮箱为例,登录qq邮箱账号,点击设置-账号-POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务
开启SMTP服务,生成授权码
根据提示生成授权码,后面的密码地方需要用到这个授权码
二、引入依赖包
javax.mail 1.4.7
三、实现发送邮件的代码
实现方式一、
package com.automation.interfacetest.util; import javax.activation.DataHandler; import javax.activation.FileDataSource; import javax.mail.Message; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.*; import java.io.File; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Properties; public class SendEmail { //服务器地址 private static final String host = "smtp.qq.com"; //传输协议 private static final String protocol = "smtp"; //发送人 private static final String from_username = "862119518@qq.com"; //密码(配置邮箱的授权码) private static final String from_password = "mxsitgnzpgksbdjd"; //收件人 private static final String recipient = "2443805696@qq.com"; //附件 private static final String attach = "D:\\github\\interface-test\\interfacetest\\interfacetest\\test-output\\index.html"; //html格式 private static final String htmlString = "接口自动化测试报告,详情请下载附件打开查看!"; //发送邮件 public static void sendEmail() { try { Session session = SendEmail.createSession(); Message message = SendEmail.createMessage(session); MimeMultipart multipart = new MimeMultipart(); //HTML格式 multipart.addBodyPart(SendEmail.createHtmlContent()); //发送附件 multipart.addBodyPart(SendEmail.createAttach()); //设置文件 message.setContent(multipart); //消息传输 Transport transport = session.getTransport(); //设置连接地址 transport.connect(host, from_username, from_password); //发送消息 message.getAllRecipients()获取邮件的所有收件人地址 transport.sendMessage(message, message.getAllRecipients()); //关闭连接 transport.close(); System.out.println("邮件发送成功!"); } catch (Exception e) { System.out.println("邮件发送失败!"); } } //创建邮件会话 public static Session createSession(){ //构建properties文件 Properties properties = new Properties(); //邮件协议 properties.setProperty("mail.transport.protocol",protocol); //服务器地址 properties.setProperty("mail.smtp.host",host); //身份认证 properties.put("mail.smtp.auth", "true"); // 设置是否使用ssl安全连接 ---一般都使用 properties.put("mail.smtp.ssl.enable", "true"); //创建邮件会话 Session session = Session.getInstance(properties); return session; } //构建邮件消息 public static Message createMessage(Session session) throws Exception{ MimeMessage message= new MimeMessage(session); Date now = new Date(); SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //设置主题 message.setSubject(formatter.format(now) + "测试报告"); //设置文本消息 message.setText("这是系统自动发送的接口自动化测试报告邮件!请你查收"); //设置发送地址 message.setFrom(new InternetAddress(from_username)); /** *设置收件人地址 * Message.RecipientType.BCC :The "Bcc" (blind carbon copy) recipients.(“密件抄送”接收者) * Message.RecipientType.CC :The "Cc" (carbon copy) recipients.“抄送”接收者 * Message.RecipientType.TO :The "To" (primary) recipients.“收件人”(主要)收件人。 */ message.setRecipients(Message.RecipientType.TO,recipient); return message; } //发送邮件正文内容为HTML格式 public static MimeBodyPart createHtmlContent() throws Exception{ MimeBodyPart bodyPart = new MimeBodyPart(); bodyPart.setContent(htmlString,"text/html;charset=UTF-8"); return bodyPart; } //发送单个附件内容 public static MimeBodyPart createAttach() throws Exception{ MimeBodyPart bodyPart = new MimeBodyPart(); /** * 实现一个封装文件的简单 DataSource 对象。它通过 FileTypeMap 对象提供数据分类服务 * FileTypeMap是一个抽象类,为文件提供数据键入接口 */ FileDataSource dataSource = new FileDataSource(new File(attach)); /** * 数据处理程序 * 创建引用指定 DataSource 的 DataHandler 实例。数据以字节流的形式存在。 * DataSource 将提供一个 InputStream 来访问数据 */ DataHandler dataHandler = new DataHandler(dataSource); //添加邮件主体中 bodyPart.setDataHandler(dataHandler); //设置附件名称,MimeUtility.encodeText可以处理乱码问题 bodyPart.setFileName(MimeUtility.encodeText(dataSource.getName())); return bodyPart; } //测试 public static void main(String[] args){ SendEmail.sendEmail(); } }
实现方式二、
package com.automation.interfacetest.util; import javax.activation.DataHandler; import javax.activation.DataSource; import javax.activation.FileDataSource; import javax.mail.Message; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.*; import java.io.File; import java.util.Date; import java.util.Properties; /** * @title: * @author: 2022/2/2414:28 * @date: 2022/2/2414:28 */ public class EmailUtils { static String title = "接口自动化测试报告";//邮件的标题 static String sendUser= "862119518@qq.com";//发送邮件的账号 static String password= "mxsitgnzpgksbdjd";//发送账号生成的授权码,不是邮箱登录密码 static String toPersion="2443805696@qq.com";//接收邮件的账号 //附件 private static final String attach = "D:\\github\\interface-test\\interfacetest\\interfacetest\\test-output\\index.html"; private static Properties comm(){ Properties p = new Properties(); //Properties p = System.getProperties(); p.put("mail.smtp.auth", "true"); p.put("mail.transport.protocol", "smtp"); p.put("mail.smtp.host", "smtp.qq.com"); p.put("mail.smtp.port", "25"); //p.setProperty("mail.smtp.localhost", "localhost"); return p; } /** * @title:发送文本内容 * @author: chaowen.li * @date: 2022/2/24 16:27 */ public static void sendText() { try { //建立会话 Session session = Session.getInstance(comm()); Message msg = new MimeMessage(session); //建立信息 msg.setFrom(new InternetAddress(sendUser)); //发件人 InternetAddress[] iaToList = new InternetAddress().parse(toPersion); msg.setRecipients(Message.RecipientType.TO, iaToList); //收件人 msg.setSentDate(new Date()); // 发送日期 msg.setSubject(title); // 主题 msg.setContent(new File(attach), "text/html;charset=utf-8"); //msg.setContent(File.readFile("./test-output"), "text/html;charset=utf-8"); // msg.setText(text); //内容 // 邮件服务器进行验证 Transport tran = session.getTransport("smtp"); tran.connect("smtp.qq.com", sendUser, password); tran.sendMessage(msg, msg.getAllRecipients()); // 发送 System.out.println("邮件发送成功"); } catch (Exception e) { e.printStackTrace(); } } /** * @title:发送附件 * @author: chaowen.li * @date: 2022/2/24 16:26 */ public static void sendFile() throws Exception { Session session = Session.getInstance(comm()); MimeMessage msg = new MimeMessage(session); msg.setFrom(new InternetAddress(sendUser, sendUser, "UTF-8")); InternetAddress[] iaToList = new InternetAddress().parse(toPersion); msg.setRecipients(Message.RecipientType.TO, iaToList); //收件人 msg.setSubject(title, "UTF-8"); //向multipart对象中添加邮件的各个部分内容,包括文本内容和附件 MimeMultipart multipart = new MimeMultipart(); //设置邮件的文本内容 MimeBodyPart contentPart = new MimeBodyPart(); contentPart.setContent("接口测试报告,详情参考附件!", "text/html;charset=UTF-8"); multipart.addBodyPart(contentPart); //添加附件 MimeBodyPart filePart = new MimeBodyPart(); DataSource source = new FileDataSource(new File(attach)); //DataSource source = new FileDataSource("D:\\github\\interface-test\\interfacetest\\interfacetest\\test-output" + File.separator + "index.html"); //添加附件的内容 filePart.setDataHandler(new DataHandler(source)); //添加附件的标题 filePart.setFileName(MimeUtility.encodeText("index.html")); multipart.addBodyPart(filePart); multipart.setSubType("mixed"); //将multipart对象放到message中 msg.setContent(multipart); msg.setSentDate(new Date()); // 发送日期 //保存前面的设置 msg.saveChanges(); //根据session获取邮件传输对象 Transport transport = session.getTransport(); //连接邮箱服务器 transport.connect(sendUser, password); //发送邮件到所有的收件地址 transport.sendMessage(msg, msg.getAllRecipients()); transport.close(); } /** * @title:程序入口,测试调用 * @author: chaowen.li * @date: 2022/2/25 11:10 */ public static void main(String[] args) throws Exception{ EmailUtils.sendFile(); } }
四、测试结果
五、测试调用,可以在所有测试用例执行完或者所有测试套件执行完后,调用该方式发送邮件
1、实际操作中,我们往往会编写多个测试类,实现所有测试执行完成后调用该方法,可以写一个BaseTest,其他测试测试类继承该类
package com.automation.interfacetest.base; import com.automation.interfacetest.util.EmailUtils; import org.testng.annotations.AfterSuite; import org.testng.annotations.BeforeSuite; /** * @title: * @author: 2022/2/2416:09 * @date: 2022/2/2416:09 */ public class BaseTest { @BeforeSuite public void beforeSuite(){ System.out.println("BeforeSuite"); } @AfterSuite public void afterSuite() throws Exception{ //所有测试套件执行完成后,邮件发送测试报告 EmailUtils.sendFile(); } }
用例继承该类:
public class HXImageClouCase extends BaseTest {
//用例代码
}
六、通过Jenkins配置实现邮件发送
参考:
参考文章:
https://blog.csdn.net/jffhy2017/category_8081915.html