8
0
Skriptentwickung/archive/MailStore-ImportPreparation/MailStore-ImportPreparation.ps1
2024-01-24 16:42:38 +01:00

1460 lines
126 KiB
PowerShell
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#PowerShell 3.0 Script
#This Script will analyse and complete MailStore MPR Files, based on the EML Files.
#Please use the "_Settings.ini"-File for configurations.
#Digital Data
#Ludwig-Rinn-Strasse 16
#35452 Heuchelheim
#Tel.: 0641 / 202360
#E-Mail: info@didalog.de
#Version Number: 1.0.0.0
#Version Date: 30.12.2016
#Requires Version 3.0
#-----------------------------------------------------------------------------------------------------#
######################################## check for arguments ##########################################
#-----------------------------------------------------------------------------------------------------#
#-----------------------------------------------------------------------------------------------------#
###################################### add additional assemblys #######################################
#-----------------------------------------------------------------------------------------------------#
Add-Type -AssemblyName System.Windows.Forms -ErrorAction Stop
Add-Type -AssemblyName PresentationCore -ErrorAction Stop
Add-Type -AssemblyName PresentationFramework -ErrorAction Stop
#-----------------------------------------------------------------------------------------------------#
############################################ set variables ############################################
#-----------------------------------------------------------------------------------------------------#
Set-Variable -Scope Global -Name ScriptName -Value (($MyInvocation.MyCommand.Name) -split "\.")[0].ToString()
Set-Variable -Scope Global -Name ScriptPath -Value (Split-Path ($MyInvocation.MyCommand.Path))
Set-Variable -Scope Global -Name ConfigFile -Value (Get-ChildItem -Path "$ScriptPath" -Recurse -Filter "$ScriptName`_Settings.ini" -File -Force).FullName
Set-Variable -Scope Global -Name ConfigValues -Value $NULL
Set-Variable -Scope Global -Name Timestamp1 -Value $(Get-Date -Format 'ddMMyyyy')
Set-Variable -Scope Global -Name Timestamp2 -Value $(Get-Date -Format 'ddMMyyyy_HHmmss')
Set-Variable -Scope Global -Name Timestamp3 -Value $(Get-Date -Format 'ddMMyyyy_HHmmssffff')
Set-Variable -Scope Global -Name Timestamp4 -Value $(Get-Date -Format 'yyyyMMdd HH:mm:ss.fff')
Set-Variable -Scope Global -Name Item -Value $NULL
Set-Variable -Scope Global -Name Items -Value $NULL
Set-Variable -Scope Global -Name VersionSeperator -Value "~"
Set-Variable -Scope Global -Name Counter1 -Value 0
Set-Variable -Scope Global -Name LogFile -Value "$ScriptName`_$Timestamp2.log"
Set-Variable -Scope Global -Name LogFileKeepTime -Value 60
Set-Variable -Scope Global -Name LogPath -Value $NULL
Set-Variable -Scope Global -Name LogPaths -Value $NULL
Set-Variable -Scope Global -Name FileDelayAge -Value 5
Set-Variable -Scope Global -Name FileTest -Value $NULL
Set-Variable -Scope Global -Name FileTest2 -Value $NULL
Set-Variable -Scope Global -Name FileTest3 -Value $NULL
Set-Variable -Scope Global -Name PathPath -Value $NULL
Set-Variable -Scope Global -Name PathPath2 -Value $NULL
Set-Variable -Scope Global -Name PathPaths -Value $NULL
Set-Variable -Scope Global -Name Module -Value $NULL
Set-Variable -Scope Global -Name Modules -Value ("Read-ConfigFile","Write-LogFile","Remove-Item-withLogging","Test-Path-withLogging","Load-EMLFile-withLogging","MoveOrCopy-Item-withLogging","Test-FileState-withLogging")
Set-Variable -Scope Global -Name ModuleOverrideSourcePath -Value $NULL
Set-Variable -Scope Global -Name ModuleDefaultSourcePath -Value $NULL
Set-Variable -Scope Global -Name ModuleHKLMRegistryPath -Value "HKLM:\SOFTWARE\Digital Data\Modules"
Set-Variable -Scope Global -Name ModuleHKCURegistryPath -Value "HKCU:\SOFTWARE\Digital Data\Modules"
Set-Variable -Scope Global -Name SMTPDomain -Value $NULL
Set-Variable -Scope Global -Name SMTPDomains -Value $NULL
Set-Variable -Scope Global -Name SMTPDomainsTEMP -Value $NULL
Set-Variable -Scope Global -Name SMTPAddress -Value $NULL
Set-Variable -Scope Global -Name POPAddresses -Value $NULL
Set-Variable -Scope Global -Name POPAddressTO -Value $NULL
Set-Variable -Scope Global -Name POPAddressesTO -Value $NULL
Set-Variable -Scope Global -Name POPAddressCC -Value $NULL
Set-Variable -Scope Global -Name POPAddressesCC -Value $NULL
Set-Variable -Scope Global -Name POPAddressBCC -Value $NULL
Set-Variable -Scope Global -Name POPAddressesBCC -Value $NULL
Set-Variable -Scope Global -Name POPAddressTEMP -Value $NULL
Set-Variable -Scope Global -Name POPAddressesTEMP -Value $NULL
Set-Variable -Scope Global -Name SourcePath -Value $NULL
Set-Variable -Scope Global -Name TargetPath -Value $NULL
Set-Variable -Scope Global -Name ErrorPath -Value $NULL
Set-Variable -Scope Global -Name EMLFile -Value $NULL
Set-Variable -Scope Global -Name EMLFileBaseName -Value $NULL
Set-Variable -Scope Global -Name EMLFileExtension -Value "eml"
Set-Variable -Scope Global -Name EMLFileContent -Value $NULL
Set-Variable -Scope Global -Name EMLObject -Value $NULL
Set-Variable -Scope Global -Name MPRFile -Value $NULL
Set-Variable -Scope Global -Name MPRFileBaseName -Value $NULL
Set-Variable -Scope Global -Name MPRFileExtension -Value "mpr"
Set-Variable -Scope Global -Name MPRFileContent -Value $NULL
Set-Variable -Scope Global -Name MPRFileContentPOPValue -Value $NULL
Set-Variable -Scope Global -Name MPRFileContentPOPIndex -Value $NULL
Set-Variable -Scope Global -Name MPRFileContentSMTPValue -Value $NULL
Set-Variable -Scope Global -Name MPRFileContentSMTPIndex -Value $NULL
Set-Variable -Scope Global -Name TargetPathErrorFileDelayAge -Value 7
#-----------------------------------------------------------------------------------------------------#
############################################ set functions ############################################
#-----------------------------------------------------------------------------------------------------#
Function Load-PowerShellModule {
<#
.SYNOPSIS
Function will load external - additional - PowerShell Modules into current PSSession.
.DESCRIPTION
By working with Modules, this Function is necessary to load external Modul Functions into the current PowerShell Session.
In a productive Enviroment it is recommanded to let this Function set the Registry Key in HKLM for the ModuleSourcePath.
In develepment and Test Enviroment it is possible, to work with distributed Folders with different Modules. Therefor the Parameter
"ModuleOverrideSourcePath" and the preset Variable "ModuleDefaultSourcePath" are made for.
After a successful Import of a Module, Function will Return $True, otherwise a $False.
.REQUIREMENT General
PowerShell V3
.REQUIREMENT Assembly
System.Windows.Forms, PresentationCore, PresentationFramework
.REQUIREMENT Variables
ModuleOverrideSourcePath, ModuleName, Path, Paths, PathTest, FileTest, Result
.REQUIREMENT Variables preSet
ScriptName, ScriptPath, ModuleDefaultSourcePath, Counter
.REQUIREMENT Functions
<NONE>
.VERSION
1.0.0.0 / 11.09.2016
.PARAMETER ModuleName
Give the Module Name, you want to load into the current PSSession (without File-Extension).
.PARAMETER ModuleOverrideSourcePath
Optional Parameter. By giving the ModuleOverrideSourcePath, Function will not check other Paths for the Function you want to load.
.PARAMETER ModuleFileExtension
Optional Parameter. Give the Module File-Extension (regular: "psm1") without a dot ("."), this is just for the checking routine, not the Import itself.')]
.PARAMETER Force
Optional Parameter. By using the Force Parameter, Module will be unload and reload.
.EXAMPLE
Load-PowerShellModule -ModuleName Write-LogFile -ModuleFileExtension psm1
.EXAMPLE
Load-PowerShellModule -ModuleName Write-LogFile -Force
.EXAMPLE
Load-PowerShellModule -ModuleName Write-LogFile -ModuleFileExtension psm1 -ModuleOverrideSourcePath D:\ScriptFiles\Modules
#>
[cmdletbinding()]
Param (
[Parameter(Position=0,Mandatory=$True,ValueFromPipeline=$True,HelpMessage='Give the ModuleName, you want to load into the current PSSession (without File-Extension)')]
[ValidateNotNullOrEmpty()]
[String]$ModuleName,
[Parameter(mandatory=$False,HelpMessage='Optional Parameter. By giving the ModuleOverrideSourcePath, Function will not check other Paths for the Function you want to load.')]
[ValidateNotNullOrEmpty()]
[String]$ModuleOverrideSourcePath,
[Parameter(mandatory=$False,HelpMessage='Optional Parameter. Give the Module File-Extension (regular: "psm1") without a dot ("."), this is just for the checking routine, not the Import itself.')]
[ValidateNotNullOrEmpty()]
[String]$ModuleFileExtension = "psm1",
[Parameter(mandatory=$False,HelpMessage='Optional Parameter. By using the Force Parameter, Module will be unload and reload.')]
[Switch]$Force
) #end param
Process {
#Clear Error Variable
$error.clear()
#If FileExtension was given, remove it! Because otherwise "Import-Module" Function will have trouble importing.
$ModuleName = $ModuleName.Replace(".$ModuleFileExtension","")
Write-Host "DEBUG Info - Load-PowerShellModule: You want to load Module $ModuleName"
#Try this if $ModuleOverrideSourcePath was given by calling the function
IF ((([String]::IsNullOrWhiteSpace($ModuleOverrideSourcePath)) -ne $true) -and (([String]::IsNullOrEmpty($ModuleOverrideSourcePath)) -ne $true)) {
Write-Host ""
Write-Host "DEBUG Info - Load-PowerShellModule: Function has been called with 'ModuleOverrideSourcePath' Parameter input!"
Write-Host "DEBUG Info - Load-PowerShellModule: Testing for existence: $ModuleOverrideSourcePath\$ModuleName.$ModuleFileExtension"
$PathTest = Test-Path -Path "$ModuleOverrideSourcePath\$ModuleName.$ModuleFileExtension" -PathType Leaf
IF ($PathTest -eq $true) {
Write-Host "DEBUG Info - Load-PowerShellModule: $ModuleOverrideSourcePath and ModuleName seems to exist."
Write-Host "DEBUG Info - Load-PowerShellModule: Trying to import Module: $ModuleName.$ModuleFileExtension"
Try {
$Result = Import-Module $ModuleOverrideSourcePath\$ModuleName -Verbose -DisableNameChecking -Scope Global -Force:$Force -PassThru -ErrorVariable Error -ErrorAction SilentlyContinue
IF ("$Result" -eq "$ModuleName") {
Write-Host "DEBUG Info - Load-PowerShellModule: Successfully loaded Module: $ModuleName.$ModuleFileExtension"
Return $True
} #end if
ELSE {
Write-Error "DEBUG Info - Load-PowerShellModule: Unsuccessfully loaded Module: $ModuleName.$ModuleFileExtension"
Return $False
} #end else
} #end try
Catch {
Write-Host "DEBUG Info - Load-PowerShellModule: Error while importing the Module:"
Write-Host "DEBUG Info - Load-PowerShellModule: $ModuleName"
Write-Host $Error
Return $False
} #end catch
} #end if
ELSE {
Write-Host "DEBUG Info - Load-PowerShellModule: ModuleOverrideSourcePath and/or ModuleName seems not to exist."
Write-Host "DEBUG Info - Load-PowerShellModule: Cannot load Module, please check your input!"
Return $False
} #end else
} #end if
#If $ModuleOverrideSourcePath was not given, try to find a matching folder
ELSE {
Write-Host ""
Write-Host "DEBUG Info - Load-PowerShellModule: Function has been called without 'ModuleOverrideSourcePath' Parameter input!"
Write-Host "DEBUG Info - Load-PowerShellModule: Trying to find Module Files on some Places of this Computer."
#Set dynamic Array for locations Modul Path could be, even for some testing.
#The first value of the array is just a dummy and will never be used -but keep it for the array value starting with 0!
[System.Collections.ArrayList]$Paths = @()
Write-Host ""
$Paths.Add("$env:systemroot\") | Out-Null
IF (([String]::IsNullOrEmpty($ModuleDefaultSourcePath)) -or ([String]::IsNullOrWhiteSpace($ModuleDefaultSourcePath))) {
Write-Host "DEBUG Info - Load-PowerShellModule: ModuleDefaultSourcePath was not set! That could be a normal behavior in productive enviroment!"
} #end if
ELSE {
Write-Host "DEBUG Info - Load-PowerShellModule: Possible Path (1): $ModuleDefaultSourcePath" -ErrorAction SilentlyContinue
$Paths.Add("$ModuleDefaultSourcePath") | Out-Null
} #end else
IF ([String]::IsNullOrEmpty($ScriptPath) -or ([String]::IsNullOrWhiteSpace($ScriptPath))) {
Write-Host "DEBUG Info - Load-PowerShellModule: ScriptPath is invalid! That is terrifying! How could that be???"
} #end if
ELSE {
Write-Host "DEBUG Info - Load-PowerShellModule: Possible Path (2): $ScriptPath" -ErrorAction SilentlyContinue
$Paths.Add("$ScriptPath") | Out-Null
Write-Host "DEBUG Info - Load-PowerShellModule: Possible Path (3): $($ScriptPath+"\Module")" -ErrorAction SilentlyContinue
$Paths.Add("$($ScriptPath+"\Module")") | Out-Null
Write-Host "DEBUG Info - Load-PowerShellModule: Possible Path (4): $($ScriptPath+"\Modules")" -ErrorAction SilentlyContinue
$Paths.Add("$($ScriptPath+"\Modules")") | Out-Null
} #end else
IF (([String]::IsNullOrEmpty((Get-Item $ScriptPath).Parent.FullName)) -or ([String]::IsNullOrWhiteSpace((Get-Item $ScriptPath).Parent.FullName))) {
Write-Host "DEBUG Info - Load-PowerShellModule: ScriptPath has no Parent Folders!"
} #end if
ELSE {
Write-Host "DEBUG Info - Load-PowerShellModule: Possible Path (5): $((Get-Item $ScriptPath).Parent.FullName)" -ErrorAction SilentlyContinue
$Paths.Add("$((Get-Item $ScriptPath).Parent.FullName)") | Out-Null
Write-Host "DEBUG Info - Load-PowerShellModule: Possible Path (6): $(((Get-Item $ScriptPath).Parent.FullName)+"\Module")" -ErrorAction SilentlyContinue
$Paths.Add("$(((Get-Item $ScriptPath).Parent.FullName)+"\Module")") | Out-Null
Write-Host "DEBUG Info - Load-PowerShellModule: Possible Path (7): $(((Get-Item $ScriptPath).Parent.FullName)+"\Modules")" -ErrorAction SilentlyContinue
$Paths.Add("$(((Get-Item $ScriptPath).Parent.FullName)+"\Modules")") | Out-Null
} #end else
IF (([String]::IsNullOrEmpty($((Get-ItemProperty -Path "$ModuleHKLMRegistryPath" -Name ModuleSourcePath -ErrorAction SilentlyContinue).ModuleSourcePath))) -or ([String]::IsNullOrWhiteSpace($((Get-ItemProperty -Path "$ModuleHKLMRegistryPath" -Name ModuleSourcePath -ErrorAction SilentlyContinue).ModuleSourcePath)))) {
Write-Host "DEBUG Info - Load-PowerShellModule: ModuleSourcePath was not set to Windows Registry (HKLM)!"
} #end if
ELSE {
Write-Host "DEBUG Info - Load-PowerShellModule: Possible Path (8): $((Get-ItemProperty -Path "$ModuleHKLMRegistryPath" -Name ModuleSourcePath -ErrorAction SilentlyContinue).ModuleSourcePath)" -ErrorAction SilentlyContinue
$Paths.Add("$((Get-ItemProperty -Path "$ModuleHKLMRegistryPath" -Name ModuleSourcePath -ErrorAction SilentlyContinue).ModuleSourcePath)") | Out-Null
} #end else
IF (([String]::IsNullOrEmpty($((Get-ItemProperty -Path "$ModuleHKCURegistryPath" -Name ModuleSourcePath -ErrorAction SilentlyContinue).ModuleSourcePath))) -or ([String]::IsNullOrWhiteSpace($((Get-ItemProperty -Path "$ModuleHKCURegistryPath" -Name ModuleSourcePath -ErrorAction SilentlyContinue).ModuleSourcePath)))) {
Write-Host "DEBUG Info - Load-PowerShellModule: ModuleSourcePath was not set to Windows Registry (HKCU)!"
} #end if
ELSE {
Write-Host "DEBUG Info - Load-PowerShellModule: Possible Path (8): $((Get-ItemProperty -Path "$ModuleHKCURegistryPath" -Name ModuleSourcePath -ErrorAction SilentlyContinue).ModuleSourcePath)" -ErrorAction SilentlyContinue
$Paths.Add("$((Get-ItemProperty -Path "$ModuleHKCURegistryPath" -Name ModuleSourcePath -ErrorAction SilentlyContinue).ModuleSourcePath)") | Out-Null
} #end else
[Int]$Counter = 0
[String]$ModuleSourcePath = $Null
#Loop for multiple Pathtests - for each Path, where psm1 files could be
DO {
$Counter++
Write-Host ""
Write-Host "DEBUG Info - Load-PowerShellModule: Testing mutiple Paths ( $Counter of"($($Paths.Count)-1)") for existence, now testing:"
Write-Host "DEBUG Info - Load-PowerShellModule: $($Paths[$Counter])"
IF ($($Paths[$Counter]) -gt $Null) {
$PathTest = Test-Path $($Paths[$Counter]) -ErrorAction SilentlyContinue
IF ($PathTest -eq $true) {
Write-Host "DEBUG Info - Load-PowerShellModule: Yes, Path seems to exist."
Write-Host "DEBUG Info - Load-PowerShellModule: Lets check, if there are any Module Files, in it."
$FileTest = Get-ChildItem -Path $($Paths[$Counter]) -Filter *.$ModuleFileExtension
IF ($($FileTest.count) -gt 0) {
Write-Host "DEBUG Info - Load-PowerShellModule: Found $($FileTest.count) psm1 Module Files in Path!"
Set-Variable -Name ModuleSourcePath -Value $($Paths[$Counter]) -Scope local
} #end if
ELSE {
Write-Host "DEBUG Info - Load-PowerShellModule: Found no $ModuleFileExtension Module Files in Path!"
} #end else
} #end if
ELSE {
Write-Host "DEBUG Info - Load-PowerShellModule: No, Path seems not to exist."
} #end else
} #end if
ELSE {
Write-Host "DEBUG Info - Load-PowerShellModule: Path seems to be invalid!"
} #end else
} #end do
UNTIL ($Counter -ge ($($Paths.Count)-1) -or ($ModuleSourcePath -eq $($Paths[$Counter])))
IF ($ModuleSourcePath -eq $($Paths[$Counter])) {
Write-Host ""
Write-Host "DEBUG Info - Load-PowerShellModule: Trying to import Module: $ModuleName.$ModuleFileExtension"
Try {
$Result = Import-Module $ModuleSourcePath\$ModuleName -Verbose -DisableNameChecking -Scope Global -Force:$Force -PassThru -ErrorVariable Error -ErrorAction SilentlyContinue
IF ("$Result" -eq "$ModuleName") {
Write-Host "DEBUG Info - Load-PowerShellModule: Successfully loaded Module: $ModuleName.$ModuleFileExtension"
Return $true
} #end if
ELSE {
Write-Error "DEBUG Info - Load-PowerShellModule: Unsuccessfully loaded Module: $ModuleName.$ModuleFileExtension"
Return $False
} #end else
} #end try
Catch {
Write-Host ""
Write-Host "DEBUG Info - Load-PowerShellModule: Loading Module: $ModuleName went wrong."
Write-Host "DEBUG Info - Load-PowerShellModule: Exiting Script, because of this error!"
Write-Host $Error
Return $False
exit
} #end catch
} #end if
ELSE {
Write-Host ""
Write-Host "DEBUG Info - Load-PowerShellModule: Cant locate Module Files automaticlly!"
Write-Host "DEBUG Info - Load-PowerShellModule: Please select Folder in Dialog."
#Prepare Folder Browser Dialog, to choose the Directory with the .psm1 Files.
$FolderBrowserDialog = New-Object System.Windows.Forms.FolderBrowserDialog
$FolderBrowserDialog.Rootfolder = "Desktop"
$FolderBrowserDialog.Description = "Please, choose the Folder, where the Module ""$ModuleName.$ModuleFileExtension"" is stored."
$FolderBrowserDialog.SelectedPath = "$ScriptPath"
$FolderBrowserDialog.ShowNewFolderButton = $true
DO {
#Now show the Folder Browser, if neccessary in a loop
$FolderBrowserDialogShow = $FolderBrowserDialog.ShowDialog()
#By pressing the OK Button..
If ($FolderBrowserDialogShow -eq "OK") {
#Save selected folder path in the variable
$ModuleSourcePath = ($FolderBrowserDialog.SelectedPath)
Write-Host ""
Write-Host "DEBUG Info - Load-PowerShellModule: You choose: $ModuleSourcePath"
Write-Host "DEBUG Info - Load-PowerShellModule: ...testing, if Module ""$ModuleName.$ModuleFileExtension"" can be found there."
$PathTest = (Test-Path $ModuleSourcePath\$ModuleName.$ModuleFileExtension)
IF ($PathTest -eq $True) {
Write-Host "DEBUG Info - Load-PowerShellModule: Module seems to exist, in the selected Folder."
Write-Host "DEBUG Info - Load-PowerShellModule: Now trying to load Module: $ModuleName.$ModuleFileExtension"
Try {
$Result = Import-Module $ModuleSourcePath\$ModuleName -Verbose -DisableNameChecking -Scope Global -Force:$Force -PassThru -ErrorVariable Error -ErrorAction SilentlyContinue
IF ("$Result" -eq "$ModuleName") {
$MessageBoxBody = "Module: $ModuleName.$ModuleFileExtension - successsfully loaded into current PSSession!"
$MessageBoxTitle = "ScriptName: $ScriptName - Module/Section: Load-PowerShellModule"
$MessageBoxButtonType = "OK"
$MessageBoxIcon = "Information"
$MessageBox = [Windows.Forms.MessageBox]::Show($MessageBoxBody,$MessageBoxTitle,$MessageBoxButtonType,$MessageBoxIcon) | Out-Null
} #end if
ELSE {
$MessageBoxBody = "Module: $ModuleName.$ModuleFileExtension - cannot load into current PSSession!"
$MessageBoxTitle = "ScriptName: $ScriptName - Module/Section: Load-PowerShellModule"
$MessageBoxButtonType = "OK"
$MessageBoxIcon = "Warning"
$MessageBox = [Windows.Forms.MessageBox]::Show($MessageBoxBody,$MessageBoxTitle,$MessageBoxButtonType,$MessageBoxIcon) | Out-Null
} #end else
} #end try
Catch {
Write-Host ""
Write-Host "DEBUG Info - Load-PowerShellModule: Loading Module: $ModuleName.$ModuleFileExtension went wrong."
Write-Host "DEBUG Info - Load-PowerShellModule: Exiting Script, because of this error!"
Write-Host $Error
exit
} #end catch
} #end if
ELSE {
Write-Host "DEBUG Info - Load-PowerShellModule: Module seems not to exist, in the selected Folder."
Write-Host "DEBUG Info - Load-PowerShellModule: Please, select another one! ...this Time the right!"
$MessageBoxBody = "Module seems not to exist, in the selected Folder! Please, select another one!"
$MessageBoxTitle = "ScriptName: $ScriptName - Module/Section: Load-PowerShellModule"
$MessageBoxButtonType = "OK"
$MessageBoxIcon = "Warning"
$MessageBox = [Windows.Forms.MessageBox]::Show($MessageBoxBody,$MessageBoxTitle,$MessageBoxButtonType,$MessageBoxIcon) | Out-Null
} #end else
} #end if
#If you didnt pressed the OK Button..
Else {
Write-Host ""
Write-Host "DEBUG Info - Load-PowerShellModule: Operation cancelled by user."
Write-Host "DEBUG Info - Load-PowerShellModule: Exiting Script, because of this!"
exit
} #end else
} #end do
#Variable "$?" is $true when last operation was ok
UNTIL ((($PathTest -eq $True) -and ($? -eq $true)) -or ($FolderBrowserDialogShow -eq "Cancel"))
IF ($ModuleSourcePath -gt $Null) {
Write-Host ""
Write-Host "DEBUG Info - Load-PowerShellModule: Should ModuleSourcePath written to Windows Registry?"
$MessageBoxBody = "Would you like to save the ModulePath to the Windows Registry?"
$MessageBoxTitle = "ScriptName: $ScriptName - Module/Section: Load-PowerShellModule"
$MessageBoxButtonType = "YesNo"
$MessageBoxIcon = "Question"
$MessageBox = [Windows.Forms.MessageBox]::Show($MessageBoxBody,$MessageBoxTitle,$MessageBoxButtonType,$MessageBoxIcon)
IF ($MessageBox -eq 'Yes') {
$PathTest = (Test-Path -Path "$ModuleHKLMRegistryPath")
$MessageBox = $NULL
IF ($PathTest -eq $False) {
Write-Host "DEBUG Info - Load-PowerShellModule: Registry Key seems not to exist."
Write-Host "DEBUG Info - Load-PowerShellModule: Trying to write ModuleSourcepath to HKLM."
Try {
New-Item -Path "$ModuleHKLMRegistryPath" -Force -ErrorVariable Error -ErrorAction Stop | Out-Null
New-ItemProperty -Path "$ModuleHKLMRegistryPath" -Name ModuleSourcePath -Value $ModuleSourcePath -ErrorVariable Error -ErrorAction Stop | Out-Null
$env:PSModulePath = $env:PSModulePath + ";" + "$ModuleSourcePath"
} #end try
Catch {
Write-Host $Error
$MessageBoxBody = "Could not save ModuleSourcePath to Windows Registry! Check your access rights! To bypass this issue you can write the ModuleSourcePath to User Registry (HKCU). Would you?"
$MessageBoxTitle = "ScriptName: $ScriptName - Module/Section: Load-PowerShellModule"
$MessageBoxButtonType = "YesNo"
$MessageBoxIcon = "Question"
$MessageBox = [Windows.Forms.MessageBox]::Show($MessageBoxBody,$MessageBoxTitle,$MessageBoxButtonType,$MessageBoxIcon)
} #end catch
} #end if
ELSEIF ($PathTest -eq $True) {
Write-Host "DEBUG Info - Load-PowerShellModule: Registry Key seems to exist."
Write-Host "DEBUG Info - Load-PowerShellModule: Trying to write ModuleSourcepath to HKLM."
Try {
Set-ItemProperty -Path "$ModuleHKLMRegistryPath" -Name ModuleSourcePath -Value $ModuleSourcePath -ErrorVariable Error -ErrorAction Stop | Out-Null
} #end try
Catch {
Write-Host $Error
$MessageBoxBody = "Could not save ModuleSourcePath to Windows Registry! Check your access rights! To Bypass Error: Write ModuleSource Path to User Registry (HKCU)?"
$MessageBoxTitle = "ScriptName: $ScriptName - Module/Section: Load-PowerShellModule"
$MessageBoxButtonType = "YesNo"
$MessageBoxIcon = "Question"
$MessageBox = [Windows.Forms.MessageBox]::Show($MessageBoxBody,$MessageBoxTitle,$MessageBoxButtonType,$MessageBoxIcon)
} #end catch
} #end elseif
ELSE {
Write-Host "DEBUG Info - Load-PowerShellModule: Something went wrong, by getting the ModuleSourcePath!"
Write-Host "DEBUG Info - Load-PowerShellModule: Exiting Script, because of this!"
exit
} #end else
#Block for trying to write the ModuleSourcePath to the User Registry, if System Registry failed.
IF ($MessageBox -eq 'Yes') {
$PathTest = (Test-Path -Path "$ModuleHKCURegistryPath")
$MessageBox = $NULL
IF ($PathTest -eq $False) {
Write-Host "DEBUG Info - Load-PowerShellModule: Registry Key seems not to exist."
Write-Host "DEBUG Info - Load-PowerShellModule: Trying to write ModuleSourcepath to HKCU."
Try {
New-Item -Path "$ModuleHKCURegistryPath" -Force -ErrorVariable Error -ErrorAction Stop | Out-Null
New-ItemProperty -Path "$ModuleHKCURegistryPath" -Name ModuleSourcePath -Value $ModuleSourcePath -ErrorAction Stop | Out-Null
$env:PSModulePath = $env:PSModulePath + ";" + "$ModuleSourcePath"
} #end try
Catch {
Write-Host $Error
$MessageBoxBody = "Could not save ModuleSourcePath to Windows Registry! Not even to User Registry! Check your access rights! Exiting now.."
$MessageBoxTitle = "ScriptName: $ScriptName - Module/Section: Load-PowerShellModule"
$MessageBoxButtonType = "OK"
$MessageBoxIcon = "Warning"
$MessageBox = [Windows.Forms.MessageBox]::Show($MessageBoxBody,$MessageBoxTitle,$MessageBoxButtonType,$MessageBoxIcon)
exit
} #end catch
} #end if
ELSEIF ($PathTest -eq $True) {
Write-Host "DEBUG Info - Load-PowerShellModule: Registry Key seems to exist."
Write-Host "DEBUG Info - Load-PowerShellModule: Trying to write ModuleSourcepath to HKCU."
Try {
Set-ItemProperty -Path "$ModuleHKCURegistryPath" -Name ModuleSourcePath -Value $ModuleSourcePath -ErrorVariable Error -ErrorAction Stop | Out-Null
} #end try
Catch {
Write-Host $Error
$MessageBoxBody = "Could not save ModuleSourcePath to Windows Registry! Not even to User Registry! Check your access rights! Exiting now.."
$MessageBoxTitle = "ScriptName: $ScriptName - Module/Section: Load-PowerShellModule"
$MessageBoxButtonType = "OK"
$MessageBoxIcon = "Warning"
$MessageBox = [Windows.Forms.MessageBox]::Show($MessageBoxBody,$MessageBoxTitle,$MessageBoxButtonType,$MessageBoxIcon)
exit
} #end catch
} #end elseif
ELSE {
Write-Host "DEBUG Info - Load-PowerShellModule: Something went wrong, by getting the ModuleSourcePath!"
Write-Host "DEBUG Info - Load-PowerShellModule: Exiting Script, because of this!"
exit
} #end else
} #end if
} #end if
ELSE {
Write-Host "DEBUG Info - Load-PowerShellModule: You choose, not to save the ModuleSourcePath to the Windows Registry!"
$MessageBoxBody = "You choose, not to save the ModuleSourcePath to the Windows Registry!"
$MessageBoxTitle = "ScriptName: $ScriptName - Module/Section: Load-PowerShellModule"
$MessageBoxButtonType = "OK"
$MessageBoxIcon = "Warning"
$MessageBox = [Windows.Forms.MessageBox]::Show($MessageBoxBody,$MessageBoxTitle,$MessageBoxButtonType,$MessageBoxIcon)
} #end else
} #end if
ELSE {
Write-Host "DEBUG Info - Load-PowerShellModule: Something went wrong, by getting the ModuleSourcePath!"
Write-Host "DEBUG Info - Load-PowerShellModule: Exiting Script, because of this!"
exit
} #end else
} #end else
} #end else
} #end process
} #end function
#-----------------------------------------------------------------------------------------------------#
########################################### preparing part ############################################
#-----------------------------------------------------------------------------------------------------#
#Clear Console Content
Clear-Host
#Load external Modules - use Force ( -Force) Parameter, to reload in every run
FOREACH ($Module in $Modules) {
$Result = Load-PowerShellModule -ModuleName $Module -Force
IF ($Result -eq $False) {
Write-Host "DEBUG Info: Module: $Module was not succesful been loaded!"
Write-Host "DEBUG Info: Please load the Module and try again, running this Function/Module!"
Write-Host "DEBUG Info: Exiting, because of this Issue."
Write-Host $Error
EXIT
} #end if
} #end foreach
#Read ConfigFile, to get all values
Set-Variable -Scope Global -Name ConfigValues -Value (Read-ConfigFile -ConfigFile $ConfigFile) -Force
#Allocate Variable Values, depending on the read ConfigFile
Set-Variable -Scope Global -Name LogPaths -Value (Read-ConfigFile -ConfigLabel LogPath) -Force
Set-Variable -Scope Global -Name LogFileKeepTime -Value (Read-ConfigFile -ConfigLabel LogFileKeepTime) -Force
Set-Variable -Scope Global -Name VersionSeperator -Value (Read-ConfigFile -ConfigLabel VersionSeperator) -Force
Set-Variable -Scope Global -Name FileDelayAge -Value (Read-ConfigFile -ConfigLabel FileDelayAge) -Force
Set-Variable -Scope Global -Name SMTPDomains -Value (Read-ConfigFile -ConfigLabel SMTPDomains) -Force
Set-Variable -Scope Global -Name SourcePath -Value (Read-ConfigFile -ConfigLabel SourcePath) -Force
Set-Variable -Scope Global -Name TargetPath -Value (Read-ConfigFile -ConfigLabel TargetPath) -Force
Set-Variable -Scope Global -Name ErrorPath -Value (Read-ConfigFile -ConfigLabel ErrorPath) -Force
Set-Variable -Scope Global -Name EMLFileExtension -Value (Read-ConfigFile -ConfigLabel EMLFileExtension) -Force
Set-Variable -Scope Global -Name MPRFileExtension -Value (Read-ConfigFile -ConfigLabel MPRFileExtension) -Force
Set-Variable -Scope Global -Name TargetPathErrorFileDelayAge -Value (Read-ConfigFile -ConfigLabel TargetPathErrorFileDelayAge) -Force
#Rebuild the Array, to remove possible Blanks
[Array]$SMTPDomains = $SMTPDomains -split ","
[Array]$SMTPDomains = $SMTPDomains -split ";"
[System.Collections.ArrayList]$SMTPDomainsTEMP = @()
FOREACH ($SMTPDomain in $SMTPDomains) {
$SMTPDomain = ($SMTPDomain.TrimStart())
$SMTPDomain = ($SMTPDomain.TrimEnd())
$SMTPDomainsTEMP.Add("$SMTPDomain")
} #end foreach
[Array]$SMTPDomains = $NULL
[Array]$SMTPDomains = $SMTPDomainsTEMP
#-----------------------------------------------------------------------------------------------------#
############################################# main part ###############################################
#-----------------------------------------------------------------------------------------------------#
Write-Logfile -LogLine " "
Write-Logfile -LogLine "********************************************************************************"
Write-Logfile -LogLine "Program Startup: $ScriptName on $env:COMPUTERNAME,"
Write-Logfile -LogLine "from Account $env:USERDOMAIN\$env:USERNAME."
Write-Logfile -LogLine "********************************************************************************"
$PathTest = Test-Path-withLogging -Path $SourcePath -Action "ignore"
$PathTest2 = Test-Path-withLogging -Path $TargetPath
IF (($PathTest -eq $True) -and ($PathTest2 -eq $True)) {
#Check for files which have to be processed
IF (($FileDelayAge) -and ($FileDelayAge -gt 0)) {
Write-Host "DEBUG Info: FileDelayAge set to $FileDelayAge"
$Items = (Get-ChildItem -Path $SourcePath -Filter "*.$EMLFileExtension" | where {$_.lastwritetime -lt $((Get-Date).AddMinutes(-$FileDelayAge)) -and -not $_.psiscontainer})
} #end if
ELSE {
Write-Host "DEBUG Info: FileDelayAge set to $FileDelayAge"
$Items = (Get-ChildItem -Path $SourcePath -Filter "*.$EMLFileExtension")
} #end else
#If there are files, go on to process them
IF ($Items){
FOREACH ($Item in $Items) {
$EMLFile = $($Item.FullName)
$EMLFileBaseName = ([System.IO.Path]::GetFileName($($Item.FullName)))
$MPRFile = ([System.IO.Path]::GetDirectoryName($($Item.FullName)).ToString() + "\" + [System.IO.Path]::GetFileNameWithoutExtension($($Item.FullName)) + "." + $MPRFileExtension)
$MPRFileBaseName = ([System.IO.Path]::GetFileNameWithoutExtension($($Item.FullName)) + "." + $MPRFileExtension)
Write-LogFile -LogLine " "
Write-Logfile -LogLine "--------------------------------------------------------------------------------"
Write-LogFile -LogLine "Checking, if there is a MailStore Proxy File,"
Write-LogFile -LogLine "for E-Mail $($Item.FullName)."
Write-Logfile -LogLine "--------------------------------------------------------------------------------"
Write-LogFile -LogLine "Current Source EML File: $EMLFile"
Write-LogFile -LogLine "Current Target MPR File: $MPRFile"
$FileTest = Test-Path -Path $MPRFile -PathType Leaf
$FileTest2 = Test-Path -Path $TargetPath\$MPRFileBaseName -PathType Leaf
$FileTest3 = Test-Path -Path $TargetPath\$EMLFileBaseName -PathType Leaf
IF (($FileTest -eq $True) -and (($FileTest2 -eq $False) -or ($FileTest3 -eq $False))) {
Write-LogFile -LogLine "Source MPR File exists!"
#Checking if Files are Read and writeable for the next Steps
$FileTest2 = Test-FileState-withLogging -SourceFile "$SourcePath\$MPRFileBaseName" -Action writetest
$FileTest3 = Test-FileState-withLogging -SourceFile "$SourcePath\$EMLFileBaseName" -Action writetest
IF (($FileTest2 -eq "writeable") -and ($FileTest3 -eq "writeable")) {
Try {
Write-LogFile -LogLine "Reading MPRFileContent..."
[System.Collections.ArrayList]$MPRFileContent = @()
$MPRFileContent = (Get-Content $MPRFile -ErrorAction Stop)
[System.Collections.ArrayList]$MPRFileContent = @($MPRFileContent)
} #end try
Catch {
Write-LogFile -LogLine "Error by reading MPRFileContent"
} #end catch
#If POP Activity found in the File
IF ($MPRFileContent -match 'POP3-Recipient:') {
#Identify row/line which include the POP marker
[String]$MPRFileContentPOPValue = $MPRFileContent | Where({$_ -match 'POP3-Recipient:'})
[int]$MPRFileContentPOPIndex = $MPRFileContent.IndexOf($MPRFileContentPOPValue)
Write-LogFile -LogLine "Found POP transaction in file (on line: $MPRFileContentPOPIndex)."
IF ($MPRFileContentPOPValue -match $SMTPDomains) {
Write-LogFile -LogLine "Found valid POP transaction in file:"
Write-LogFile -LogLine "$MPRFileContentSMTPValue"
Write-LogFile -LogLine "There is nothing to do, just moving EML and MPR files"
Try {
MoveOrCopy-Item-withLogging -SourceFile $EMLFile -DestinationPath $TargetPath -Action move
MoveOrCopy-Item-withLogging -SourceFile $MPRFile -DestinationPath $TargetPath -Action move
} #end try
Catch {
Write-LogFile -LogLine "Error, could not move files:"
Write-LogFile -LogLine $EMLFile
Write-LogFile -LogLine $MPRFile
} #end catch
} #end if
ELSEIF ($MPRFileContentPOPValue -notmatch $SMTPDomains) {
#Prepare dynamic Array for temp E-Mail adresses
[System.Collections.ArrayList]$POPAddressesTEMP = @()
#Retrieve EML Object
$EMLObject = Load-EMLFile-withLogging -EMLFileName $EMLFile
#Read EML Mail TO Attributes to get POP Receiver Adresses
IF (($EMLObject.TO).count -gt 0) {
Write-LogFile -LogLine "Found $($POPAddressesBCC.Count) E-Mail Adresses in the BCC Attribut."
[Array]$POPAddressesTO = ($EMLObject.TO)
[Array]$POPAddressesTO = ($POPAddressesTO -Split ',')
[Array]$POPAddressesTO = ($POPAddressesTO -Split ';')
[Array]$POPAddressesTO = ($POPAddressesTO -Split ' ')
FOREACH ($POPAddressTO in $POPAddressesTO) {
$POPAddressTO = ($POPAddressTO | Select-String -Pattern $SMTPDomains -AllMatches | % { $_.Matches } | % { $_.Value })
#Fill array, if Value is greater than $NULL
IF ($POPAddressTO) {
Write-Host "DEBUG Info: Valid POPAddressTO: $POPAddressTO"
$POPAddressTO = ($POPAddressTO -Replace('\<|\>|\(|\)|\[|\]|\"|\s\,\;\:\=\\',''))
$POPAddressTO = ($POPAddressTO -Replace("'",""))
$POPAddressTO = ($POPAddressTO.TrimStart())
$POPAddressTO = ($POPAddressTO.TrimEnd())
$POPAddressTO = ($POPAddressTO.ToLower())
[Array]$POPAddressesTEMP = ($POPAddressesTEMP + $POPAddressTO)
[Array]$POPAddressesTEMP = ($POPAddressesTEMP | Sort-Object)
[Array]$POPAddressesTEMP = ($POPAddressesTEMP | Select -Unique)
} #end if
ELSE {
Write-Host "DEBUG Info: Invalid POPAddressTO!"
} #end else
} #end foreach
} #end if
ELSE {
Write-LogFile -LogLine "There are no E-Mail addresses in the TO Attribut of this Mail!"
} #end else
#Read EML Mail CC Attributes to get POP Receiver Adresses
IF (($EMLObject.CC).count -gt 0) {
Write-LogFile -LogLine "Found $($POPAddressesCC.Count) E-Mail Adresses in the CC Attribut."
[Array]$POPAddressesCC = ($EMLObject.CC)
[Array]$POPAddressesCC = ($POPAddressesCC -Split ',')
[Array]$POPAddressesCC = ($POPAddressesCC -Split ';')
[Array]$POPAddressesCC = ($POPAddressesCC -Split ' ')
FOREACH ($POPAddressCC in $POPAddressesCC) {
$POPAddressCC = ($POPAddressCC | Select-String -Pattern $SMTPDomains -AllMatches | % { $_.Matches } | % { $_.Value })
#Fill array, if Value is greater than $NULL
IF ($POPAddressCC) {
Write-Host "DEBUG Info: Valid POPAddressCC: $POPAddressCC"
$POPAddressCC = ($POPAddressCC -Replace('\<|\>|\(|\)|\[|\]|\"|\s\,\;\:\=\\',''))
$POPAddressCC = ($POPAddressCC -Replace("'",""))
$POPAddressCC = ($POPAddressCC.TrimStart())
$POPAddressCC = ($POPAddressCC.TrimEnd())
$POPAddressCC = ($POPAddressCC.ToLower())
[Array]$POPAddressesTEMP = ($POPAddressesTEMP + $POPAddressCC)
[Array]$POPAddressesTEMP = ($POPAddressesTEMP | Sort-Object)
[Array]$POPAddressesTEMP = ($POPAddressesTEMP | Select -Unique)
} #end if
ELSE {
Write-Host "DEBUG Info: Invalid POPAddressCC!"
} #end else
} #end foreach
} #end if
ELSE {
Write-LogFile -LogLine "There are no E-Mail addresses in the CC Attribut of this Mail!"
} #end else
#Read EML Mail BCC Attributes to get POP Receiver Adresses
IF (($EMLObject.BCC).count -gt 0) {
Write-LogFile -LogLine "Found $($POPAddressesBCC.Count) E-Mail Adresses in the BCC Attribut."
[Array]$POPAddressesBCC = ($EMLObject.BCC)
[Array]$POPAddressesBCC = ($POPAddressesBCC -Split ',')
[Array]$POPAddressesBCC = ($POPAddressesBCC -Split ';')
[Array]$POPAddressesBCC = ($POPAddressesBCC -Split ' ')
FOREACH ($POPAddressBCC in $POPAddressesBCC) {
$POPAddressBCC = ($POPAddressBCC | Select-String -Pattern $SMTPDomains -AllMatches | % { $_.Matches } | % { $_.Value })
#Fill array, if Value is greater than $NULL
IF ($POPAddressBCC) {
Write-Host "DEBUG Info: Valid POPAddressCC: $POPAddressCC"
$POPAddressBCC = ($POPAddressBCC -Replace('\<|\>|\(|\)|\[|\]|\"|\s\,\;\:\=\\',''))
$POPAddressBCC = ($POPAddressBCC -Replace("'",""))
$POPAddressBCC = ($POPAddressBCC.TrimStart())
$POPAddressBCC = ($POPAddressBCC.TrimEnd())
$POPAddressBCC = ($POPAddressBCC.ToLower())
[Array]$POPAddressesTEMP = ($POPAddressesTEMP + $POPAddressBCC)
[Array]$POPAddressesTEMP = ($POPAddressesTEMP | Sort-Object)
[Array]$POPAddressesTEMP = ($POPAddressesTEMP | Select -Unique)
} #end if
ELSE {
Write-Host "DEBUG Info: Invalid POPAddressBCC!"
} #end else
} #end foreach
} #end if
ELSE {
Write-LogFile -LogLine "There are no E-Mail addresses in the BCC Attribut of this Mail!"
} #end else
#Prepare final dynamic Array for E-Mail addresses
[System.Collections.ArrayList]$POPAddresses = @()
IF ($POPAddressesTEMP.count -lt 1) {
Write-LogFile -LogLine "Summary: Found none valid E-Mail adress(es) for this Mail, via EML Object."
Write-LogFile -LogLine "Now trying via EML Sourcecode!"
Try {
$EMLFileContent = Get-Content $EMLFile
[String]$POPAddressesTEMP.Add(($EMLFileContent | Select-String -Pattern $SMTPDomains -AllMatches | % { $_.Matches } | % { $_.Value }))
[Array]$POPAddressesTEMP = $POPAddressesTEMP -split " "
} #end try
Catch {
Write-LogFile -LogLine "Cannot get Sourcecode from EMLFile: $EMLFile"
} #end catch
IF ($POPAddressesTEMP.Count -gt 1 ) {
Write-LogFile -LogLine "Found $($POPAddressesTEMP.Count) E-Mail addresses in the EML Sourcecode."
FOREACH ($POPAddressTEMP in $POPAddressesTEMP) {
$POPAddressTEMP = ($POPAddressTEMP -Replace('<',''))
$POPAddressTEMP = ($POPAddressTEMP -Replace('>',''))
$POPAddressTEMP = ($POPAddressTEMP -Replace('"',''))
$POPAddressTEMP = ($POPAddressTEMP -Replace("'",""))
$POPAddressTEMP = ($POPAddressTEMP.TrimStart())
$POPAddressTEMP = ($POPAddressTEMP.TrimEnd())
$POPAddressTEMP = ($POPAddressTEMP.ToLower())
$POPAddresses.Add(('POP3-Recipient: '+ $POPAddressTEMP | Select-String -Pattern $SMTPDomains -AllMatches | % { $_.Matches } | % { $_.Value }))
$POPAddresses.Remove($NULL)
} #end foreach
#Filter and remove duplicates
[Array]$POPAddresses = $POPAddresses | Sort-Object
[Array]$POPAddresses = $POPAddresses | Select -Unique
} #end if
ELSEIF ($POPAddressesTEMP.Count -eq 1 ) {
Write-LogFile -LogLine "Found exacly one E-Mail address in the EML Sourcecode."
} #end elseif
} #end if
ELSEIF ($POPAddressesTEMP.count -gt 0) {
Write-LogFile -LogLine "Summary: Found $($POPAddressesTEMP.Count) valid E-Mail adress(es) for this Mail, via EML Object."
[Array]$POPAddressesTEMP = $POPAddressesTEMP | Sort-Object
[Array]$POPAddressesTEMP = $POPAddressesTEMP | Select -Unique
FOREACH ($POPAddressTEMP in $POPAddressesTEMP) {
IF ($POPAddressTEMP) {
$POPAddressTEMP = 'POP3-Recipient: '+$POPAddressTEMP
$POPAddresses.Add($POPAddressTEMP)
} #end if
} #end foreach
} #end elseif
#Replace and add new values to the array
$MPRFileContent.RemoveAt($MPRFileContentPOPIndex)
$MPRFileContent.InsertRange($MPRFileContentPOPIndex, $POPAddresses)
Try {
Write-LogFile -LogLine " "
Write-LogFile -LogLine "Creating new and corrected MPR File."
New-Item -ItemType "file" $TargetPath\$MPRFileBaseName -Force -ErrorAction Stop
Clear-Content $TargetPath\$MPRFileBaseName -Force -ErrorAction Stop
$MPRFileContent | Set-Content $TargetPath\$MPRFileBaseName -Force -ErrorAction Stop
MoveOrCopy-Item-withLogging -SourceFile $EMLFile -DestinationPath $TargetPath -Action move
Write-LogFile -LogLine "Removing old MPR File."
Remove-Item -Path $MPRFile -Force -ErrorAction Stop
} #end try
Catch {
Write-LogFile -LogLine "Error, could not write to file:"
Write-LogFile -LogLine $MPRFile
Write-LogFile -LogLine "Please check your access rights!"
} #end catch
} #end elseif
ELSE {
Write-LogFile -LogLine " "
Write-LogFile -LogLine "Ivalide MPR File!"
Write-LogFile -LogLine "Moving to ErrorPath: $ErrorPath"
Try {
MoveOrCopy-Item-withLogging -SourceFile $EMLFile -DestinationPath $ErrorPath -Action move
MoveOrCopy-Item-withLogging -SourceFile $MPRFile -DestinationPath $ErrorPath -Action move
} #end try
Catch {
Write-LogFile -LogLine "Error, could not move files:"
Write-LogFile -LogLine $EMLFile
Write-LogFile -LogLine $MPRFile
} #end catch
} #end else
} #end if
#If SMTP Activity found in the File
ELSEIF ($MPRFileContent -match 'SMTP-Mail-From') {
#Identify row/line which include the SMTP marker
[String]$MPRFileContentSMTPValue = $MPRFileContent | Where({$_ -match 'SMTP-Mail-From'})
[int]$MPRFileContentSMTPIndex = $MPRFileContent.IndexOf($MPRFileContentSMTPValue)
Write-LogFile -LogLine "Found SMTP transaction in file (on line: $MPRFileContentSMTPIndex)."
IF ($MPRFileContentSMTPValue -match $SMTPDomains) {
Write-LogFile -LogLine "Found valid SMTP transaction in File:"
Write-LogFile -LogLine "$MPRFileContentSMTPValue"
Write-LogFile -LogLine "There is nothing to do, just moving EML and MPR files"
Try {
MoveOrCopy-Item-withLogging -SourceFile $EMLFile -DestinationPath $TargetPath -Action move
MoveOrCopy-Item-withLogging -SourceFile $MPRFile -DestinationPath $TargetPath -Action move
} #end try
Catch {
Write-LogFile -LogLine "Error, could not move files:"
Write-LogFile -LogLine $EMLFile
Write-LogFile -LogLine $MPRFile
} #end catch
} #end if
ELSEIF ($MPRFileContentSMTPValue -notmatch $SMTPDomains) {
Write-LogFile -LogLine "Found invalid SMTP transaction in file:"
Write-LogFile -LogLine "$MPRFileContentSMTPValue"
#Retrieve EML Object
$EMLObject = Load-EMLFile-withLogging -EMLFileName $EMLFile
#reset SMTPAddress
$SMTPAddress = $NULL
IF ($EMLObject.From -match $SMTPDomains) {
Write-LogFile -LogLine "Found exacly one E-Mail address in the FROM Attribut."
$SMTPAddress = ($EMLObject.From)
$SMTPAddress = ($SMTPAddress | Select-String -Pattern $SMTPDomains -AllMatches | % { $_.Matches } | % { $_.Value })
$SMTPAddress = ($SMTPAddress -Replace('\<|\>|\(|\)|\[|\]|\"|\s\,\;\:\=\\',''))
$SMTPAddress = ($SMTPAddress.TrimStart())
$SMTPAddress = ($SMTPAddress.TrimEnd())
$SMTPAddress = ($SMTPAddress.ToLower())
} #end if
ELSE {
Write-LogFile -LogLine "There is no E-Mail address in the FROM Attribut of this Mail!"
Write-LogFile -LogLine "Summary: Found none valid E-Mail adress(es) for this Mail, via EML Object."
Write-LogFile -LogLine "Now trying via EML Sourcecode!"
Try {
$EMLFileContent = Get-Content $EMLFile
$SMTPAddress = ($EMLFileContent | Select-String -Pattern $SMTPDomains -AllMatches | Select -First 1)
} #end try
Catch {
Write-LogFile -LogLine "Cannot get Sourcecode from EMLFile: $EMLFile"
} #end catch
} #end else
IF ($SMTPAddress) {
#Filter and remove illegal chars
$SMTPAddress = ($SMTPAddress -Replace('\<|\>|\(|\)|\[|\]|\"|\s\,\;\:\=\\',''))
$SMTPAddress = ($SMTPAddress -Replace("'",""))
$SMTPAddress = ($SMTPAddress -Replace('From',''))
$SMTPAddress = ($SMTPAddress.TrimStart())
$SMTPAddress = ($SMTPAddress.TrimEnd())
$SMTPAddress = ($SMTPAddress.ToLower())
$SMTPAddress = ($SMTPAddress.Split(' '))
IF ($SMTPAddress -is [Array] -and ($SMTPAddress[-1])) {
$SMTPAddress = $SMTPAddress[-1]
$SMTPAddress = $SMTPAddress.ToString()
} #end if
$SMTPAddress = 'SMTP-Mail-From: '+$SMTPAddress
#Replace and add new values to the string
$MPRFileContent.RemoveAt($MPRFileContentSMTPIndex)
$MPRFileContent.Insert($MPRFileContentSMTPIndex, $SMTPAddress)
Try {
Write-LogFile -LogLine " "
Write-LogFile -LogLine "Creating new and corrected MPR File."
New-Item -ItemType "file" $TargetPath\$MPRFileBaseName -Force -ErrorAction Stop
Clear-Content $TargetPath\$MPRFileBaseName -Force -ErrorAction Stop
$MPRFileContent | Set-Content $TargetPath\$MPRFileBaseName -Force -ErrorAction Stop
MoveOrCopy-Item-withLogging -SourceFile $EMLFile -DestinationPath $TargetPath -Action move
Write-LogFile -LogLine "Removing old MPR File."
Remove-Item -Path $MPRFile -Force -ErrorAction Stop
} #end try
Catch {
Write-LogFile -LogLine "Error, could not write to file:"
Write-LogFile -LogLine $MPRFile
Write-LogFile -LogLine "Please check your access rights!"
} #end catch
} #end else
ELSE {
Write-LogFile -LogLine "Summary: Found none valid E-Mail adress(es) for this Mail, via EML Object or Sourcecode!"
} #end else
} #end elseif
ELSE {
Write-LogFile -LogLine " "
Write-LogFile -LogLine "Ivalide MPR File!"
Write-LogFile -LogLine "Moving to ErrorPath: $ErrorPath"
Try {
MoveOrCopy-Item-withLogging -SourceFile $EMLFile -DestinationPath $ErrorPath -Action move
MoveOrCopy-Item-withLogging -SourceFile $MPRFile -DestinationPath $ErrorPath -Action move
} #end try
Catch {
Write-LogFile -LogLine "Error, could not move files:"
Write-LogFile -LogLine $EMLFile
Write-LogFile -LogLine $MPRFile
} #end catch
} #end else
} #end elseif
ELSE {
Write-LogFile -LogLine " "
Write-LogFile -LogLine "Ivalide MPR File!"
Write-LogFile -LogLine "Did not found any POP or SMTP activity in File."
Write-LogFile -LogLine "Moving to ErrorPath: $ErrorPath"
Try {
MoveOrCopy-Item-withLogging -SourceFile $EMLFile -DestinationPath $ErrorPath -Action move
MoveOrCopy-Item-withLogging -SourceFile $MPRFile -DestinationPath $ErrorPath -Action move
} #end try
Catch {
Write-LogFile -LogLine "Error, could not move files:"
Write-LogFile -LogLine $EMLFile
Write-LogFile -LogLine $MPRFile
} #end catch
} #end else
} #end if
ELSE {
Write-LogFile -LogLine " "
Write-LogFile -LogLine "MPR or EML File seems to be not read- or writeable!"
Write-LogFile -LogLine "$MPRFileBaseName -> Test: $FileTest2"
Write-LogFile -LogLine "$EMLFileBaseName -> Test: $FileTest3"
Write-LogFile -LogLine "Skipping because of this..."
} #end else
} #end if
ELSEIF (($FileTest2 -eq $True) -or ($FileTest3 -eq $True)) {
Write-LogFile -LogLine " "
Write-LogFile -LogLine "MPR or EML File seems already to exist, in the Target Path!"
Write-LogFile -LogLine "$MPRFileBaseName -> Test: $FileTest2"
Write-LogFile -LogLine "$EMLFileBaseName -> Test: $FileTest3"
Write-LogFile -LogLine "Skipping because of this..."
} #end elseif
ELSE {
Write-LogFile -LogLine " "
Write-LogFile -LogLine "MPR File seems not to exist!"
} #end else
} #end foreach
} #end if
#If there are no files, ... just chill
ELSE {
Write-Logfile -LogLine " "
Write-LogFile -LogLine "Found no ($EMLFileExtension) Files in Directory (must be older than $FileDelayAge Minute(s), to be processed):"
Write-LogFile -LogLine "$SourcePath"
Write-LogFile -LogLine "... so there is nothing to do yet, exiting."
} #end else
} #end if
ELSE {
Write-LogFile -LogLine " "
Write-LogFile -LogLine "Invalid Source or Target Path, or access denied on:"
Write-LogFile -LogLine "$SourcePath Test: $PathTest"
Write-LogFile -LogLine "$TargetPath Test: $PathTest2"
} #end else
IF ($TargetPathErrorFileDelayAge -gt 0) {
$Items = (Get-ChildItem -Path $TargetPath -Filter "*.$EMLFileExtension, *.$MPRFileExtension" | where {$_.lastwritetime -lt $((Get-Date).AddDays(-$TargetPathErrorFileDelayAge)) -and -not $_.psiscontainer})
FOREACH ($Item in $Items) {
MoveOrCopy-Item-withLogging -SourceFile $Item -DestinationPath $TargetPath -Action move
} #end foreach
} #end if
Write-Logfile -LogLine " "
Write-Logfile -LogLine "--------------------------------------------------------------------------------"
Write-Logfile -LogLine "Checking for old LogFiles."
Write-Logfile -LogLine "--------------------------------------------------------------------------------"
Remove-Item-withLogging -Path $LogPath -FileKeepTime $LogFileKeepTime -FileBaseName $ScriptName
Write-Logfile -LogLine " "
Write-Logfile -LogLine "********************************************************************************"
Write-Logfile -LogLine "Program Completed: $ScriptName on $env:COMPUTERNAME,"
Write-Logfile -LogLine "from Account $env:USERDOMAIN\$env:USERNAME."
Write-Logfile -LogLine "********************************************************************************"
#-----------------------------------------------------------------------------------------------------#
########################################### finishing part ############################################
#-----------------------------------------------------------------------------------------------------#
Remove-Variable -Name ScriptName -Force -ErrorAction SilentlyContinue
Remove-Variable -Name ScriptPath -Force -ErrorAction SilentlyContinue
Remove-Variable -Name ConfigFile -Force -ErrorAction SilentlyContinue
Remove-Variable -Name ConfigValues -Force -ErrorAction SilentlyContinue
Remove-Variable -Name Timestamp1 -Force -ErrorAction SilentlyContinue
Remove-Variable -Name Timestamp2 -Force -ErrorAction SilentlyContinue
Remove-Variable -Name Timestamp3 -Force -ErrorAction SilentlyContinue
Remove-Variable -Name Timestamp4 -Force -ErrorAction SilentlyContinue
Remove-Variable -Name Item -Force -ErrorAction SilentlyContinue
Remove-Variable -Name Items -Force -ErrorAction SilentlyContinue
Remove-Variable -Name VersionSeperator -Force -ErrorAction SilentlyContinue
Remove-Variable -Name FileDelayAge -Force -ErrorAction SilentlyContinue
Remove-Variable -Name FileTest -Force -ErrorAction SilentlyContinue
Remove-Variable -Name FileTest2 -Force -ErrorAction SilentlyContinue
Remove-Variable -Name FileTest3 -Force -ErrorAction SilentlyContinue
Remove-Variable -Name PathTest -Force -ErrorAction SilentlyContinue
Remove-Variable -Name PathTest2 -Force -ErrorAction SilentlyContinue
Remove-Variable -Name PathTests -Force -ErrorAction SilentlyContinue
Remove-Variable -Name Result -Force -ErrorAction SilentlyContinue
Remove-Variable -Name Counter1 -Force -ErrorAction SilentlyContinue
Remove-Variable -Name LogFile -Force -ErrorAction SilentlyContinue
Remove-Variable -Name LogFileKeepTime -Force -ErrorAction SilentlyContinue
Remove-Variable -Name LogPath -Force -ErrorAction SilentlyContinue
Remove-Variable -Name LogPaths -Force -ErrorAction SilentlyContinue
Remove-Variable -Name Module -Force -ErrorAction SilentlyContinue
Remove-Variable -Name Modules -Force -ErrorAction SilentlyContinue
Remove-Variable -Name ModuleOverrideSourcePath -Force -ErrorAction SilentlyContinue
Remove-Variable -Name ModuleDefaultSourcePath -Force -ErrorAction SilentlyContinue
Remove-Variable -Name ModuleHKLMRegistryPath -Force -ErrorAction SilentlyContinue
Remove-Variable -Name ModuleHKCURegistryPath -Force -ErrorAction SilentlyContinue
Remove-Variable -Name SMTPDomain -Force -ErrorAction SilentlyContinue
Remove-Variable -Name SMTPDomains -Force -ErrorAction SilentlyContinue
Remove-Variable -Name SMTPDomainsTEMP -Force -ErrorAction SilentlyContinue
Remove-Variable -Name SMTPAddress -Force -ErrorAction SilentlyContinue
Remove-Variable -Name POPAddresses -Force -ErrorAction SilentlyContinue
Remove-Variable -Name POPAddressTO -Force -ErrorAction SilentlyContinue
Remove-Variable -Name POPAddressesTO -Force -ErrorAction SilentlyContinue
Remove-Variable -Name POPAddressCC -Force -ErrorAction SilentlyContinue
Remove-Variable -Name POPAddressesCC -Force -ErrorAction SilentlyContinue
Remove-Variable -Name POPAddressBCC -Force -ErrorAction SilentlyContinue
Remove-Variable -Name POPAddressesBCC -Force -ErrorAction SilentlyContinue
Remove-Variable -Name POPAddressTEMP -Force -ErrorAction SilentlyContinue
Remove-Variable -Name POPAddressesTEMP -Force -ErrorAction SilentlyContinue
Remove-Variable -Name SourcePath -Force -ErrorAction SilentlyContinue
Remove-Variable -Name TargetPath -Force -ErrorAction SilentlyContinue
Remove-Variable -Name ErrorPath -Force -ErrorAction SilentlyContinue
Remove-Variable -Name EMLFile -Force -ErrorAction SilentlyContinue
Remove-Variable -Name EMLFileBaseName -Force -ErrorAction SilentlyContinue
Remove-Variable -Name EMLFileExtension -Force -ErrorAction SilentlyContinue
Remove-Variable -Name EMLFileContent -Force -ErrorAction SilentlyContinue
Remove-Variable -Name EMLObject -Force -ErrorAction SilentlyContinue
Remove-Variable -Name MPRFile -Force -ErrorAction SilentlyContinue
Remove-Variable -Name MPRFileBaseName -Force -ErrorAction SilentlyContinue
Remove-Variable -Name MPRFileExtension -Force -ErrorAction SilentlyContinue
Remove-Variable -Name MPRFileContent -Force -ErrorAction SilentlyContinue
Remove-Variable -Name MPRFileContentPOPValue -Force -ErrorAction SilentlyContinue
Remove-Variable -Name MPRFileContentPOPIndex -Force -ErrorAction SilentlyContinue
Remove-Variable -Name MPRFileContentSMTPValue -Force -ErrorAction SilentlyContinue
Remove-Variable -Name MPRFileContentSMTPIndex -Force -ErrorAction SilentlyContinue
Remove-Variable -Name TargetPathErrorFileDelayAge -Force -ErrorAction SilentlyContinue
$error.clear()