2013-10-29 298 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

實際上,我發現的是,您無法在電子郵件中可靠地添加樣式表。樣式必須內聯,否則大多數客戶會忽略它們。 –