Send-MailKitMessage.psm1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109


####################################
# Author: Eric Austin
# Repo: https://github.com/austineric/Send-MailKitMessage
# Description: A replacement for PowerShell's obsolete Send-MailMessage implementing the Microsoft-recommended MailKit library.
####################################

function Send-MailKitMessage(){
    param(
        [Parameter(Mandatory=$false)][switch]$UseSecureConnectionIfAvailable = $true,
        [Parameter(Mandatory=$false)][pscredential]$Credential,
        [Parameter(Mandatory=$true)][string]$SMTPServer,
        [Parameter(Mandatory=$true)][int]$Port,
        [Parameter(Mandatory=$true)][MimeKit.MailboxAddress]$From,
        [Parameter(Mandatory=$true)][MimeKit.InternetAddressList]$RecipientList,
        [Parameter(Mandatory=$false)][MimeKit.InternetAddressList]$CCList,
        [Parameter(Mandatory=$false)][MimeKit.InternetAddressList]$BCCList,
        [Parameter(Mandatory=$false)][string]$Subject,
        [Parameter(Mandatory=$false)][string]$TextBody,
        [Parameter(Mandatory=$false)][string]$HTMLBody,
        [Parameter(Mandatory=$false)][string[]]$AttachmentList
    )

    Try {

        $ErrorActionPreference="Stop"

        #message
        $Message=[MimeKit.MimeMessage]::new()

        #from
        $Message.From.Add($From)

        #to
        $Message.To.AddRange($RecipientList)

        #cc
        if ($CCList.Count -gt 0)
        {
            $Message.Cc.AddRange($CCList)
        }
        
        #bcc
        if ($BCCList.Count -gt 0)
        {
            $Message.Bcc.AddRange($BCCList)
        }

        #subject
        if ( -not ([string]::IsNullOrWhiteSpace($Message)))
        {
            $Message.Subject=$Subject
        }

        #body
        #$BodyBuilder=New-Object BodyBuilder
        $BodyBuilder=[MimeKit.BodyBuilder]::new()
        
        #text body
        if (-not ([string]::IsNullOrWhiteSpace($TextBody)))
        {
            $BodyBuilder.TextBody=$TextBody
        }

        #html body
        if (-not ([string]::IsNullOrWhiteSpace($HTMLBody)))
        {
            $BodyBuilder.HtmlBody=[System.Web.HttpUtility]::HtmlDecode($HTMLBody)   #use [System.Web.HttpUtility]::HtmlDecode() in case there are html elements present that have been escaped
        }

        #attachment(s)
        if ($AttachmentList.Count -gt 0)
        {
            $AttachmentList | ForEach-Object {
                $BodyBuilder.Attachments.Add($_) | Out-Null
            }
        }

        #add bodybuilder to message body
        $Message.Body=$BodyBuilder.ToMessageBody()

        #smtp send
        $Client=New-Object MailKit.Net.Smtp.SmtpClient
        $Client.Connect($SMTPServer, $Port, ($UseSecureConnectionIfAvailable.IsPresent ? [MailKit.Security.SecureSocketOptions]::Auto : [MailKit.Security.SecureSocketOptions]::None))
        if ($Credential)
        {
            $Client.Authenticate($Credential.UserName, ($Credential.Password | ConvertFrom-SecureString -AsPlainText))
        }
        $Client.Send($Message)

    }

    Catch {
        
        Throw $Global:Error[0]

    }

    Finally {
        
        if ($Client.IsConnected)
        {
            $Client.Disconnect($true)
        }

    }

}