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 ###

Wir nutzen Cookies auf unserer Website. Einige von ihnen sind essenziell für den Betrieb der Seite, während andere uns helfen, diese Website und die Nutzererfahrung zu verbessern (Tracking Cookies). Sie können selbst entscheiden, ob Sie die Cookies zulassen möchten. Bitte beachten Sie, dass bei einer Ablehnung womöglich nicht mehr alle Funktionalitäten der Seite zur Verfügung stehen.