VMware Cloud Community
Biyouk
Contributor
Contributor
Jump to solution

How to output the result of PowerCLI command in an email ?


Hi Everyone,

Can someone provide me help with this example. I'm starting to work with PowerCLI and I have difficulty to output my result in an email.

How can I store my result in array and import the data in HTML in an email ?

From the example below, I don't see any result in the email from the powercli command " Get-VM | Select-Object Name, NumCPU, MemoryMB, ProvisionedSpaceGB"

Do I need to create a loop to extract the result ?

#-------------------------CHANGE THESE VALUES--------------------------------
$SMTPServer = "SMTP.toto.com"
$vCenterServerName1 = "vsphere1.toto.com"
$ToAddress = lady@toto.com
#-----------------------------------------------------------------------------

$Title = "Connection settings for vCenter"
$Author = "Lady"
$Header =  "Connection Settings"

$Login = account@toto.com# for LAFAM domain
$Password = "xxxxxxxxxx#

add-pssnapin VMware.VimAutomation.Core

$HTMLHeader = "<HTML><TITLE> VMware report </TITLE>"
$HTMLFooter = "Made with POWERSHELL Script 2.0 - Version of the script " + $ScriptVersion + "</HTML>"

$ScriptVersion = "v1.0"
$Subject = "VMware Report - VM Inventory "
$FromAddress = "VMware" + "@toto.com"

$ColorArray = "Red", "Orange", "Purple", "Blue", "Olive", "SlateGrey", "Orange", "Purple", "Blue", "Olive"
$ColorArrayIndex = 0

$HTMLHeader = "<HTML><TITLE> VMware Report for " + $vCenterServerName1 " </TITLE>"
$HTMLFooter = "Made with POWERCLI Script 5.0 - " +  $Author + ".<br><br>"
$HTMLFooter += "<B>NOTE:</B> $Date </HTML>"


$HTMLBody = "<BODY>"

$vCenter_inventory = @(Get-VM | Select-Object Name, NumCPU, MemoryMB, ProvisionedSpaceGB)

################################### OUTPUT #######################################

# HEADER
$HTMLBody += CreateHeader ("REPORT FOR <font color=Blue><b> vCENTER " + $vCenterServerName1 + "</font></b><br>")

# INTRO TEXT

$HTMLBody += "<br><br>"
$HTMLBody += $vCenter_inventory


########################### SEND REPORT BY E-MAIL #################################
$HTMLBody += "</BODY>" # Close HTML Body
$HTMLPage = $HTMLHeader + $HTMLBody + $HTMLFooter
Send-Mailmessage -From $FromAddress -To $ToAddress -Subject $Subject -BodyAsHTML -Body $HTMLPage -Priority Normal -SmtpServer $SMTPServer
Write-Host "Report has been sent by E-mail to " $ToAddress " from " $FromAddress
################################### CLEANUP #######################################

$HTMLHeader = ""
$HTMLBody = ""
$HTMLFooter = ""
$HTMLPage = ""
$vCenter1_Inventory = ""
$vCenterServerName1 = ""

Reply
0 Kudos
1 Solution

Accepted Solutions
LittleNickey
Enthusiast
Enthusiast
Jump to solution

Alright, cutting some of your code, this works for me anyway:

## This sets the format for the HTML table

$Header = @"

<style>

body{

background-color:#FFFFFF;

font-family:Arial;

font-size:12pt;

}

td, th{

border:1px solid black;

border-collapse:collapse;

}

th{

color:White;

background-color:DodgerBlue;

}

table, tr, td, th{

padding: 5px;

margin: 0px;

}

table{

margin-left:50px;

}

</style>

<H2>TITLE</H2>

<br>

"@

## Collect data

$vCenter_inventory = Get-VM | Select-Object Name, NumCPU, MemoryMB, ProvisionedSpaceGB


## Convert to HTML

$HTML = $vCenter_inventory | ConvertTo-HTML -Fragment

## Prepare Mail Message

$Message = "Some random text."

$Body = $Header + "<body>" + $Message + "<br><br>" + $HTML + "</body></table>"

$smtpServer = "smtpserver"

$HostName = $env:COMPUTERNAME

$From = $HostName + "@littlenickey.se"

$To = "me@littlenickey.se"

## Send Mail Message

Send-MailMessage -SmtpServer $smtpServer -From $From -To $To -Subject $Subject -Body $Body -BodyAsHtml

This should give you a bit nicer output in the form of a table.

-- Oskar

View solution in original post

Reply
0 Kudos
4 Replies
LittleNickey
Enthusiast
Enthusiast
Jump to solution

Send-MailMessage doesn't like arrays. There are two ways you can go about this that I know of:

1. Pipe your body to "Out-String":

$HTMLPage = $HTMLPage | Out-String

The lazy method but might not become the prettiest output though.


2. Don't use an array (+=), make sure it is still a string:

$HTMLBody = "<HTML><TITLE> VMware Report for " + $vCenterServerName1 " </TITLE>" + "<BODY>" + "REPORT FOR <font color=Blue><b> vCENTER " + $vCenterServerName1 + "</font></b><br>" + "<br><br>" + $vCenter_inventory + "Made with POWERCLI Script 5.0 - " +  $Author + ".<br><br>" + "<B>NOTE:</B> $Date </HTML>"

-- Oskar
Reply
0 Kudos
Biyouk
Contributor
Contributor
Jump to solution

LittleNickey

LittleNickey

Thanks for your answer. The first solution works but like you mention the output is messy.

For the second solution, same if I remove the array, i was not able to see the result in the email.

Reply
0 Kudos
LittleNickey
Enthusiast
Enthusiast
Jump to solution

Alright, cutting some of your code, this works for me anyway:

## This sets the format for the HTML table

$Header = @"

<style>

body{

background-color:#FFFFFF;

font-family:Arial;

font-size:12pt;

}

td, th{

border:1px solid black;

border-collapse:collapse;

}

th{

color:White;

background-color:DodgerBlue;

}

table, tr, td, th{

padding: 5px;

margin: 0px;

}

table{

margin-left:50px;

}

</style>

<H2>TITLE</H2>

<br>

"@

## Collect data

$vCenter_inventory = Get-VM | Select-Object Name, NumCPU, MemoryMB, ProvisionedSpaceGB


## Convert to HTML

$HTML = $vCenter_inventory | ConvertTo-HTML -Fragment

## Prepare Mail Message

$Message = "Some random text."

$Body = $Header + "<body>" + $Message + "<br><br>" + $HTML + "</body></table>"

$smtpServer = "smtpserver"

$HostName = $env:COMPUTERNAME

$From = $HostName + "@littlenickey.se"

$To = "me@littlenickey.se"

## Send Mail Message

Send-MailMessage -SmtpServer $smtpServer -From $From -To $To -Subject $Subject -Body $Body -BodyAsHtml

This should give you a bit nicer output in the form of a table.

-- Oskar
Reply
0 Kudos
Biyouk
Contributor
Contributor
Jump to solution

Thanks for your help. It's works.

Reply
0 Kudos