You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何读取HTML页面为InputStreamSource以发送Selenium邮件报告?

解决Selenium HTML报告邮件发送的问题

没问题,我来给你一步步讲清楚怎么把Selenium的HTML报告读取为InputStreamSource并通过Spring发送邮件!首先补个小提醒:你可能还需要添加邮件的实现依赖(因为javax.mail-api只是接口),先把依赖确认好:

1. 完善Maven依赖

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context-support</artifactId>
    <version>5.3.20</version> <!-- 用和你项目匹配的Spring版本 -->
</dependency>
<dependency>
    <groupId>javax.mail</groupId>
    <artifactId>javax.mail-api</artifactId>
    <version>1.6.2</version>
</dependency>
<!-- 必须加这个实现包,否则会找不到邮件发送的具体实现 -->
<dependency>
    <groupId>com.sun.mail</groupId>
    <artifactId>javax.mail</artifactId>
    <version>1.6.2</version>
</dependency>

2. 邮件服务器配置(Spring Boot为例)

在application.yml里配置你的邮件服务商信息,比如QQ邮箱、Gmail或者公司邮箱:

spring:
  mail:
    host: smtp.qq.com # 替换成你的SMTP服务器地址
    port: 587
    username: your-qq-email@qq.com
    password: your-authorization-code # 注意是授权码,不是登录密码
    properties:
      mail:
        smtp:
          auth: true
          starttls:
            enable: true # 开启TLS加密

3. 核心实现:读取HTML报告并发送

Spring提供了FileSystemResource(读取本地文件)和ByteArrayResource(读取内存中的HTML内容),这两个类都实现了InputStreamSource接口,刚好满足你的需求。下面是完整的邮件发送Service示例:

import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.ByteArrayResource;
import org.springframework.stereotype.Service;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import java.io.File;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;

@Service
public class TestReportEmailService {

    private final JavaMailSender mailSender;

    // 构造注入JavaMailSender,Spring会自动根据配置创建这个Bean
    public TestReportEmailService(JavaMailSender mailSender) {
        this.mailSender = mailSender;
    }

    /**
     * 发送本地生成的Selenium HTML报告作为附件
     * @param toEmail 收件人邮箱
     * @param subject 邮件主题
     * @param reportFilePath HTML报告的本地路径(比如target/surefire-reports/emailable-report.html)
     */
    public void sendLocalReportAsAttachment(String toEmail, String subject, String reportFilePath) throws MessagingException {
        MimeMessage message = mailSender.createMimeMessage();
        // 第二个参数true表示支持多部分邮件(带附件),指定UTF-8避免乱码
        MimeMessageHelper helper = new MimeMessageHelper(message, true, StandardCharsets.UTF_8.name());

        helper.setFrom("your-sender-email@xxx.com");
        helper.setTo(toEmail);
        helper.setSubject(subject);
        helper.setText("您好,这是本次Selenium自动化测试的报告,请查收附件。", true);

        // 直接用FileSystemResource读取本地HTML文件,它就是InputStreamSource的实现类
        FileSystemResource htmlReport = new FileSystemResource(new File(reportFilePath));
        // 添加附件,第二个参数是收件人看到的附件名称
        helper.addAttachment("自动化测试报告.html", htmlReport);

        mailSender.send(message);
    }

    /**
     * 如果你的HTML报告是动态生成在内存中的字符串,用这个方法发送
     * @param toEmail 收件人邮箱
     * @param subject 邮件主题
     * @param htmlReportContent 内存中的HTML报告内容
     */
    public void sendInMemoryReportAsAttachment(String toEmail, String subject, String htmlReportContent) throws MessagingException {
        MimeMessage message = mailSender.createMimeMessage();
        MimeMessageHelper helper = new MimeMessageHelper(message, true, StandardCharsets.UTF_8.name());

        helper.setFrom("your-sender-email@xxx.com");
        helper.setTo(toEmail);
        helper.setSubject(subject);
        helper.setText("您好,这是本次Selenium自动化测试的报告,请查收附件。", true);

        // 将HTML字符串转成字节数组,包装成ByteArrayResource(同样实现InputStreamSource)
        byte[] reportBytes = htmlReportContent.getBytes(StandardCharsets.UTF_8);
        ByteArrayResource htmlReport = new ByteArrayResource(reportBytes);
        helper.addAttachment("自动化测试报告.html", htmlReport);

        mailSender.send(message);
    }

    /**
     * 额外:把HTML报告直接内嵌到邮件正文中(不用附件)
     * @param toEmail 收件人邮箱
     * @param subject 邮件主题
     * @param reportFilePath HTML报告的本地路径
     */
    public void sendReportAsEmailContent(String toEmail, String subject, String reportFilePath) throws Exception {
        MimeMessage message = mailSender.createMimeMessage();
        MimeMessageHelper helper = new MimeMessageHelper(message, true, StandardCharsets.UTF_8.name());

        helper.setFrom("your-sender-email@xxx.com");
        helper.setTo(toEmail);
        helper.setSubject(subject);

        // 读取HTML文件内容作为邮件正文,第二个参数true表示是HTML格式
        String htmlContent = new String(Files.readAllBytes(Paths.get(reportFilePath)), StandardCharsets.UTF_8);
        helper.setText(htmlContent, true);

        mailSender.send(message);
    }
}

4. 使用示例

在你的测试结束后,调用这个Service的方法就行:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;

@Component
public class TestReportSender implements CommandLineRunner {

    @Autowired
    private TestReportEmailService emailService;

    @Override
    public void run(String... args) throws Exception {
        // 发送本地HTML报告作为附件
        emailService.sendLocalReportAsAttachment(
                "your-personal-email@xxx.com",
                "Selenium自动化测试报告",
                "target/surefire-reports/emailable-report.html" // 替换成你的报告实际路径
        );
    }
}

几个注意点

  • 确认邮件服务器的授权码/密码正确,比如QQ邮箱需要在设置里开启POP3/SMTP并生成授权码
  • 报告文件路径尽量用绝对路径,避免因项目运行目录不同导致找不到文件
  • 如果报告包含图片,内嵌到邮件正文的话需要处理图片的资源路径,不然邮件里图片会显示失效

内容的提问来源于stack exchange,提问作者Sigma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 08:02:34