带有 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)的主要内容,如果未能解决你的问题,请参考以下文章
当我们使用 phpMailer 发送带有动态内容的邮件时,如何在电子邮件正文中显示多个内联图像
在 Python 中发送带有 HTML+plain_text 电子邮件的 PDF 附件