pf-email_Eml.ps1
function Get-Eml_Data { [CmdletBinding()] Param( [Parameter(ValueFromPipeline=$true, Mandatory=$true)] $path ) begin { $adoDbStream = New-Object -ComObject ADODB.Stream $adoDbStream.Open() } Process { $path = $path | Get-Path $adoDbStream.LoadFromFile($path) $cdoMessage = New-Object -ComObject CDO.Message $cdoMessage.DataSource.OpenObject($adoDbStream, "_Stream") $result = ConvertFrom-Json ( ConvertTo-json $cdoMessage ) $result | Add-Member NoteProperty Path $path $result | Add-Member NoteProperty Name ( Split-Path $path -Leaf ) $result | Add-Member NoteProperty Directory ( Split-Path $path -Parent ) $item = Get-PathItem $path $result | Add-Member NoteProperty File $item $result | Add-Member NoteProperty ToList ( Get-Email_AddressList -value $result.To ) $result | Add-Member NoteProperty FromList ( Get-Email_AddressList -value $result.From ) $result | Add-Member NoteProperty CCList ( Get-Email_AddressList -value $result.CC ) $result | Add-Member NoteProperty BCCList ( Get-Email_AddressList -value $result.BCC ) $result } end { $adoDbStream.Close() } } function Rename-Eml { [CmdletBinding()] Param( [Parameter(ValueFromPipeline=$true, Mandatory=$true)] $path, [HashTable]$Replacements ) begin{ $generated = @() } process{ $mail = Get-Eml_Data -path $path if ( -not $mail -or ($Generated -contains $mail.File.FullName) ) { return } $ext = [System.IO.Path]::GetExtension($mail.Path) $newName = $mail.Subject + ' ' + $mail.ToList $newName = $newName | Update-Path_ReplaceFileSpecialChars -replaceWith '_' $last = Get-ChildItem -Path $mail.Directory | Get-FileNamePart_Max -filter "$newName_(*)$ext" -AsNumber $next = [String]($last + 1) $next = $next.PadLeft(10,'0') if ( $mail.File.Name -eq "$newName($last)$ext" ) { return } $newName = "$newName($next)$ext" $newName = $newName | Update-String_Replace_Multiple -replacements $Replacements -all $mail.File = $mail.File | Rename-Item -NewName $newName -Verbose -PassThru $Generated += $mail.File.FullName } } function Rename-Eml:::Example { $Replacements = @{ 'Operation Alert' = 'Alert' 'support@CORP.local' = '' 'Customer Portal' = 'CP' 'Request_ ' = 'R_' 'Your ' = '' 'for ' = '' 'to ' = '' ' ' = ' ' '- ' = '-' ' -' = '-' '_ ' = '_' ' _' = '_' 'has ' = '' 'been ' = '' } $folder = 'C:\inetpub\mailroot\Pickup' $files = @() $files += Get-ChildItem -Path $folder -File -Filter *.eml $files += Get-ChildItem -Path $folder -File -Filter *.mht $files | Rename-Eml -Replacements $Replacements } 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 | ForEach-Object { # Work out file names $emlFn = $_.FullName $htmlFn = $emlFn -replace '\.eml$', '.html' # Skip non-.msg files if ($emlFn -notlike "*.eml") { Write-Verbose "Skipping $_ (not an .eml file)..." return } # Do not try to overwrite existing files if (Test-Path -LiteralPath $htmlFn) { Write-Verbose "Skipping $_ (.html already exists)..." 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 + "<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" # Write HTML Write-Verbose "Saving HTML..." Add-Content -LiteralPath $htmlFn $html # Output to pipeline Get-ChildItem -LiteralPath $htmlFn } } End { Write-Verbose "Done." } } function Clear-EmailsSent { try { $ErrorActionPreference = 'SilentlyContinue' Get-ChildItem -Path 'C:\inetpub\mailroot\Pickup\' -Exclude *.bat | Remove-Item } Catch { } } |