DemoTools/MailViewer.ps1 (110 lines of code) (raw):

Add-Type -AssemblyName System.Windows.Forms Add-Type -AssemblyName System.Drawing # Define the ConvertFrom-EmlToHtml function function ConvertFrom-EmlToHtml { [CmdletBinding()] Param ( [Parameter(ParameterSetName="Path", Position=0, Mandatory=$True)] [String]$Path, [Parameter(ParameterSetName="LiteralPath", Mandatory=$True)] [String]$LiteralPath, [Parameter(ParameterSetName="FileInfo", Mandatory=$True, ValueFromPipeline=$True)] [System.IO.FileInfo]$Item ) Process { switch ($PSCmdlet.ParameterSetName) { "Path" { $files = Get-ChildItem -Path $Path } "LiteralPath" { $files = Get-ChildItem -LiteralPath $LiteralPath } "FileInfo" { $files = $Item } } $files | % { # Work out file names $emlFn = $_.FullName # Skip non-.msg files if ($emlFn -notlike "*.eml") { Write-Verbose "Skipping $_ (not an .eml file)..." return } # Read EML Write-Verbose "Reading $_..." $adoDbStream = New-Object -ComObject ADODB.Stream $adoDbStream.Open() $adoDbStream.LoadFromFile($emlFn) $cdoMessage = New-Object -ComObject CDO.Message $cdoMessage.DataSource.OpenObject($adoDbStream, "_Stream") # Generate HTML Write-Verbose "Generating HTML..." $html = "<!DOCTYPE html>`r`n" $html += "<html>`r`n" $html += "<head>`r`n" $html += "<meta charset=`"utf-8`">`r`n" $html += "<title>" + $cdoMessage.Subject + "</title>`r`n" $html += "</head>`r`n" $html += "<body style=`"font-family: sans-serif; font-size: 11pt`">`r`n" $html += "<div style=`"margin-bottom: 1em;`">`r`n" $html += "<strong>From: </strong>" + $cdoMessage.From + "<br>`r`n" $html += "<strong>Sent: </strong>" + $($cdoMessage.SentOn).ToString("dd/MM/yyyy HH:mm:ss") + "<br>`r`n" $html += "<strong>To: </strong>" + $cdoMessage.To + "<br>`r`n" if ($cdoMessage.CC -ne "") { $html += "<strong>Cc: </strong>" + $cdoMessage.CC + "<br>`r`n" } if ($cdoMessage.BCC -ne "") { $html += "<strong>Bcc: </strong>" + $cdoMessage.BCC + "<br>`r`n" } $html += "<strong>Subject: </strong>" + $cdoMessage.Subject + "<br>`r`n" $html += "</div>`r`n" if ($cdoMessage.HTMLBody -ne "") { $html += "<div>`r`n" $html += $cdoMessage.HTMLBody + "`r`n" $html += "</div>`r`n" } else { $html += "<div><pre>" $html += $cdoMessage.TextBody $html += "</pre></div>`r`n" } $html += "</body>`r`n" $html += "</html>`r`n" return $html } } End { Write-Verbose "Done." } } # Create form $form = New-Object System.Windows.Forms.Form $form.Text = "Mail Viewer" $form.Size = New-Object System.Drawing.Size(800, 400) $form.FormBorderStyle = "FixedDialog" $form.StartPosition = "CenterScreen" # Create web browser control $webBrowser = New-Object System.Windows.Forms.WebBrowser $webBrowser.Location = New-Object System.Drawing.Point(10, 50) $webBrowser.Size = New-Object System.Drawing.Size(760, 300) $form.Controls.Add($webBrowser) # Create button for file selection $button = New-Object System.Windows.Forms.Button $button.Location = New-Object System.Drawing.Point(10, 10) $button.Size = New-Object System.Drawing.Size(100, 30) $button.Text = "Open EML" $button.Add_Click({ $openFileDialog = New-Object System.Windows.Forms.OpenFileDialog $openFileDialog.Filter = "EML files (*.eml)|*.eml" $openFileDialog.Title = "Select an EML File" $openFileDialog.InitialDirectory = "C:\inetpub\mailroot\drop" $dialogResult = $openFileDialog.ShowDialog() if ($dialogResult -eq "OK") { $emlFilePath = $openFileDialog.FileName # Convert EML to HTML $html = ConvertFrom-EmlToHtml -Path $emlFilePath # Display HTML in the web browser $webbrowser.DocumentText = $html } }) $form.Controls.Add($button) # Show form $form.ShowDialog() | Out-Null