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 {
    }
}