(八)Java版接口自动化-邮件发送测试报告(java代码实现)


一、设置邮箱

1、以qq邮箱为例,登录qq邮箱账号,点击设置-账号-POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务

开启SMTP服务,生成授权码

根据提示生成授权码,后面的密码地方需要用到这个授权码

二、引入依赖包

        
        
            javax.mail
            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

相关