PowerShell Display Table In HTML Email
powershell
Solution
Here's how I'd do it:
# Create a DataTable
$table = New-Object system.Data.DataTable "TestTable"
$col1 = New-Object system.Data.DataColumn Name,([string])
$col2 = New-Object system.Data.DataColumn Dept,([string])
$table.columns.add($col1)
$table.columns.add($col2)
# Add content to the DataTable
$row = $table.NewRow()
$row.Name = "John"
$row.Dept = "Physics"
$table.Rows.Add($row)
$row = $table.NewRow()
$row.Name = "Susan"
$row.Dept = "English"
$table.Rows.Add($row)
# Create an HTML version of the DataTable
$html = "<table><tr><td>Name</td><td>Dept</td></tr>"
foreach ($row in $table.Rows)
{
$html += "<tr><td>" + $row[0] + "</td><td>" + $row[1] + "</td></tr>"
}
$html += "</table>"
# Send the email
$smtpserver = "smtpserver.domain.com"
$from = "user@domain.com"
$to = "user@domain.com"
$subject = "test"
$body = "Hi there,<br />Here is a table:<br /><br />" + $html
Send-MailMessage -smtpserver $smtpserver -from $from -to $to -subject $subject -body $body -bodyashtml
Problem
Ok, this may have been answered, but I'm new and trying to learn, so I guess I'm not "getting" it. I have a variable that contains a table of information (I got it from a SQL query). I can output the variable to the screen and see the table, but when I try to build an HTML email with it in the body, it gets garbled. Here is the code: ``` # This code sets up the HTML table in a more friendly format $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>" # This code defines the search string in the IssueTrak database tables $SQLServer = "Blah" $SQLDBName = "Blah" $SQLUsername = "Blah" $SQLPassword = "Blah" $SQLQuery = "SELECT u.FirstName,u.LastName,u.EMail,COUNT(UserID) as Count FROM dbo.Issues i with(nolock) JOIN DBO.Users u with(nolock) on u.UserID = i.NextActionBy where i.Status='Open' group by u.FirstName,u.LastName,u.EMail order by Count(*) desc" # This code connects to the SQL server and retrieves the data $SQLConnection = New-Object System.Data.SqlClient.SqlConnection $SqlConnection.ConnectionString = "Server = $SQLServer; Database = $SQLDBName; uid = $SQLUsername; pwd = $SQLPassword" $SqlCmd = New-Object System.Data.SqlClient.SqlCommand $SqlCmd.CommandText = $SqlQuery $SqlCmd.Connection = $SqlConnection $SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter $SqlAdapter.SelectCommand = $SqlCmd $DataSet = New-Object System.Data.DataSet $SqlAdapter.Fill($DataSet) $SqlConnection.Close() # This code outputs the retrieved data $DataSet.Tables | Format-Table -Auto # This code emails a report regarding the results of the retrieved data $smtpServer = "Blah" $smtpFrom = "Blah" $smtpTo = "Blah" $messageSubject = "IssueTrak Open Issues By Next Action Report" $message = New-Object System.Net.Mail.MailMessage $smtpfrom, $smtpto $message.Subject = $messageSubject $message.IsBodyHTML = $true $message.Body = "Here is a listing of open issues in IssueTrak, sorted by Next Action.<br><br>" $message.Body = $message.Body + $html $smtp = New-Object Net.Mail.SmtpClient($smtpServer) $smtp.Send($message) ``` The output on the screen looks like this: ``` 35 FirstName LastName EMail Count --------- -------- ----- ----- John Doe John.Doe@blah.com 51 Jane Doe Jane.Doe@blah.com 20 ``` ...but the email body looks like this: ``` Here is a listing of open issues in IssueTrak, sorted by Next Action. Microsoft.PowerShell.Commands.Internal.Format.FormatStartData Microsoft.PowerShell.Commands.Internal.Format.GroupStartData Microsoft.PowerShell.Commands.Internal.Format.FormatEntryData Microsoft.PowerShell.Commands.Internal.Format.FormatEntryData ``` ...and so on. What am I doing wrong?