带有 html 正文的 Powershell 电子邮件发件人 (htmlbody.Replace)

Posted

技术标签:

【中文标题】带有 html 正文的 Powershell 电子邮件发件人 (htmlbody.Replace)【英文标题】:Powershell email sender with html body (htmlbody.Replace) 【发布时间】:2022-01-03 13:43:46 【问题描述】:

我目前是一名 C# dotnet 自动化工程师。我的测试结果之一是通过电子邮件输出的。我的测试结果输出通过 powershell。一般来说,我对电子邮件模板和 html 还是很陌生。 这是一个简单的 HTML 正文,其中包含我用 $EmailBody= $EmailBody.Replace("PassedTests",$Passed) 函数等替换的变量

整个前提:我的脚本将 Total tests/Passed/Failed/Skipped 替换为我在测试运行后从 .trx 文件中提取的数据。 我的提取码:

            $PassedTests = $testResultsXml.TestRun.ResultSummary.Counters.Passed
            $FailedTests = $testResultsXml.TestRun.ResultSummary.Counters.Failed
            $SkippedTests = $testResultsXml.TestRun.ResultSummary.Counters.Skipped
            $OnlyFailed = $testResultsXml.TestRun.Results.UnitTestResult | Where-Object  $_.outcome -eq "Failed" 
            $FailedTestsName = $OnlyFailed.TestName

如果 HTML 正文中有任何失败的测试,我有一个“错误列表”表(下图)显示测试名称

@</td>
</tr>
<!--end img-->

<tr>
<td ></td>
</tr>

<!--title-->
<tr align="center">
<td align="center" style="font-family: 
'Open Sans', Arial, sans-serif; font-size:16px;color:#3b3b3b;font-weight: bold;">**ERROR LIST**</td>
</tr>
<!--end title-->

<tr>
<td ></td>
</tr>

<!--content-->
<tr align="center">
<td align="center" style="font-family: 'Open Sans', Arial, sans-serif; font-size:12px;color:#7f8c8d;line-height: 24px;">NoErrors</td>
</tr>
<!--end content-->

</table>
</td>
</tr>
<tr>
<td ></td>
</tr>
</table>

现在的主要问题是:是否有可能只显示“错误列表”表只有如果有任何失败的测试?如果没有失败的测试,那么根本不显示该表会很好。 任何形式的帮助将不胜感激。谢谢!

$EmailBody= $EmailBody.Replace("PassedTests",$Passed)
$EmailBody= $EmailBody.Replace("FailedTests",$Failed)
$EmailBody= $EmailBody.Replace("SkippedTests",$Skipped)
$EmailBody= $EmailBody.Replace("ErrorList",$FailedTestsName)
$Emailattachment = "\TestResults.trx"

【问题讨论】:

你实际上已经拥有了这个......你只需要更深入地应用它。从电子邮件中完全删除您的细分,并添加一个占位符。从那里,如果有错误,您用错误填充该段并将其重新插入电子邮件中。否则,您只需删除占位符。看我的回答。 【参考方案1】:

你走在正确的道路上。 你只需要扩展你正在做的事情。

删除电子邮件中可能存在或不存在的内容(“错误列表”部分,因为如果没有错误,它将不存在) 将您删除的部分放在自己的变量中 在您的主 html 模板中应该在的位置添加一个占位符(就像您已经做的那样,我们可以在 html 模板中进行替换。

从那里,逻辑是:

如果有 0 个错误,则将主模板中的占位符替换为空字符串(您不希望该占位符出现在最终电子邮件中) 如果有 1 个或多个错误,而不是用错误列表替换,而是构建一个包含要附加的部分的新变量,然后用错误内容替换它的循环,最后用那个替换占位符部分(包含错误循环)

看起来像这样。

$EmailBody = @'
</td>
</tr>
<!--end img-->

<tr>
<td ></td>
</tr>

**ErrorsTable**

'@


$ErrorListBody = @'
<!--title-->
<tr align="center">
<td align="center" style="font-family: 
'Open Sans', Arial, sans-serif; font-size:16px;color:#3b3b3b;font-weight: bold;">**ERROR LIST**</td>
</tr>
<!--end title-->

<tr>
<td ></td>
</tr>

<!--content-->
<tr align="center">
<td align="center" style="font-family: 'Open Sans', Arial, sans-serif; font-size:12px;color:#7f8c8d;line-height: 24px;">NoErrors</td>
</tr>
<!--end content-->

</table>
</td>
</tr>
<tr>
<td ></td>
</tr>
</table>
'@


if ($FailedTests.Count -gt 0)  
    # inserting errors to the `$ErrorListBody` html segment
    $ErrorsHtml = $ErrorListBody.Replace("ErrorList", $FailedTestsName)
    # inserting the html segment into the main email 
    $EmailBody = $EmailBody.Replace("**ErrorsTable**", $ErrorsHtml)
 else 
   # Removing the placeholder from the main template.
   $EmailBody = $EmailBody.Replace("**ErrorsTable**", '')


【讨论】:

以上是关于带有 html 正文的 Powershell 电子邮件发件人 (htmlbody.Replace)的主要内容,如果未能解决你的问题,请参考以下文章

带有正文内容的 Python 电子邮件多部分

当我们使用 phpMailer 发送带有动态内容的邮件时,如何在电子邮件正文中显示多个内联图像

在 Python 中发送带有 HTML+plain_text 电子邮件的 PDF 附件

带有电子邮件正文的 NSMutableArray 数据附件?

带有多个附件 + html 的 SMTP 邮件 Mime

Python - 发送带有多个图像附件的电子邮件