\\\LET IT THAW
I’m not sure how you saved the template in Step 2, but hopefully it was just about any format other than stone tablet. We have options here: you can save it as an HTML file or a TXT file or even a string in PowerShell, but that last one might get a little ridiculous. For this example, let’s save it as a TXT file and then we’ll import it (output as a string) and let it thaw out in PowerShell.
$PathToHTMLTemplate = C:\\Kitchen\\Fridge\\EmailTemplate.txt
$EmailContent = Get-Content $PathToHTMLTemplate | Out-String
This imports our template as a string and stores it in our variable $EmailContent
. For more info on strings and things, check out String Theory. If you recall from our template, we already included some unique text that we can easily replace with content in PowerShell. These place holders in our template are:
$Section1Head
$Section1Body
$Section2Head
$Section2Body
$YourTeam
So let’s say we want to extend our original email from Part I by adding some spice. Let’s get our network adapter info, convert the table to HTML, and then define some of our variables:
$Adapters_HTML = Get-NetAdapter | select Name, MacAddress, MediaConnectionState | ConvertTo-HTML -Fragment
$Section1Head = 'Update'
$Section1Body = "It's dinner time amico! We've also been trying to reach you about your extended vehicle warranty. This email is extremely coherent and I'm not one to pettinare le bambole."
$Section2Head = 'Network Info'
$Section2Body = 'Below is the network adapter info you asked for:' + $Adapters_HTML
$YourTeam = 'Team Saucy'
\\\Ingredient Swap
Now that we’ve defined our content that we want to insert into our HTML template, we just need to use the Replace()
method in our $EmailContent
variable. We’re replacing the literal characters of $Section1Head with the content we’ve stored in our variable $Section1Head
. Then we just repeat it for the rest of our variables:
$EmailContent = $EmailContent.Replace('$Section1Head',$Section1Head)
$EmailContent = $EmailContent.Replace('$Section1Body',$Section1Body)
$EmailContent = $EmailContent.Replace('$Section2Head',$Section2Head)
$EmailContent = $EmailContent.Replace('$Section2Body',$Section2Body)
$EmailContent = $EmailContent.Replace('$YourTeam',$YourTeam)
Send-MailMessage
to provide a sample of what we have so far:Send-MailMessage -To 'ChefBoyardee@food.edu' -From 'Ravi@food.edu' -Subject 'Dinner Time!' -Body $EmailContent -SmtpServer server1.food.edu -Port 25

\\\Needs More Salt
Like everything in the south, it’s absolutely perfect…but we’re going to add more salt anyway. I’m looking at our table and I’m just not digging it. It’s too bland, it’s lifeless, and when you poke it with a stick it doesn’t even move. Let’s shake that table like a salt shaker and add some style. To start off with, we’ll add some CSS to our actual Email Template txt file. Open it up in your favorite text editor (much love for the OG Notepad) and right below the <h1>
line in the <style>
element of our <head>
section, let’s add the following code:
table#t01{
border-collapse: collapse;
border-width: 1px;
border-color: black;
border-style: solid;
}
table#t01 th{
color: white;
background-color: #04afd3;
padding: 3px;
border-width: 1px;
border-color: black;
border-style: solid;
}
table#t01 td{
border-width: 1px;
border-color: black;
border-style: solid;
}
In a nutshell, we’re creating a new style for a table with the ID of “t01” and then within that table we’re styling the table headers and the table data elements. We want the headers of our columns to stand out a little bit so we give them white text and a different background color. We want all of the cells to have a thin, black border. This is great and all, but we have to give our $Adapters_HTML
table an id of “t01” to be styled like we want. We can do that with—you guessed it—a spatula. No, wait, it’s actually the Replace()
Method again. It looks like this:
$Adapters_HTML = $Adapters_HTML.Replace('<table>','<table id="t01">')
\\\Serving Our Dish
So Here is our final HTML Template, and our final PS code to send the email. Just in case you haven’t had your second cup of coffee today, you want to replace all of my legitimate and absolutely non-fictitious email server settings with your own, equally-legitimate settings.
$PathToHTMLTemplate = C:\\Kitchen\\Fridge\\EmailTemplate.txt
$EmailContent = Get-Content $PathToHTMLTemplate | Out-String
$Adapters_HTML = Get-NetAdapter | select Name, MacAddress, MediaConnectionState | ConvertTo-HTML -Fragment
$Adapters_HTML = $Adapters_HTML.Replace('<table>','<table id="t01">')
$Section1Head = 'Update'
$Section1Body = "It's dinner time amico! We've also been trying to reach you about your extended vehicle warranty. This email is extremely coherent and I'm not one to pettinare le bambole."
$Section2Head = 'Network Info'
$Section2Body = 'Below is the network adapter info you asked for:' + $Adapters_HTML
$YourTeam = 'Team Saucy'
$EmailContent = $EmailContent.Replace('$Section1Head',$Section1Head)
$EmailContent = $EmailContent.Replace('$Section1Body',$Section1Body)
$EmailContent = $EmailContent.Replace('$Section2Head',$Section2Head)
$EmailContent = $EmailContent.Replace('$Section2Body',$Section2Body)
$EmailContent = $EmailContent.Replace('$YourTeam',$YourTeam)
Send-MailMessage -To 'ChefBoyardee@food.edu' -From 'Ravi@food.edu' -Subject 'Dinner Time!' -Body $EmailContent -SmtpServer server1.food.edu -Port 25
<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/xhtml" xmlns:o="urn:schemas-microsoft-com:office:office">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="x-apple-disable-message-reformatting">
<title></title>
<!--[if mso]>
<noscript>
<xml>
<o:OfficeDocumentSettings>
<o:PixelsPerInch>96</o:PixelsPerInch>
</o:OfficeDocumentSettings>
</xml>
</noscript>
<![endif]-->
<style>
table, td, div, h1, p {font-family: Roboto, sans-serif;}
h1 {color: #04afd3}
table#t01{
border-collapse: collapse;
border-width: 1px;
border-color: black;
border-style: solid;
}
table#t01 th{
color: white;
background-color: #04afd3;
padding: 3px;
border-width: 1px;
border-color: black;
border-style: solid;
}
table#t01 td{
border-width: 1px;
border-color: black;
border-style: solid;
}
</style>
</head>
<body style="margin:0;padding:0;">
<table role="presentation" style="width:100%;border-collapse:collapse;border:0;border-spacing:0;background:#ffffff;">
<tr>
<td align="center" style="padding:0;">
<table role="presentation" style="width:602px;border-collapse:collapse;border-spacing:0;text-align:left;">
<tr>
<td align="center" style="padding:30px 0;background:#04afd3;">
<img src="https://pngimg.com/uploads/server/server_PNG59.png" alt="" width="300" style="height:auto;display:block;" />
</td>
</tr>
<tr>
<td style="padding:30px 10px;background:#FFFFFF;">
<h1>$Section1Head</h1>
<p>$Section1Body</p>
</td>
</tr>
<tr>
<td style="padding:30px 10px;background:#FBFBFB;">
<h1>$Section2Head</h1>
<p>$Section2Body</p>
</td>
</tr>
<tr>
<td align="center" style="padding:30px 10px;background:#04afd3;">
<p style="color:#FFFFFF">Magic by $YourTeam</p>
</td>
</tr>
</table>
</td>
</tr>
</table>
</body>
</html>
Let’s put on our mittens and pull our creation out of the oven and stare at it for awhile!

\\\The Final, FINAL Ingredient
If you started crying at just how spicy this email is, you’re not alone. We’re technically done here…but there’s one last finishing touch that will literally turn our dish into a work of art and earn us the title of Iron [Email] Chef…and that’s coloring every other row in our table. Look for an extra bonus post where we’ll build a function to easily take a table and convert it to HTML with all of our styling needs baked in. Ciao ciao!