如何读取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
相关产品推荐
相关产品推荐

