如何通过电子邮件发送嵌入图像的 HTML 报告(作为附件)?

How do I email an HTML report (as an attachment) with images embedded?

我正在使用 ExtentReports 创建一个报告,以通过电子邮件发送给域外的团队成员。我使用截图的方法(下图)保存测试失败的截图。它们存储在 ExtentReports HTML 报告的子文件夹中。

我将报告附加到电子邮件中,在其中,具有文件夹权限的域中的团队成员可以正常显示图像。但是我不知道如何允许该文件夹权限之外的人查看报告中嵌入的图像。这是图像的 HTML,直接引用该文件。

<img class="report-img" data-featherlight="file:///\domain.local\files\QA\Projects\AutomationReports\ExtentScreens86487870116.jpg" src="file:///\domain.local\files\QA\Projects\AutomationReports\ExtentScreens86487870116.jpg">

下面是我的截图方法

public static String CaptureScreen(WebDriver driver) {
    String ImagesPath = "\\domain.local\files\QA\Projects\AutomationReports\ExtentScreens\"
            + new Date().getTime();

    TakesScreenshot oScn = (TakesScreenshot) driver;
    File oScnShot = oScn.getScreenshotAs(OutputType.FILE);
    File oDest = new File(ImagesPath + ".jpg");

    // System.out.println(ImagesPath);

    try {
        FileUtils.copyFile(oScnShot, oDest);
    } catch (IOException e) {
        System.out.println(e.getMessage());
    }
    return ImagesPath + ".jpg";
}

关于如何解决这个问题,我有 2 个不相关的想法。但是我需要一些帮助才能开始使用它们中的任何一个。我愿意接受其他建议。

  1. 将图像直接嵌入 HTML 报告或以某种方式发送包含 HTML 报告屏幕截图的文件夹。但是,HTML 仍将引用我的原始位置,图像将被损坏。

  2. 与所有人、来宾和匿名用户共享包含图像的文件夹,以便域外的人可以打开引用此位置的 HTML。我不知道如何设置这些权限,我什至不确定这样做是否允许外部用户查看 HTML 引用该位置。

根据您需要的浏览器 support,您可以将图像嵌入 base64。像这样:

<img src="data:image/jpeg;base64, LzlqLzRBQ...<!-- base64 data -->" />

Here is a tool to encode your images

您可以将 base64 编码的图像直接嵌入到 HTML 文档中。

<img src="data:image/jpeg;base64,/9j/4AAQxxxxxxxx...." />

请尝试使用 base64 编码,一定可以。 另外,请检查您的浏览器支持。

试试这个:

<img src="data:image/jpeg;base64,/9j/4AAQxxxxxxxx...." />

您可以创建一条 multipart/report 消息,并将图像包含在消息中作为附加正文部分。 JavaMail FAQ 包含此示例代码:

    Multipart multipart = new MimeMultipart("related");

    MimeBodyPart htmlPart = new MimeBodyPart();
    // messageBody contains html that references image
    // using something like <img src="cid:XXX"> where
    // "XXX" is an identifier that you make up to refer
    // to the image
    htmlPart.setText(messageBody, "utf-8", "html");
    multipart.addBodyPart(htmlPart);

    MimeBodyPart imgPart = new MimeBodyPart();
    // imageFile is the file containing the image
    imgPart.attachFile(imageFile);
    // or, if the image is in a byte array in memory, use
    // imgPart.setDataHandler(new DataHandler(
    //      new ByteArrayDataSource(bytes, "image/whatever")));

    // "XXX" below matches "XXX" above in html code
    imgPart.setContentID("<XXX>");
    multipart.addBodyPart(imgPart);

    message.setContent(multipart);

我们应该有一个 class 文件如下

public class GetScreenShort {

public static String capture(WebDriver driver,String screenShotName) throws IOException { TakesScreenshot ts = (TakesScreenshot)driver;

    String dest = ts.getScreenshotAs(OutputType.BASE64);

    return "data:image/jpg;base64, " + dest ;
 }

}

相同的 class 必须如下调用

String screenShotPath = GetScreenShort.capture(webdriver, "screenShotName");