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<This email address is being protected from spambots. You need JavaScript enabled to view it.>"
# $To = "John Doe<This email address is being protected from spambots. You need JavaScript enabled to view it.>,Jane Doe<This email address is being protected from spambots. You need JavaScript enabled to view it.>"
$To = "This email address is being protected from spambots. You need JavaScript enabled to view it."
$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 = "This email address is being protected from spambots. You need JavaScript enabled to view it."
$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 ###

We use cookies on our website. Some of them are essential for the operation of the site, while others help us to improve this site and the user experience (tracking cookies). You can decide for yourself whether you want to allow cookies or not. Please note that if you reject them, you may not be able to use all the functionalities of the site.