Mailozaurr.psm1
class MySmtpClient : MailKit.Net.Smtp.SmtpClient { MySmtpClient() : base() {} [string[]] $DeliveryNotificationOption = @() [Nullable[MailKit.DeliveryStatusNotification]] GetDeliveryStatusNotifications([MimeKit.MimeMessage]$message, [MimeKit.MailboxAddress]$mailbox) { $Output = @( if ($this.DeliveryNotificationOption -contains 'OnSuccess') { [MailKit.DeliveryStatusNotification]::Success } if ($this.DeliveryNotificationOption -contains 'Delay') { [MailKit.DeliveryStatusNotification]::Delay } if ($this.DeliveryNotificationOption -contains 'OnFailure') { [MailKit.DeliveryStatusNotification]::Failure } if ($this.DeliveryNotificationOption -contains 'Never') { [MailKit.DeliveryStatusNotification]::Never } ) if ($Output.Count -gt 0) { return $Output } return $null } } function ConvertTo-MailboxAddress { [cmdletBinding()] param( [Array] $MailboxAddress ) <# MimeKit.MailboxAddress new(System.Text.Encoding encoding, string name, System.Collections.Generic.IEnumerable[string] route, string address) MimeKit.MailboxAddress new(string name, System.Collections.Generic.IEnumerable[string] route, string address) MimeKit.MailboxAddress new(System.Collections.Generic.IEnumerable[string] route, string address) MimeKit.MailboxAddress new(System.Text.Encoding encoding, string name, string address) MimeKit.MailboxAddress new(string name, string address) MimeKit.MailboxAddress new(string address) #> foreach ($_ in $MailboxAddress) { if ($_ -is [string]) { $SmtpTo = [MimeKit.MailboxAddress]::new("$_") } elseif ($_ -is [System.Collections.IDictionary]) { $SmtpTo = [MimeKit.MailboxAddress]::new($_.Name, $_.Email) } elseif ($_ -is [MimeKit.MailboxAddress]) { $SmtpTo = $_ } else { if ($_.Name -and $_.Email) { $SmtpTo = [MimeKit.MailboxAddress]::new($_.Name, $_.Email) } elseif ($_.Email) { $SmtpTo = [MimeKit.MailboxAddress]::new($_.Email) } } $SmtpTo } } function Connect-IMAP { [cmdletBinding()] param( [Parameter(Mandatory)][string] $Server, [int] $Port = '993', [Parameter(ParameterSetName = 'ClearText', Mandatory)][string] $UserName, [Parameter(ParameterSetName = 'ClearText', Mandatory)][string] $Password, [Parameter(ParameterSetName = 'Credential', Mandatory)][System.Management.Automation.PSCredential] $Credential, [MailKit.Security.SecureSocketOptions] $Options = [MailKit.Security.SecureSocketOptions]::Auto, [int] $TimeOut = 120000 ) $Client = [MailKit.Net.Imap.ImapClient]::new() try { $Client.Connect($Server, $Port, $Options) } catch { Write-Warning "Connect-IMAP - Unable to connect $($_.Exception.Message)" return } <# void Connect(string host, int port, MailKit.Security.SecureSocketOptions options, System.Threading.CancellationToken cancellationToken) void Connect(System.Net.Sockets.Socket socket, string host, int port, MailKit.Security.SecureSocketOptions options, System.Threading.CancellationToken cancellationToken) void Connect(System.IO.Stream stream, string host, int port, MailKit.Security.SecureSocketOptions options, System.Threading.CancellationToken cancellationToken) void Connect(uri uri, System.Threading.CancellationToken cancellationToken) void Connect(string host, int port, bool useSsl, System.Threading.CancellationToken cancellationToken) void IMailService.Connect(string host, int port, bool useSsl, System.Threading.CancellationToken cancellationToken) void IMailService.Connect(string host, int port, MailKit.Security.SecureSocketOptions options, System.Threading.CancellationToken cancellationToken) void IMailService.Connect(System.Net.Sockets.Socket socket, string host, int port, MailKit.Security.SecureSocketOptions options, System.Threading.CancellationToken cancellationToken) void IMailService.Connect(System.IO.Stream stream, string host, int port, MailKit.Security.SecureSocketOptions options, System.Threading.CancellationToken cancellationToken) #> if ($Client.TimeOut -ne $TimeOut) { $Client.TimeOut = $Timeout } if ($Client.IsConnected) { if ($UserName -and $Password) { try { $Client.Authenticate($UserName, $Password) } catch { Write-Warning "Connect-IMAP - Unable to authenticate $($_.Exception.Message)" return } } else { try { $Client.Authenticate($Credential) } catch { Write-Warning "Connect-IMAP - Unable to authenticate $($_.Exception.Message)" return } } } else { return } if ($Client.IsAuthenticated) { [ordered] @{ Uri = $Client.SyncRoot.Uri #: pops: / / pop.gmail.com:995 / AuthenticationMechanisms = $Client.SyncRoot.AuthenticationMechanisms #: { } Capabilities = $Client.SyncRoot.Capabilities #: Expire, LoginDelay, Pipelining, ResponseCodes, Top, UIDL, User Stream = $Client.SyncRoot.Stream #: MailKit.Net.Pop3.Pop3Stream State = $Client.SyncRoot.State #: Transaction IsConnected = $Client.SyncRoot.IsConnected #: True ApopToken = $Client.SyncRoot.ApopToken #: ExpirePolicy = $Client.SyncRoot.ExpirePolicy #: 0 Implementation = $Client.SyncRoot.Implementation #: LoginDelay = $Client.SyncRoot.LoginDelay #: 300 IsAuthenticated = $Client.IsAuthenticated IsSecure = $Client.IsSecure Data = $Client Count = $Client.Count } } <# void Authenticate(MailKit.Security.SaslMechanism mechanism, System.Threading.CancellationToken cancellationToken) void Authenticate(System.Text.Encoding encoding, System.Net.ICredentials credentials, System.Threading.CancellationToken cancellationToken) void Authenticate(System.Net.ICredentials credentials, System.Threading.CancellationToken cancellationToken) void Authenticate(System.Text.Encoding encoding, string userName, string password, System.Threading.CancellationToken cancellationToken) void Authenticate(string userName, string password, System.Threading.CancellationToken cancellationToken) void IMailService.Authenticate(System.Net.ICredentials credentials, System.Threading.CancellationToken cancellationToken) void IMailService.Authenticate(System.Text.Encoding encoding, System.Net.ICredentials credentials, System.Threading.CancellationToken cancellationToken) void IMailService.Authenticate(System.Text.Encoding encoding, string userName, string password, System.Threading.CancellationToken cancellationToken) void IMailService.Authenticate(string userName, string password, System.Threading.CancellationToken cancellationToken) void IMailService.Authenticate(MailKit.Security.SaslMechanism mechanism, System.Threading.CancellationToken cancellationToken) #> <# ------------------- System.Threading.Tasks.Task AuthenticateAsync(MailKit.Security.SaslMechanism mechanism, System.Threading.CancellationToken cancellationToken) System.Threading.Tasks.Task AuthenticateAsync(System.Text.Encoding encoding, System.Net.ICredentials credentials, System.Threading.CancellationToken cancellati onToken) System.Threading.Tasks.Task AuthenticateAsync(System.Net.ICredentials credentials, System.Threading.CancellationToken cancellationToken) System.Threading.Tasks.Task AuthenticateAsync(System.Text.Encoding encoding, string userName, string password, System.Threading.CancellationToken cancellationT oken) System.Threading.Tasks.Task AuthenticateAsync(string userName, string password, System.Threading.CancellationToken cancellationToken) System.Threading.Tasks.Task IMailService.AuthenticateAsync(System.Net.ICredentials credentials, System.Threading.CancellationToken cancellationToken) System.Threading.Tasks.Task IMailService.AuthenticateAsync(System.Text.Encoding encoding, System.Net.ICredentials credentials, System.Threading.CancellationTok en cancellationToken) System.Threading.Tasks.Task IMailService.AuthenticateAsync(System.Text.Encoding encoding, string userName, string password, System.Threading.CancellationToken cancellationToken) System.Threading.Tasks.Task IMailService.AuthenticateAsync(string userName, string password, System.Threading.CancellationToken cancellationToken) System.Threading.Tasks.Task IMailService.AuthenticateAsync(MailKit.Security.SaslMechanism mechanism, System.Threading.CancellationToken cancellationToken) #> #$Client.GetMessageSizes } function Connect-POP { [alias('Connect-POP3')] [cmdletBinding()] param( [Parameter(Mandatory)][string] $Server, [int] $Port = '995', [Parameter(ParameterSetName = 'ClearText', Mandatory)][string] $UserName, [Parameter(ParameterSetName = 'ClearText', Mandatory)][string] $Password, [Parameter(ParameterSetName = 'Credential', Mandatory)][System.Management.Automation.PSCredential] $Credential, [MailKit.Security.SecureSocketOptions] $Options = [MailKit.Security.SecureSocketOptions]::Auto, [int] $TimeOut = 120000 ) $Client = [MailKit.Net.Pop3.Pop3Client]::new() try { $Client.Connect($Server, $Port, $Options) } catch { Write-Warning "Connect-POP - Unable to connect $($_.Exception.Message)" return } <# void Connect(string host, int port, MailKit.Security.SecureSocketOptions options, System.Threading.CancellationToken cancellationToken) void Connect(System.Net.Sockets.Socket socket, string host, int port, MailKit.Security.SecureSocketOptions options, System.Threading.CancellationToken cancellationToken) void Connect(System.IO.Stream stream, string host, int port, MailKit.Security.SecureSocketOptions options, System.Threading.CancellationToken cancellationToken) void Connect(uri uri, System.Threading.CancellationToken cancellationToken) void Connect(string host, int port, bool useSsl, System.Threading.CancellationToken cancellationToken) void IMailService.Connect(string host, int port, bool useSsl, System.Threading.CancellationToken cancellationToken) void IMailService.Connect(string host, int port, MailKit.Security.SecureSocketOptions options, System.Threading.CancellationToken cancellationToken) void IMailService.Connect(System.Net.Sockets.Socket socket, string host, int port, MailKit.Security.SecureSocketOptions options, System.Threading.CancellationToken cancellationToken) void IMailService.Connect(System.IO.Stream stream, string host, int port, MailKit.Security.SecureSocketOptions options, System.Threading.CancellationToken cancellationToken) #> if ($Client.TimeOut -ne $TimeOut) { $Client.TimeOut = $Timeout } if ($Client.IsConnected) { if ($UserName -and $Password) { try { $Client.Authenticate($UserName, $Password) } catch { Write-Warning "Connect-POP - Unable to authenticate $($_.Exception.Message)" return } } else { try { $Client.Authenticate($Credential) } catch { Write-Warning "Connect-POP - Unable to authenticate $($_.Exception.Message)" return } } } else { return } if ($Client.IsAuthenticated) { [ordered] @{ Uri = $Client.SyncRoot.Uri #: pops: / / pop.gmail.com:995 / AuthenticationMechanisms = $Client.SyncRoot.AuthenticationMechanisms #: { } Capabilities = $Client.SyncRoot.Capabilities #: Expire, LoginDelay, Pipelining, ResponseCodes, Top, UIDL, User Stream = $Client.SyncRoot.Stream #: MailKit.Net.Pop3.Pop3Stream State = $Client.SyncRoot.State #: Transaction IsConnected = $Client.SyncRoot.IsConnected #: True ApopToken = $Client.SyncRoot.ApopToken #: ExpirePolicy = $Client.SyncRoot.ExpirePolicy #: 0 Implementation = $Client.SyncRoot.Implementation #: LoginDelay = $Client.SyncRoot.LoginDelay #: 300 IsAuthenticated = $Client.IsAuthenticated IsSecure = $Client.IsSecure Data = $Client Count = $Client.Count } } <# void Authenticate(MailKit.Security.SaslMechanism mechanism, System.Threading.CancellationToken cancellationToken) void Authenticate(System.Text.Encoding encoding, System.Net.ICredentials credentials, System.Threading.CancellationToken cancellationToken) void Authenticate(System.Net.ICredentials credentials, System.Threading.CancellationToken cancellationToken) void Authenticate(System.Text.Encoding encoding, string userName, string password, System.Threading.CancellationToken cancellationToken) void Authenticate(string userName, string password, System.Threading.CancellationToken cancellationToken) void IMailService.Authenticate(System.Net.ICredentials credentials, System.Threading.CancellationToken cancellationToken) void IMailService.Authenticate(System.Text.Encoding encoding, System.Net.ICredentials credentials, System.Threading.CancellationToken cancellationToken) void IMailService.Authenticate(System.Text.Encoding encoding, string userName, string password, System.Threading.CancellationToken cancellationToken) void IMailService.Authenticate(string userName, string password, System.Threading.CancellationToken cancellationToken) void IMailService.Authenticate(MailKit.Security.SaslMechanism mechanism, System.Threading.CancellationToken cancellationToken) #> <# ------------------- System.Threading.Tasks.Task AuthenticateAsync(MailKit.Security.SaslMechanism mechanism, System.Threading.CancellationToken cancellationToken) System.Threading.Tasks.Task AuthenticateAsync(System.Text.Encoding encoding, System.Net.ICredentials credentials, System.Threading.CancellationToken cancellati onToken) System.Threading.Tasks.Task AuthenticateAsync(System.Net.ICredentials credentials, System.Threading.CancellationToken cancellationToken) System.Threading.Tasks.Task AuthenticateAsync(System.Text.Encoding encoding, string userName, string password, System.Threading.CancellationToken cancellationT oken) System.Threading.Tasks.Task AuthenticateAsync(string userName, string password, System.Threading.CancellationToken cancellationToken) System.Threading.Tasks.Task IMailService.AuthenticateAsync(System.Net.ICredentials credentials, System.Threading.CancellationToken cancellationToken) System.Threading.Tasks.Task IMailService.AuthenticateAsync(System.Text.Encoding encoding, System.Net.ICredentials credentials, System.Threading.CancellationTok en cancellationToken) System.Threading.Tasks.Task IMailService.AuthenticateAsync(System.Text.Encoding encoding, string userName, string password, System.Threading.CancellationToken cancellationToken) System.Threading.Tasks.Task IMailService.AuthenticateAsync(string userName, string password, System.Threading.CancellationToken cancellationToken) System.Threading.Tasks.Task IMailService.AuthenticateAsync(MailKit.Security.SaslMechanism mechanism, System.Threading.CancellationToken cancellationToken) #> #$Client.GetMessageSizes } function Disconnect-IMAP { [cmdletBinding()] param( [System.Collections.IDictionary] $Client ) if ($Client.Data) { try { $Client.Data.Disconnect($true) } catch { Write-Warning "Disconnect-IMAP - Unable to authenticate $($_.Exception.Message)" return } } } function Disconnect-POP { [alias('Disconnect-POP3')] [cmdletBinding()] param( [System.Collections.IDictionary] $Client ) if ($Client.Data) { try { $Client.Data.Disconnect($true) } catch { Write-Warning "Disconnect-POP - Unable to authenticate $($_.Exception.Message)" return } } } function Find-DKIMRecord { [CmdletBinding()] param ( [Parameter(Mandatory, ValueFromPipelineByPropertyName, ValueFromPipeline)][string[]] $DomainName, [string[]] $Selector = "selector1", [System.Net.IPAddress] $DnsServer, [switch] $AsHashTable, [switch] $AsObject ) process { foreach ($Domain in $DomainName) { foreach ($S in $Selector) { $Splat = @{ Name = "$S._domainkey.$Domain" Type = "TXT" ErrorAction = "SilentlyContinue" } if ($DnsServer) { $Splat['Server'] = $DnsServer } $DNSRecord = Resolve-DnsName @Splat | Where-Object Strings -Match "DKIM1" if (-not $AsObject) { $MailRecord = [ordered] @{ Name = $Domain Count = $DNSRecord.Strings.Count Selector = "$Domain`:$S" DKIM = $DNSRecord.Strings -join '; ' } } else { $MailRecord = [ordered] @{ Name = $Domain Count = $DNSRecord.Strings.Count Selector = "$Domain`:$S" DKIM = $DNSRecord.Strings -join '; ' } } if ($AsHashTable) { $MailRecord } else { [PSCustomObject] $MailRecord } } } } } function Find-DMARCRecord { [CmdletBinding()] param ( [Parameter(Mandatory, ValueFromPipelineByPropertyName, ValueFromPipeline)][string[]] $DomainName, [System.Net.IPAddress] $DnsServer, [switch] $AsHashTable, [switch] $AsObject ) process { foreach ($Domain in $DomainName) { $Splat = @{ Name = "_dmarc.$Domain" Type = "txt" ErrorAction = "Stop" } if ($DnsServer) { $Splat['Server'] = $DnsServer } try { $DNSRecord = Resolve-DnsName @Splat | Where-Object Strings -Match "DMARC1" if (-not $AsObject) { $MailRecord = [ordered] @{ Name = $Domain TTL = $DnsRecord.TTL -join ' ;' Count = $DNSRecord.Count DMARC = $DnsRecord.Strings -join ' ;' } } else { $MailRecord = [ordered] @{ Name = $Domain TTL = $DnsRecord.TTL Count = $DNSRecord.Count DMARC = $DnsRecord.Strings } } } catch { $MailRecord = [ordered] @{ Name = $Domain TTL = '' Count = 0 DMARC = '' } Write-Warning "Find-DMARCRecord - $_" } if ($AsHashTable) { $MailRecord } else { [PSCustomObject] $MailRecord } } } } function Find-MxRecord { [CmdletBinding()] param ( [Parameter(Mandatory, ValueFromPipeline)][string[]]$DomainName, [System.Net.IPAddress] $DnsServer, [switch] $ResolvePTR, [switch] $AsHashTable, [switch] $Separate, [switch] $AsObject ) process { foreach ($Domain in $DomainName) { $Splat = @{ Name = $Domain Type = "MX" ErrorAction = "SilentlyContinue" } if ($DnsServer) { $Splat['Server'] = $DnsServer } $MX = Resolve-DnsName @Splat | Where-Object Type -EQ "MX" [Array] $MXRecords = foreach ($MXRecord in $MX) { $MailRecord = [ordered] @{ Name = $Domain Preference = $MXRecord.Preference TTL = $MXRecord.TTL MX = $MXRecord.NameExchange } [Array] $IPAddresses = foreach ($Record in $MX.NameExchange) { $Splat = @{ Name = $Record Type = 'A_AAAA' ErrorAction = "SilentlyContinue" } if ($DnsServer) { $Splat['Server'] = $DnsServer } (Resolve-DnsName @Splat).IPAddress } $MailRecord['IPAddress'] = $IPAddresses if ($ResolvePTR) { $MailRecord['PTR'] = foreach ($IP in $IPAddresses) { $Splat = @{ Name = $IP Type = 'PTR' ErrorAction = "SilentlyContinue" } if ($DnsServer) { $Splat['Server'] = $DnsServer } (Resolve-DnsName @Splat).NameHost } } $MailRecord } if ($Separate) { foreach ($MXRecord in $MXRecords) { if ($AsHashTable) { $MXRecord } else { [PSCustomObject] $MXRecord } } } else { if (-not $AsObject) { $MXRecord = [ordered] @{ Name = $Domain Count = $MXRecords.Count Preference = $MXRecords.Preference -join '; ' TTL = $MXRecords.TTL -join '; ' MX = $MXRecords.MX -join '; ' IPAddress = ($MXRecords.IPAddress | Sort-Object -Unique) -join '; ' } if ($ResolvePTR) { $MXRecord['PTR'] = ($MXRecords.PTR | Sort-Object -Unique) -join '; ' } } else { $MXRecord = [ordered] @{ Name = $Domain Count = $MXRecords.Count Preference = $MXRecords.Preference TTL = $MXRecords.TTL MX = $MXRecords.MX IPAddress = ($MXRecords.IPAddress | Sort-Object -Unique) } if ($ResolvePTR) { $MXRecord['PTR'] = ($MXRecords.PTR | Sort-Object -Unique) } } if ($AsHashTable) { $MXRecord } else { [PSCustomObject] $MXRecord } } } } } function Find-SPFRecord { [CmdletBinding()] param ( [Parameter(Mandatory, ValueFromPipelineByPropertyName, ValueFromPipeline)][string[]]$DomainName, [System.Net.IPAddress] $DnsServer, [switch] $AsHashTable, [switch] $AsObject ) process { foreach ($Domain in $DomainName) { $Splat = @{ Name = $Domain Type = "txt" ErrorAction = "Stop" } if ($DnsServer) { $Splat['Server'] = $DnsServer } try { $DNSRecord = Resolve-DnsName @Splat | Where-Object Strings -Match "spf1" if (-not $AsObject) { $MailRecord = [ordered] @{ Name = $Domain TTL = $DnsRecord.TTL -join ' ;' Count = $DNSRecord.Count SPF = $DnsRecord.Strings -join ' ;' } } else { $MailRecord = [ordered] @{ Name = $Domain TTL = $DnsRecord.TTL Count = $DNSRecord.Count SPF = $DnsRecord.Strings } } } catch { $MailRecord = [ordered] @{ Name = $Domain TTL = '' Count = 0 SPF = '' } Write-Warning "Find-SPFRecord - $_" } if ($AsHashTable) { $MailRecord } else { [PSCustomObject] $MailRecord } } } } function Get-IMAPFolder { [cmdletBinding()] param( [Parameter(Mandatory)][System.Collections.IDictionary] $Client, [MailKit.FolderAccess] $FolderAccess = [MailKit.FolderAccess]::ReadOnly ) $Folder = $Client.Data.Inbox $null = $Folder.Open($FolderAccess) Write-Verbose "Get-IMAPMessage - Total messages $($Folder.Count), Recent messages $($Folder.Recent)" $Client.Messages = $Folder $Client.Count = $Folder.Count $Client.Recent = $Folder.Recent $Client } function Get-IMAPMessage { [cmdletBinding()] param( [Parameter(Mandatory)][System.Collections.IDictionary] $Client, [MailKit.FolderAccess] $FolderAccess = [MailKit.FolderAccess]::ReadOnly ) $Folder = $Client.Data.Inbox $null = $Folder.Open($FolderAccess) Write-Verbose "Get-IMAPMessage - Total messages $($Folder.Count), Recent messages $($Folder.Recent)" $Client.Folder = $Folder } function Get-POPMessage { [alias('Get-POP3Message')] [cmdletBinding()] param( [Parameter(Mandatory)][System.Collections.IDictionary] $Client, [int] $Index, [int] $Count = 1, [switch] $All ) if ($Client -and $Client.Data) { if ($All) { $Client.Data.GetMessages($Index, $Count) } else { if ($Index -lt $Client.Data.Count) { $Client.Data.GetMessages($Index, $Count) } else { Write-Warning "Get-POP3Message - Index is out of range. Use index less than $($Client.Data.Count)." } } } <# $Client.Data.GetMessage MimeKit.MimeMessage GetMessage(int index, System.Threading.CancellationToken cancellationToken, MailKit.ITransferProgress progress) MimeKit.MimeMessage IMailSpool.GetMessage(int index, System.Threading.CancellationToken cancellationToken, MailKit.ITransferProgress progress) #> <# $Client.Data.GetMessages System.Collections.Generic.IList[MimeKit.MimeMessage] GetMessages(System.Collections.Generic.IList[int] indexes, System.Threading.CancellationToken cancellationToken, MailKit.ITransferProgress progress) System.Collections.Generic.IList[MimeKit.MimeMessage] GetMessages(int startIndex, int count, System.Threading.CancellationToken cancellationToken, MailKit.ITransferProgress progress) System.Collections.Generic.IList[MimeKit.MimeMessage] IMailSpool.GetMessages(System.Collections.Generic.IList[int] indexes, System.Threading.CancellationTokencancellationToken, MailKit.ITransferProgress progress) System.Collections.Generic.IList[MimeKit.MimeMessage] IMailSpool.GetMessages(int startIndex, int count, System.Threading.CancellationToken cancellationToken, MailKit.ITransferProgress progress) #> } function Save-POPMessage { [alias('Save-POP3Message')] [cmdletBinding()] param( [Parameter(Mandatory)][System.Collections.IDictionary] $Client, [Parameter(Mandatory)][int] $Index, [Parameter(Mandatory)][string] $Path #, # [int] $Count = 1, #[switch] $All ) if ($Client -and $Client.Data) { if ($All) { # $Client.Data.GetMessages($Index, $Count) } else { if ($Index -lt $Client.Data.Count) { $Client.Data.GetMessage($Index).WriteTo($Path) } else { Write-Warning "Save-POP3Message - Index is out of range. Use index less than $($Client.Data.Count)." } } } } function Send-EmailMessage { [cmdletBinding(DefaultParameterSetName = 'Compatibility', SupportsShouldProcess)] param( [alias('SmtpServer')][string] $Server, [int] $Port = 587, [object] $From, [string] $ReplyTo, [string[]] $Cc, [string[]] $Bcc, [string[]] $To, [string] $Subject, [ValidateSet('Low', 'Normal', 'High')][string] $Priority, [ValidateSet('ASCII', 'BigEndianUnicode', 'Default', 'Unicode', 'UTF32', 'UTF7', 'UTF8')][string] $Encoding = 'Default', [ValidateSet('None', 'OnSuccess', 'OnFailure', 'Delay', 'Never')][string[]] $DeliveryNotificationOption, [MailKit.Net.Smtp.DeliveryStatusNotificationType] $DeliveryStatusNotificationType, [pscredential] $Credential, [string] $Username, [string] $Password, [MailKit.Security.SecureSocketOptions] $SecureSocketOptions = [MailKit.Security.SecureSocketOptions]::Auto, [switch] $UseSsl, [alias('Body')][string[]] $HTML, [string[]] $Text, [alias('Attachments')][string[]] $Attachment, [int] $Timeout = 12000, [switch] $ShowErrors, [switch] $Suppress, [alias('EmailParameters')][System.Collections.IDictionary] $Email ) if ($Email) { # Following code makes sure both formats are accepted. if ($Email.EmailTo) { $EmailParameters = $Email.Clone() } else { $EmailParameters = @{ EmailFrom = $Email.From EmailTo = $Email.To EmailCC = $Email.CC EmailBCC = $Email.BCC EmailReplyTo = $Email.ReplyTo EmailServer = $Email.Server EmailServerPassword = $Email.Password EmailServerPasswordAsSecure = $Email.PasswordAsSecure EmailServerPasswordFromFile = $Email.PasswordFromFile EmailServerPort = $Email.Port EmailServerLogin = $Email.Login EmailServerEnableSSL = $Email.EnableSsl EmailEncoding = $Email.Encoding EmailEncodingSubject = $Email.EncodingSubject EmailEncodingBody = $Email.EncodingBody EmailSubject = $Email.Subject EmailPriority = $Email.Priority EmailDeliveryNotifications = $Email.DeliveryNotifications EmailUseDefaultCredentials = $Email.UseDefaultCredentials } } $From = $EmailParameters.EmailFrom $To = $EmailParameters.EmailTo $Cc = $EmailParameters.EmailCC $Bcc = $EmailParameters.EmailBCC $ReplyTo = $EmailParameters.EmailReplyTo $Server = $EmailParameters.EmailServer $Password = $EmailParameters.EmailServerPassword # $EmailServerPasswordAsSecure = $EmailParameters.EmailServerPasswordAsSecure # $EmailServerPasswordFromFile = $EmailParameters.EmailServerPasswordFromFile $Port = $EmailParameters.EmailServerPort $Username = $EmailParameters.EmailServerLogin #$UseSsl = $EmailParameters.EmailServerEnableSSL $Encoding = $EmailParameters.EmailEncoding #$EncodingSubject = $EmailParameters.EmailEncodingSubject $Encoding = $EmailParameters.EmailEncodingBody $Subject = $EmailParameters.EmailSubject $Priority = $EmailParameters.EmailPriority $DeliveryNotificationOption = $EmailParameters.EmailDeliveryNotifications #$EmailUseDefaultCredentials = $EmailParameters.EmailUseDefaultCredentials } else { if ($null -eq $To -and $null -eq $Bcc -and $null -eq $Cc) { Write-Warning "Send-EmailMessage - At least one To, CC or BCC is required." return } } if ($Credential) { $SmtpCredentials = $Credential } $Message = [MimeKit.MimeMessage]::new() # Doing translation for compatibility with Send-MailMessage if ($Priority -eq 'High') { $Message.Priority = [MimeKit.MessagePriority]::Urgent } elseif ($Priority -eq 'Low') { $Message.Priority = [MimeKit.MessagePriority]::NonUrgent } else { $Message.Priority = [MimeKit.MessagePriority]::Normal } [MimeKit.InternetAddress] $SmtpFrom = ConvertTo-MailboxAddress -MailboxAddress $From $Message.From.Add($SmtpFrom) if ($To) { [MimeKit.InternetAddress[]] $SmtpTo = ConvertTo-MailboxAddress -MailboxAddress $To $Message.To.AddRange($SmtpTo) } if ($Cc) { [MimeKit.InternetAddress[]] $SmtpCC = ConvertTo-MailboxAddress -MailboxAddress $Cc $Message.Cc.AddRange($SmtpCC) } if ($Bcc) { [MimeKit.InternetAddress[]] $SmtpBcc = ConvertTo-MailboxAddress -MailboxAddress $Bcc $Message.Bcc.AddRange($SmtpBcc) } if ($ReplyTo) { [MimeKit.InternetAddress] $SmtpReplyTo = ConvertTo-MailboxAddress -MailboxAddress $ReplyTo $Message.ReplyTo.Add($SmtpReplyTo) } $MailSentTo = -join ($To -join ',', $CC -join ', ', $Bcc -join ', ') if ($Subject) { $Message.Subject = $Subject } $BodyBuilder = [MimeKit.BodyBuilder]::new() if ($HTML) { $BodyBuilder.HtmlBody = $HTML } if ($Text) { $BodyBuilder.TextBody = $Text } if ($Attachment) { foreach ($A in $Attachment) { $null = $BodyBuilder.Attachments.Add($A) } } $Message.Body = $BodyBuilder.ToMessageBody() ### SMTP Part Below $SmtpClient = [MySmtpClient]::new() # [MailKit.Net.Smtp.SmtpClient]::new() if ($DeliveryNotificationOption) { # This requires custom class MySmtpClient $SmtpClient.DeliveryNotificationOption = $DeliveryNotificationOption } if ($DeliveryStatusNotificationType) { $SmtpClient.DeliveryStatusNotificationType = $DeliveryStatusNotificationType } if ($UseSsl) { $SmtpClient.Connect($Server, $Port, [MailKit.Security.SecureSocketOptions]::StartTls) } else { $SmtpClient.Connect($Server, $Port, $SecureSocketOptions) } if ($Credential) { [System.Text.Encoding] $SmtpEncoding = [System.Text.Encoding]::$Encoding $SmtpClient.Authenticate($SmtpEncoding, $SmtpCredentials, [System.Threading.CancellationToken]::None) } if ($Username -and $Password) { #void Authenticate(string userName, string password, System.Threading.CancellationToken cancellationToken) } $SmtpClient.Timeout = $Timeout try { if ($PSCmdlet.ShouldProcess("$MailSentTo", "Send-EmailMessage")) { $SmtpClient.Send($Message) if (-not $Suppress) { [PSCustomObject] @{ Status = $True Error = '' SentTo = $MailSentTo } } } } catch { if ($PSBoundParameters.ErrorAction -eq 'Stop') { Write-Error $_ return } else { Write-Warning "Send-EmailMessage - Error: $($_.Exception.Message)" } if (-not $Suppress) { [PSCustomObject] @{ Status = $False Error = $($_.Exception.Message) SentTo = $MailSentTo } } } $SmtpClient.Disconnect($true) } Export-ModuleMember -Function @('Connect-IMAP', 'Connect-POP', 'Disconnect-IMAP', 'Disconnect-POP', 'Find-DKIMRecord', 'Find-DMARCRecord', 'Find-MxRecord', 'Find-SPFRecord', 'Get-IMAPFolder', 'Get-IMAPMessage', 'Get-POPMessage', 'Save-POPMessage', 'Send-EmailMessage') -Alias @('Connect-POP3', 'Disconnect-POP3', 'Get-POP3Message', 'Save-POP3Message') # SIG # Begin signature block # MIIgQAYJKoZIhvcNAQcCoIIgMTCCIC0CAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB # gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR # AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQU48BJ81zKD/LpkzIgWuN2il50 # RhOgghtvMIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0B # AQUFADBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYD # VQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVk # IElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQsw # CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu # ZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3Qg # Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg # +XESpa7cJpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lT # XDGEKvYPmDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5 # a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g # 0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1 # roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whf # GHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0G # A1UdDgQWBBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLL # gjEtUYunpyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3 # cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmr # EthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+ # fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5Q # Z7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu # 838fYxAe+o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw # 8jCCBTAwggQYoAMCAQICEAQJGBtf1btmdVNDtW+VUAgwDQYJKoZIhvcNAQELBQAw # ZTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQ # d3d3LmRpZ2ljZXJ0LmNvbTEkMCIGA1UEAxMbRGlnaUNlcnQgQXNzdXJlZCBJRCBS # b290IENBMB4XDTEzMTAyMjEyMDAwMFoXDTI4MTAyMjEyMDAwMFowcjELMAkGA1UE # BhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3LmRpZ2lj # ZXJ0LmNvbTExMC8GA1UEAxMoRGlnaUNlcnQgU0hBMiBBc3N1cmVkIElEIENvZGUg # U2lnbmluZyBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAPjTsxx/ # DhGvZ3cH0wsxSRnP0PtFmbE620T1f+Wondsy13Hqdp0FLreP+pJDwKX5idQ3Gde2 # qvCchqXYJawOeSg6funRZ9PG+yknx9N7I5TkkSOWkHeC+aGEI2YSVDNQdLEoJrsk # acLCUvIUZ4qJRdQtoaPpiCwgla4cSocI3wz14k1gGL6qxLKucDFmM3E+rHCiq85/ # 6XzLkqHlOzEcz+ryCuRXu0q16XTmK/5sy350OTYNkO/ktU6kqepqCquE86xnTrXE # 94zRICUj6whkPlKWwfIPEvTFjg/BougsUfdzvL2FsWKDc0GCB+Q4i2pzINAPZHM8 # np+mM6n9Gd8lk9ECAwEAAaOCAc0wggHJMBIGA1UdEwEB/wQIMAYBAf8CAQAwDgYD # VR0PAQH/BAQDAgGGMBMGA1UdJQQMMAoGCCsGAQUFBwMDMHkGCCsGAQUFBwEBBG0w # azAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEMGCCsGAQUF # BzAChjdodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRBc3N1cmVk # SURSb290Q0EuY3J0MIGBBgNVHR8EejB4MDqgOKA2hjRodHRwOi8vY3JsNC5kaWdp # Y2VydC5jb20vRGlnaUNlcnRBc3N1cmVkSURSb290Q0EuY3JsMDqgOKA2hjRodHRw # Oi8vY3JsMy5kaWdpY2VydC5jb20vRGlnaUNlcnRBc3N1cmVkSURSb290Q0EuY3Js # ME8GA1UdIARIMEYwOAYKYIZIAYb9bAACBDAqMCgGCCsGAQUFBwIBFhxodHRwczov # L3d3dy5kaWdpY2VydC5jb20vQ1BTMAoGCGCGSAGG/WwDMB0GA1UdDgQWBBRaxLl7 # KgqjpepxA8Bg+S32ZXUOWDAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823I # DzANBgkqhkiG9w0BAQsFAAOCAQEAPuwNWiSz8yLRFcgsfCUpdqgdXRwtOhrE7zBh # 134LYP3DPQ/Er4v97yrfIFU3sOH20ZJ1D1G0bqWOWuJeJIFOEKTuP3GOYw4TS63X # X0R58zYUBor3nEZOXP+QsRsHDpEV+7qvtVHCjSSuJMbHJyqhKSgaOnEoAjwukaPA # JRHinBRHoXpoaK+bp1wgXNlxsQyPu6j4xRJon89Ay0BEpRPw5mQMJQhCMrI2iiQC # /i9yfhzXSUWW6Fkd6fp0ZGuy62ZD2rOwjNXpDd32ASDOmTFjPQgaGLOBm0/GkxAG # /AeB+ova+YJJ92JuoVP6EpQYhS6SkepobEQysmah5xikmmRR7zCCBT0wggQloAMC # AQICEATV3B9I6snYUgC6zZqbKqcwDQYJKoZIhvcNAQELBQAwcjELMAkGA1UEBhMC # VVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3LmRpZ2ljZXJ0 # LmNvbTExMC8GA1UEAxMoRGlnaUNlcnQgU0hBMiBBc3N1cmVkIElEIENvZGUgU2ln # bmluZyBDQTAeFw0yMDA2MjYwMDAwMDBaFw0yMzA3MDcxMjAwMDBaMHoxCzAJBgNV # BAYTAlBMMRIwEAYDVQQIDAnFmmzEhXNraWUxETAPBgNVBAcTCEthdG93aWNlMSEw # HwYDVQQKDBhQcnplbXlzxYJhdyBLxYJ5cyBFVk9URUMxITAfBgNVBAMMGFByemVt # eXPFgmF3IEvFgnlzIEVWT1RFQzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC # ggEBAL+ygd4sga4ZC1G2xXvasYSijwWKgwapZ69wLaWaZZIlY6YvXTGQnIUnk+Tg # 7EoT7mQiMSaeSPOrn/Im6N74tkvRfQJXxY1cnt3U8//U5grhh/CULdd6M3/Z4h3n # MCq7LQ1YVaa4MYub9F8WOdXO84DANoNVG/t7YotL4vzqZil3S9pHjaidp3kOXGJc # vxrCPAkRFBKvUmYo23QPFa0Rd0qA3bFhn97WWczup1p90y2CkOf28OVOOObv1fNE # EqMpLMx0Yr04/h+LPAAYn6K4YtIu+m3gOhGuNc3B+MybgKePAeFIY4EQzbqvCMy1 # iuHZb6q6ggRyqrJ6xegZga7/gV0CAwEAAaOCAcUwggHBMB8GA1UdIwQYMBaAFFrE # uXsqCqOl6nEDwGD5LfZldQ5YMB0GA1UdDgQWBBQYsTUn6BxQICZOCZA0CxS0TZSU # ZjAOBgNVHQ8BAf8EBAMCB4AwEwYDVR0lBAwwCgYIKwYBBQUHAwMwdwYDVR0fBHAw # bjA1oDOgMYYvaHR0cDovL2NybDMuZGlnaWNlcnQuY29tL3NoYTItYXNzdXJlZC1j # cy1nMS5jcmwwNaAzoDGGL2h0dHA6Ly9jcmw0LmRpZ2ljZXJ0LmNvbS9zaGEyLWFz # c3VyZWQtY3MtZzEuY3JsMEwGA1UdIARFMEMwNwYJYIZIAYb9bAMBMCowKAYIKwYB # BQUHAgEWHGh0dHBzOi8vd3d3LmRpZ2ljZXJ0LmNvbS9DUFMwCAYGZ4EMAQQBMIGE # BggrBgEFBQcBAQR4MHYwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0 # LmNvbTBOBggrBgEFBQcwAoZCaHR0cDovL2NhY2VydHMuZGlnaWNlcnQuY29tL0Rp # Z2lDZXJ0U0hBMkFzc3VyZWRJRENvZGVTaWduaW5nQ0EuY3J0MAwGA1UdEwEB/wQC # MAAwDQYJKoZIhvcNAQELBQADggEBAJq9bM+JbCwEYuMBtXoNAfH1SRaMLXnLe0py # VK6el0Z1BtPxiNcF4iyHqMNVD4iOrgzLEVzx1Bf/sYycPEnyG8Gr2tnl7u1KGSjY # enX4LIXCZqNEDQCeTyMstNv931421ERByDa0wrz1Wz5lepMeCqXeyiawqOxA9fB/ # 106liR12vL2tzGC62yXrV6WhD6W+s5PpfEY/chuIwVUYXp1AVFI9wi2lg0gaTgP/ # rMfP1wfVvaKWH2Bm/tU5mwpIVIO0wd4A+qOhEia3vn3J2Zz1QDxEprLcLE9e3Gmd # G5+8xEypTR23NavhJvZMgY2kEXBEKEEDaXs0LoPbn6hMcepR2A4wggZqMIIFUqAD # AgECAhADAZoCOv9YsWvW1ermF/BmMA0GCSqGSIb3DQEBBQUAMGIxCzAJBgNVBAYT # AlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2Vy # dC5jb20xITAfBgNVBAMTGERpZ2lDZXJ0IEFzc3VyZWQgSUQgQ0EtMTAeFw0xNDEw # MjIwMDAwMDBaFw0yNDEwMjIwMDAwMDBaMEcxCzAJBgNVBAYTAlVTMREwDwYDVQQK # EwhEaWdpQ2VydDElMCMGA1UEAxMcRGlnaUNlcnQgVGltZXN0YW1wIFJlc3BvbmRl # cjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKNkXfx8s+CCNeDg9sYq # 5kl1O8xu4FOpnx9kWeZ8a39rjJ1V+JLjntVaY1sCSVDZg85vZu7dy4XpX6X51Id0 # iEQ7Gcnl9ZGfxhQ5rCTqqEsskYnMXij0ZLZQt/USs3OWCmejvmGfrvP9Enh1DqZb # FP1FI46GRFV9GIYFjFWHeUhG98oOjafeTl/iqLYtWQJhiGFyGGi5uHzu5uc0LzF3 # gTAfuzYBje8n4/ea8EwxZI3j6/oZh6h+z+yMDDZbesF6uHjHyQYuRhDIjegEYNu8 # c3T6Ttj+qkDxss5wRoPp2kChWTrZFQlXmVYwk/PJYczQCMxr7GJCkawCwO+k8IkR # j3cCAwEAAaOCAzUwggMxMA4GA1UdDwEB/wQEAwIHgDAMBgNVHRMBAf8EAjAAMBYG # A1UdJQEB/wQMMAoGCCsGAQUFBwMIMIIBvwYDVR0gBIIBtjCCAbIwggGhBglghkgB # hv1sBwEwggGSMCgGCCsGAQUFBwIBFhxodHRwczovL3d3dy5kaWdpY2VydC5jb20v # Q1BTMIIBZAYIKwYBBQUHAgIwggFWHoIBUgBBAG4AeQAgAHUAcwBlACAAbwBmACAA # dABoAGkAcwAgAEMAZQByAHQAaQBmAGkAYwBhAHQAZQAgAGMAbwBuAHMAdABpAHQA # dQB0AGUAcwAgAGEAYwBjAGUAcAB0AGEAbgBjAGUAIABvAGYAIAB0AGgAZQAgAEQA # aQBnAGkAQwBlAHIAdAAgAEMAUAAvAEMAUABTACAAYQBuAGQAIAB0AGgAZQAgAFIA # ZQBsAHkAaQBuAGcAIABQAGEAcgB0AHkAIABBAGcAcgBlAGUAbQBlAG4AdAAgAHcA # aABpAGMAaAAgAGwAaQBtAGkAdAAgAGwAaQBhAGIAaQBsAGkAdAB5ACAAYQBuAGQA # IABhAHIAZQAgAGkAbgBjAG8AcgBwAG8AcgBhAHQAZQBkACAAaABlAHIAZQBpAG4A # IABiAHkAIAByAGUAZgBlAHIAZQBuAGMAZQAuMAsGCWCGSAGG/WwDFTAfBgNVHSME # GDAWgBQVABIrE5iymQftHt+ivlcNK2cCzTAdBgNVHQ4EFgQUYVpNJLZJMp1KKnka # g0v0HonByn0wfQYDVR0fBHYwdDA4oDagNIYyaHR0cDovL2NybDMuZGlnaWNlcnQu # Y29tL0RpZ2lDZXJ0QXNzdXJlZElEQ0EtMS5jcmwwOKA2oDSGMmh0dHA6Ly9jcmw0 # LmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEFzc3VyZWRJRENBLTEuY3JsMHcGCCsGAQUF # BwEBBGswaTAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEEG # CCsGAQUFBzAChjVodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRB # c3N1cmVkSURDQS0xLmNydDANBgkqhkiG9w0BAQUFAAOCAQEAnSV+GzNNsiaBXJuG # ziMgD4CH5Yj//7HUaiwx7ToXGXEXzakbvFoWOQCd42yE5FpA+94GAYw3+puxnSR+ # /iCkV61bt5qwYCbqaVchXTQvH3Gwg5QZBWs1kBCge5fH9j/n4hFBpr1i2fAnPTgd # KG86Ugnw7HBi02JLsOBzppLA044x2C/jbRcTBu7kA7YUq/OPQ6dxnSHdFMoVXZJB # 2vkPgdGZdA0mxA5/G7X1oPHGdwYoFenYk+VVFvC7Cqsc21xIJ2bIo4sKHOWV2q7E # LlmgYd3a822iYemKC23sEhi991VUQAOSK2vCUcIKSK+w1G7g9BQKOhvjjz3Kr2qN # e9zYRDCCBs0wggW1oAMCAQICEAb9+QOWA63qAArrPye7uhswDQYJKoZIhvcNAQEF # BQAwZTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UE # CxMQd3d3LmRpZ2ljZXJ0LmNvbTEkMCIGA1UEAxMbRGlnaUNlcnQgQXNzdXJlZCBJ # RCBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTIxMTExMDAwMDAwMFowYjELMAkG # A1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3LmRp # Z2ljZXJ0LmNvbTEhMB8GA1UEAxMYRGlnaUNlcnQgQXNzdXJlZCBJRCBDQS0xMIIB # IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA6IItmfnKwkKVpYBzQHDSnlZU # XKnE0kEGj8kz/E1FkVyBn+0snPgWWd+etSQVwpi5tHdJ3InECtqvy15r7a2wcTHr # zzpADEZNk+yLejYIA6sMNP4YSYL+x8cxSIB8HqIPkg5QycaH6zY/2DDD/6b3+6LN # b3Mj/qxWBZDwMiEWicZwiPkFl32jx0PdAug7Pe2xQaPtP77blUjE7h6z8rwMK5nQ # xl0SQoHhg26Ccz8mSxSQrllmCsSNvtLOBq6thG9IhJtPQLnxTPKvmPv2zkBdXPao # 8S+v7Iki8msYZbHBc63X8djPHgp0XEK4aH631XcKJ1Z8D2KkPzIUYJX9BwSiCQID # AQABo4IDejCCA3YwDgYDVR0PAQH/BAQDAgGGMDsGA1UdJQQ0MDIGCCsGAQUFBwMB # BggrBgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCDCCAdIGA1Ud # IASCAckwggHFMIIBtAYKYIZIAYb9bAABBDCCAaQwOgYIKwYBBQUHAgEWLmh0dHA6 # Ly93d3cuZGlnaWNlcnQuY29tL3NzbC1jcHMtcmVwb3NpdG9yeS5odG0wggFkBggr # BgEFBQcCAjCCAVYeggFSAEEAbgB5ACAAdQBzAGUAIABvAGYAIAB0AGgAaQBzACAA # QwBlAHIAdABpAGYAaQBjAGEAdABlACAAYwBvAG4AcwB0AGkAdAB1AHQAZQBzACAA # YQBjAGMAZQBwAHQAYQBuAGMAZQAgAG8AZgAgAHQAaABlACAARABpAGcAaQBDAGUA # cgB0ACAAQwBQAC8AQwBQAFMAIABhAG4AZAAgAHQAaABlACAAUgBlAGwAeQBpAG4A # ZwAgAFAAYQByAHQAeQAgAEEAZwByAGUAZQBtAGUAbgB0ACAAdwBoAGkAYwBoACAA # bABpAG0AaQB0ACAAbABpAGEAYgBpAGwAaQB0AHkAIABhAG4AZAAgAGEAcgBlACAA # aQBuAGMAbwByAHAAbwByAGEAdABlAGQAIABoAGUAcgBlAGkAbgAgAGIAeQAgAHIA # ZQBmAGUAcgBlAG4AYwBlAC4wCwYJYIZIAYb9bAMVMBIGA1UdEwEB/wQIMAYBAf8C # AQAweQYIKwYBBQUHAQEEbTBrMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdp # Y2VydC5jb20wQwYIKwYBBQUHMAKGN2h0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNv # bS9EaWdpQ2VydEFzc3VyZWRJRFJvb3RDQS5jcnQwgYEGA1UdHwR6MHgwOqA4oDaG # NGh0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEFzc3VyZWRJRFJvb3RD # QS5jcmwwOqA4oDaGNGh0dHA6Ly9jcmw0LmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEFz # c3VyZWRJRFJvb3RDQS5jcmwwHQYDVR0OBBYEFBUAEisTmLKZB+0e36K+Vw0rZwLN # MB8GA1UdIwQYMBaAFEXroq/0ksuCMS1Ri6enIZ3zbcgPMA0GCSqGSIb3DQEBBQUA # A4IBAQBGUD7Jtygkpzgdtlspr1LPUukxR6tWXHvVDQtBs+/sdR90OPKyXGGinJXD # UOSCuSPRujqGcq04eKx1XRcXNHJHhZRW0eu7NoR3zCSl8wQZVann4+erYs37iy2Q # wsDStZS9Xk+xBdIOPRqpFFumhjFiqKgz5Js5p8T1zh14dpQlc+Qqq8+cdkvtX8JL # FuRLcEwAiR78xXm8TBJX/l/hHrwCXaj++wc4Tw3GXZG5D2dFzdaD7eeSDY2xaYxP # +1ngIw/Sqq4AfO6cQg7PkdcntxbuD8O9fAqg7iwIVYUiuOsYGk38KiGtSTGDR5V3 # cdyxG0tLHBCcdxTBnU8vWpUIKRAmMYIEOzCCBDcCAQEwgYYwcjELMAkGA1UEBhMC # VVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3LmRpZ2ljZXJ0 # LmNvbTExMC8GA1UEAxMoRGlnaUNlcnQgU0hBMiBBc3N1cmVkIElEIENvZGUgU2ln # bmluZyBDQQIQBNXcH0jqydhSALrNmpsqpzAJBgUrDgMCGgUAoHgwGAYKKwYBBAGC # NwIBDDEKMAigAoAAoQKAADAZBgkqhkiG9w0BCQMxDAYKKwYBBAGCNwIBBDAcBgor # BgEEAYI3AgELMQ4wDAYKKwYBBAGCNwIBFTAjBgkqhkiG9w0BCQQxFgQU1Xkan70P # pp86jf5dqWkxdpVHFTowDQYJKoZIhvcNAQEBBQAEggEAAEyycyYAKEkz7NyJGwxi # vJ4phTChAJqtRHKJQD4lfbfSX0sKtZNZdfguIqSnDF+TOX5503RTlt7y7ykKqePc # rTcSYO7LCr6F5a0CYRt+cDUjCh1fqIqJjF690UfVy8fCDY/C/0gJCFb1nt8dgF6e # sE5+yCuxNXTC3HIY75r1e+b0SE/zfYOO7U+TeLErQmbudXnTSCTWlnNu3HkuN8tN # 3fTyNL2GXlohTdqvBm+8QOjsJ9fTaSPKFB8ypuDHeZOX+Z1+agvykm42Wp0I1J21 # 7Et1T4IbHU5mz5EovVCOrUDGJuzsukZkPI08Ncgg6fqJbRakJrwMOMNVTstP8bsl # k6GCAg8wggILBgkqhkiG9w0BCQYxggH8MIIB+AIBATB2MGIxCzAJBgNVBAYTAlVT # MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j # b20xITAfBgNVBAMTGERpZ2lDZXJ0IEFzc3VyZWQgSUQgQ0EtMQIQAwGaAjr/WLFr # 1tXq5hfwZjAJBgUrDgMCGgUAoF0wGAYJKoZIhvcNAQkDMQsGCSqGSIb3DQEHATAc # BgkqhkiG9w0BCQUxDxcNMjAwNzI0MjAyNTI0WjAjBgkqhkiG9w0BCQQxFgQUE7jj # slWpyeqbkZximx4I7ufA9o4wDQYJKoZIhvcNAQEBBQAEggEAbq+loRo+D0QM3Bip # a/toO2ClUmcDnA+U55E4uVEm/IzMTuX0N58ZTCrlYQ2i7i4O5zIeCOV16elNPEdr # FTrZVQQZgDPhtPm/tlddk+vAWTstA/lo6XZwnmmDJop7ANonk2zQpn4VoI1Sl0py # pZByaXD2+blqrcX4GVYOuWSVUcAgt3vgiKAJFcQF20uHSrJHE1Sf0/OBh3e6hIi2 # SDUMSDzBdRN6SJ+LcnGtOvBZYLp4t6f0sgenT6sJopvb/TldgDcNbRsOoy6TDXIU # dB6KnxkNQMOy1qyKUb2EkcBQbf9WSQq6vCPqI3RyU0LMV1xkpP/5xV+QsRDPNw+g # gQoY+w== # SIG # End signature block |