Der Email-Versand mit Powershell erscheit auf den ersten Blick mit den Cmdlet Send-MailMessage recht einfach. Doch leider funktioniert das nur ohne SSL auf Port 25 recht einfach. Sobald SSL ins Spiel kommt muss mid. auf PS 3 (Windows Management Framework) upgegradet werden und der Port 465 funktioniert immer noch nicht. Somit verwende ich immer noch die alt hergebrachte Versandweise mittels System.Net.Mail.SmtpClient bzw. System.Web.Mail.MailMessage.
<########################## # PowerShell Email Script # # Michael Hölldobler # # http://www.alant.com # ###########################> #Mail recipients comma separated # $To = "John Doe<Diese E-Mail-Adresse ist vor Spambots geschützt! Zur Anzeige muss JavaScript eingeschaltet sein. >" # $To = "John Doe<Diese E-Mail-Adresse ist vor Spambots geschützt! Zur Anzeige muss JavaScript eingeschaltet sein. >,Jane Doe<Diese E-Mail-Adresse ist vor Spambots geschützt! Zur Anzeige muss JavaScript eingeschaltet sein. >" $To = "Diese E-Mail-Adresse ist vor Spambots geschützt! Zur Anzeige muss JavaScript eingeschaltet sein. " $Cc = "" $Bcc = "" $Subject = "PowerShell Test-Message" $Body ="<HTML><BODY>Hello,<br />this is a message sent via <font color='red'><b>PowerShell</b></font>.</BODY></HTML>" $BodyIsHTML = $True #$Body = "Hello, this is a message sent via PowerShell." #$BodyIsHTML = $False # Is there an Attchment $AttachmentPath = "attachmentPath" # Mail Server settings $from = "Diese E-Mail-Adresse ist vor Spambots geschützt! Zur Anzeige muss JavaScript eingeschaltet sein. " $SMTPUser = $from #"username" $SMTPPasswort = "mysecretpassword" $SMTPServer = "smtp.test.intern" $SMTPServerPort = 465 #587 25 $timeout = 30000 # timeout in milliseconds ### Function Section ### function sendemail { # Check Port $implicitSSL = $true $enableSSL = $true switch ($SMTPServerPort) { 25 {$enableSSL = $false} # default Port (unsecure, almost depreached) # 465 {} # connection buildup is secure # 8465 {} 587 {$implicitSSL = $false} # connection buildup isn't secure 2525 {$implicitSSL = $false} 8025 {$implicitSSL = $false} } # Ckeck Attachment if ($attachmentPath -ne "") { if (Test-Path $attachmentPath){ } else { Write-Host "Anhang wurde nicht gefunden " + $attachmentPath $attachmentPath = "" } } # Check Password. Without Entry, check File. If it does't exist ask for Password if ($SMTPPasswort -eq "") { $SMTPPasswortFile = ".\MailPW.txt" If (!(Test-Path $SMTPPasswortFile)){ (Get-Credential).password | ConvertFrom-SecureString > MailPW.txt } $SMTPPasswort = Get-Content $SMTPPasswortFile | ConvertTo-SecureString } Else { $SMTPPasswort = $SMTPPasswort | ConvertTo-SecureString -asPlainText -Force } $credentials = New-Object System.Management.Automation.PSCredential($SMTPUser, $SMTPPasswort) if ($implicitSSL) { sentViaWebMail } else { sentViaSmtpClient } } function sentViaSmtpClient { # Set up server connection $smtpClient = New-Object System.Net.Mail.SmtpClient $SMTPServer, $SMTPServerPort $smtpClient.EnableSsl = $enableSSL $smtpClient.Timeout = $timeout $smtpClient.UseDefaultCredentials = $false; $smtpClient.Credentials = $credentials # Create mail message $message = New-Object System.Net.Mail.MailMessage $from, $to, $subject, $body $message.IsBodyHTML = $BodyIsHTML if ($attachmentPath -ne ""){ $attachment = New-Object System.Net.Mail.Attachment $attachmentPath $message.Attachments.Add($attachment) } if ($Bcc -ne "") {$message.Bcc.Add($Bcc)} if ($Cc -ne "") {$message.Cc.Add($Cc)} # Send the message try { $smtpClient.Send($message) Write-Output "Message sent." } catch { Write-Error $_ Write-Output "Message send failed." } } function sentViaWebMail { # Load System.Web assembly [System.Reflection.Assembly]::LoadWithPartialName("System.Web") > $null $schema = "http://schemas.microsoft.com/cdo/configuration/" $Ptr = [System.Runtime.InteropServices.Marshal]::SecureStringToCoTaskMemUnicode($SMTPPasswort) # Convert to plain text $SMTPPlainPassword = [System.Runtime.InteropServices.Marshal]::PtrToStringUni($Ptr) # Create a new mail with the appropriate server settigns $mail = New-Object System.Web.Mail.MailMessage $mail.Fields.Add($schema + "smtpserver", $SMTPServer) if ($enableSSL) { $mail.Fields.Add($schema + "smtpserverport", $SMTPServerPort) $mail.Fields.Add($schema + "smtpusessl", $enableSSL) } $mail.Fields.Add($schema + "sendusername", $credentials.UserName) $mail.Fields.Add($schema + "sendpassword", $SMTPPlainPassword) $mail.Fields.Add($schema + "smtpconnectiontimeout", $timeout / 1000) # Use network SMTP server... $mail.Fields.Add($schema + "sendusing", 2) # ... and basic authentication $mail.Fields.Add($schema + "smtpauthenticate", 1) # Importance of email #$mail.Fields.Add("urn:schemas:httpmail:importance", 1) #0 = Low importance 1 = Normal importance (default) 2 = High importance # Set up the mail message fields $mail.From = $from $mail.To = $to if ($Cc -ne "") {$mail.Cc = $Cc} if ($Bcc -ne "") {$mail.Bcc = $bcc} $mail.Subject = $subject $mail.IsBodyHTML = $BodyIsHTML $mail.Body = $body if ($attachmentPath -ne "") { # Convert to full path and attach file to message $attachmentPath = (get-item $attachmentPath).FullName $attachment = New-Object System.Web.Mail.MailAttachment $attachmentPath $mail.Attachments.Add($attachment) > $null } # Send the message try { [System.Web.Mail.SmtpMail]::Send($mail) Write-Output "Message sent." } catch { Write-Error $_ Write-Output "Message send failed." } } ### Script Section ### sendemail ### EOS ###