Public/Email/Send-MailNotification.ps1
|
function Send-Mailnotification { [CmdletBinding()] param ( [Parameter(Mandatory=$true)] [ValidateNotNullOrEmpty()] [String]$Name # The email channel to use ,[Parameter(Mandatory=$true)] [ValidateNotNullOrEmpty()] [String]$Target # The email target to use ,[Parameter(Mandatory=$true)] [ValidateNotNullOrEmpty()] [String]$Subject # The email subject ,[Parameter(Mandatory=$true)] [ValidateNotNullOrEmpty()] [String]$Text # The email text ,[Parameter(Mandatory=$false)] [String[]]$Attachment = [Array]@() ) begin { # Check Attachment parameter If ( $Attachment -isnot [Array] ) { $Attachment = @($Attachment) } # Check path of attachments foreach ( $att in $Attachment ) { If ( ( Test-Path -Path $att ) -ne $true ) { throw "Attachment path '$( $att )' is not valid. Aborting now" } } } process { # Get the right target for this channel $channel = Get-Channel -Name $Name $channelTarget = $channel.Targets | where-object { $_.TargetName -eq $Target } #$Script:debug = $target # Load mailkit lib If ( ( Confirm-MailKitLoaded ) -eq $true ) { Write-Verbose "MailKit loaded successfully" } else { throw "You need to install MailKit first. Please execute Install-Mailkit!" # TODO maybe the throw is not needed here } # Try connect to server try { Write-Verbose "Connecting to mailserver" $smtpClient = [MailKit.Net.Smtp.SmtpClient]::new() $smtpClient.Connect($channel.Definition.host, $channel.Definition.port, $channel.Definition.ssl) # $SMTP.Connect('smtp.gmail.com', 587, $False) } catch { throw "Connection to host '$( $Host )' failed!" } # Try to authenticate try { Write-Verbose "Authentication to mailserver" $smtpClient.Authenticate($channel.Definition.username, ( Convert-SecureToPlaintext -String $channel.Definition.password)) # $SMTP.Authenticate('myemail1@gmail.com', 'appspecificpassword' ) } catch { throw "Authentication to host '$( $Host )' failed!" } # Create the mail $message = [MimeKit.MimeMessage]::new() $message.From.Add($channel.Definition.from) $channelTarget.Definition.Receivers | ForEach-Object { $message.To.Add($_) # TODO not checking if the email is valid } $message.Subject = $Subject #$textPart = [MimeKit.TextPart]::new("plain") #$textPart.Text = $Text #$message.Body = $TextPart $builder = [MimeKit.BodyBuilder]::new() $builder.TextBody = $Text $Attachments | ForEach-Object { $builder.Attachments.Add($_) } $message.Body = $builder.ToMessageBody() # Add attachment if provided <# If ( $Attachment -ne $null ) { $attachmentPart = [MimeKit.MimePart]::new("application", "octet-stream") $attachmentPart.Content = [MimeKit.MimeContent]::new([System.IO.File]::OpenRead($Attachment), [MimeKit.ContentEncoding]::Base64) $attachmentPart.ContentDisposition = [MimeKit.ContentDisposition]::new([MimeKit.ContentDispositionType]::Attachment) $attachmentPart.FileName = [System.IO.Path]::GetFileName($Attachment) $multipart = [MimeKit.Multipart]::new("mixed") $multipart.Add($textPart) $multipart.Add($attachmentPart) $message.Body = $multipart } #> # Send the message $msg = $smtpClient.Send($message) Write-Verbose $msg # Kill that connection $smtpClient.Disconnect($true) $smtpClient.Dispose() } } |