Отправка отформатированного электронного письма в формате HTML

У меня есть текстовый файл output.txt, который имеет следующее содержание:

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 Server 2008 R2. Я пытаюсь с приведенным ниже кодом, но он не работает для меня.. где я ошибаюсь ниже?

$smtpServer = "sunny@abc.com"
$smtpFrom = "process@abc.com"
$smtpTo = "administrator@abc.com"
$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 = "sunny@abc.com"
$smtpFrom = "process@abc.com"
$smtpTo = "administrator@abc.com"
$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

1 ответ

Решение

Хорошо, вопрос немного неясен, но я возьму удар на него, основываясь на том, что я делаю вывод, что "не работает для вас". Я предполагаю, что ваш сценарий успешно отправляет сообщение, и что не работает, так это то, что форматирование сообщения неверно по двум причинам:

  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 = "sunny@abc.com"
$smtpFrom = "process@abc.com"
$smtpTo = "administrator@abc.com"
$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
Другие вопросы по тегам