2013-10-29 196 views
1

我有一个文本文件output.txt的其中有以下内容:发送HTML格式的电子邮件

OPERATINGSYSTEM  PROJECTSERVER1 PROJECTSERVER2 
Windows      1.36    4.42 
Linux12      2.78    5.76 
MacOS       3.45    6.39 
Ubuntu      4.12    0.00 
Android      0.00    3.46 
FreePhysicalMemory   30.12   31.65 
TotalVisibleMemorySize  48.00   48.00 
CPULoadPercentage    2    4 

我想在一个电子邮件发送的内容output.txt的在格式化的HTML表体看看Windows服务器2008 R2。我正在尝试使用下面的代码,但它不适合我......我误解了下面的地方?

$smtpServer = "[email protected]" 
$smtpFrom = "[email protected]" 
$smtpTo = "[email protected]" 
$messageSubject = "Servers Memory" 

$message = New-Object System.Net.Mail.MailMessage $smtpfrom, $smtpto 
$message.Subject = $messageSubject 
$message.IsBodyHTML = $true 

$message.Body = Get-Content C:\Logs\output.txt 
$style = "< style>BODY{font-family: Arial; font-size: 10pt;}" 
$style = $style + "TABLE{border: 1px solid black; border-collapse: collapse;}" 
$style = $style + "TH{border: 1px solid black; background: #dddddd; padding: 5px; }" 
$style = $style + "TD{border: 1px solid black; padding: 5px; }" 
$style = $style + "< /style>" 

$smtp = New-Object Net.Mail.SmtpClient($smtpServer) 
$smtp.Send($message) 

EDIT1

当我修改,我下面的代码:

$smtpServer = "[email protected]" 
$smtpFrom = "[email protected]" 
$smtpTo = "[email protected]" 
$messageSubject = "Servers Memory" 

$message = New-Object System.Net.Mail.MailMessage $smtpfrom, $smtpto 
$message.Subject = $messageSubject 
$message.IsBodyHTML = $true 

$style = "<style>BODY{font-family: Arial; font-size: 10pt;}" 
$style = $style + "TABLE{border: 1px solid black; border-collapse: collapse;}" 
$style = $style + "TH{border: 1px solid black; background: #dddddd; padding: 5px; }" 
$style = $style + "TD{border: 1px solid black; padding: 5px; }" 
$style = $style + "</style>" 
$message.Body = "<head><pre>$style</pre></head>" 
$message.Body += Get-Content C:\Logs\output.txt 

$smtp = New-Object Net.Mail.SmtpClient($smtpServer) 
$smtp.Send($message) 

我收到的邮件是这样的:

OPERATING SYSTEM SERVER1 SERVER2 Windows 1.36 4.42 Linux 2.78 5.76 MacOS 3.45 6.39 Android 0.00 3.46 Ubuntu 4.12 0.00 FreePhysicalMemory 30.12 31.65 TotalVisibleMemorySize 48.00 48.00 

注:我使用PowerShell v1.0

+0

1.“不工作”在哪种方式?你越具体,就越有可能找出问题。 2。你对** $ style **有什么打算?你将它的价值设定为一堆CSS代码,但是你没有对它做任何事情。看起来应该像'$ message.Body =''+ $ style +''+ $ message.Body'在最后的'$ style = [']'语句和'$ smtp = '声明。 3. ** output.txt **不包含HTML。它应该有HTML表格数据,否则格式将会全部错误。那是什么“不工作”? –

回答

3

好的,这个问题有点不清楚,但我会根据我推断“不适合你”的方式对其进行刺探。我猜你的脚本成功地发送消息,的,什么是不工作是消息的格式是完全错误的,原因有二:

  1. output.txt的是纯文本,不是HTML。在HTML中呈现时,空白将不会被保留,并且不会有任何换行符。如果空格由空格组成,连续的空格将被缩减为单个空格,如果它是制表符,我相信文本将全部一起运行,而不会有空格。我认为你期待$message.IsBodyHTML = $true将纯文本输入转换为HTML,但这不是它的作用。它只是设置指示邮件客户端将主体解释为HTML的消息的属性(具体来说,它将Content-Type标头设置为“text/html”),但您必须实际提供HTML代码。
  2. 您正在将$ style变量设置为一堆CSS代码,但您对此不做任何处理。我想你打算把它加到$ message.Body。问题在于你无法可靠地在电子邮件中放置样式表;大多数客户会忽略它。样式必须是内联的。

output.txt的应该是这样的:

<body style="font-family: Arial; font-size: 10pt;"> 
    <table style = "border: 1px solid black; border-collapse: collapse;"> 
    <tr> 
     <th style = "border: 1px solid black; background: #dddddd; padding: 5px;">OPERATINGSYSTEM</th> 
     <th style = "border: 1px solid black; background: #dddddd; padding: 5px;">PROJECTSERVER1</th> 
     <th style = "border: 1px solid black; background: #dddddd; padding: 5px;">PROJECTSERVER2</th> 
    </tr> 
    <tr> 
     <td style = "border: 1px solid black; padding: 5px;">Windows</td> 
     <td style = "border: 1px solid black; padding: 5px;">1.36</td> 
     <td style = "border: 1px solid black; padding: 5px;">4.42</td> 
    </tr> 
    <tr> 
     <td style = "border: 1px solid black; padding: 5px;">Linux12</td> 
     <td style = "border: 1px solid black; padding: 5px;">2.78</td> 
     <td style = "border: 1px solid black; padding: 5px;">5.76</td> 
    </tr> 
    <tr> 
     <td style = "border: 1px solid black; padding: 5px;">MacOS</td> 
     <td style = "border: 1px solid black; padding: 5px;">3.45</td> 
     <td style = "border: 1px solid black; padding: 5px;">6.39</td> 
    </tr> 
    <tr> 
     <td style = "border: 1px solid black; padding: 5px;">Ubuntu</td> 
     <td style = "border: 1px solid black; padding: 5px;">4.12</td> 
     <td style = "border: 1px solid black; padding: 5px;">0.00</td> 
    </tr> 
    <tr> 
     <td style = "border: 1px solid black; padding: 5px;">Android</td> 
     <td style = "border: 1px solid black; padding: 5px;">0.00</td> 
     <td style = "border: 1px solid black; padding: 5px;">3.46</td> 
    </tr> 
    <tr> 
     <td style = "border: 1px solid black; padding: 5px;">FreePhysicalMemory</td> 
     <td style = "border: 1px solid black; padding: 5px;">30.12</td> 
     <td style = "border: 1px solid black; padding: 5px;">31.65</td> 
    </tr> 
    <tr> 
     <td style = "border: 1px solid black; padding: 5px;">TotalVisibleMemorySize</td> 
     <td style = "border: 1px solid black; padding: 5px;">48.00</td> 
     <td style = "border: 1px solid black; padding: 5px;">48.00</td> 
    </tr> 
    <tr> 
     <td style = "border: 1px solid black; padding: 5px;">CPULoadPercentage</td> 
     <td style = "border: 1px solid black; padding: 5px;">2</td> 
     <td style = "border: 1px solid black; padding: 5px;">4</td> 
    </tr> 
    </table> 
</body> 

PowerShell脚本应该是这样的:

$smtpServer = "[email protected]" 
$smtpFrom = "[email protected]" 
$smtpTo = "[email protected]" 
$messageSubject = "Servers Memory" 

$message = New-Object System.Net.Mail.MailMessage $smtpfrom, $smtpto 
$message.Subject = $messageSubject 
$message.IsBodyHTML = $true 
$message.Body = Get-Content C:\Logs\output.txt 

$smtp = New-Object Net.Mail.SmtpClient($smtpServer) 
$smtp.Send($message) 

如果您不能提供output.txt的 HTML是因为它是以纯文本自动生成的,那么你的脚本需要将其转换。如果格式一致如您的示例所示,那不是太复杂。用这个替换$message.Body =行:

$body = Get-Content C:\Logs\output.txt | Out-String 
$body = $body -replace '^(\S+)\s+(\S+)\s+(\S+)', '<tr><th style = "border: 1px solid black; background: #dddddd; padding: 5px;">$1</th><th style = "border: 1px solid black; background: #dddddd; padding: 5px;">$2</th><th style = "border: 1px solid black; background: #dddddd; padding: 5px;">$3</th></tr>' 
$body = $body -replace '\n(\S+)\s+(\S+)\s+(\S+)', '<tr><td style = "border: 1px solid black; padding: 5px;">$1</td><td style = "border: 1px solid black; padding: 5px;">$2</td><td style = "border: 1px solid black; padding: 5px;">$3</td></tr>' 
$body = '<body><table style = "border: 1px solid black; border-collapse: collapse;">' + $body + '</table></body>' 
$message.Body = $body 
+0

&** output.txt **将始终为纯文本格式..因为它是通过批处理脚本生成的..我无法更改该.. :) – Sunny

+1

就是这样,它不会改变事实上,如果你不提供HTML输入,你将不会得到HTML输出(你知道...... GIGO原理)。所有** IsBodyHTML **属性都将** Content-Type **标头设置为'text/html',它指示客户端将主体解释为HTML。您在更新中发布的结果与我描述的结果完全相同,只需将** output.txt **呈现为HTML即可 - 无需换行符,并且空格可简化为单个空格。如果您无法更改生成** output.txt **的脚本,则必须使PowerShell脚本将其转换为HTML。 –

+0

实际上,我发现的是,您无法在电子邮件中可靠地添加样式表。样式必须内联,否则大多数客户会忽略它们。 –