Emails mit PowerShell versenden

Um sich unter Windows allerhand zu automatisieren, eignet sich die PowerShell ganz hervorragend. Dabei spielt es natürlich keine Rolle, ob es sich um ein Server- oder ein Client Betriebssystem handelt. Ein gängiger Anwendungsfall dürfte das automatische Versenden von Emails sein. Grundsätzlich ist das durch das PowerShell cmdlet „Send-MailMessage“ kein Hexenwerk. Ein paar Parameter anhängen und die Mail wird verschickt. Allerdings sollte überlegt werden, ob es sinnvoll ist, das Passwort im Klartext im Skript stehen zu lassen. Jeder „Unbefugte“ hat somit schnell Zugriff auf das Mailkonto. Also ist es ratsam etwas mehr Aufwand zu betreiben und das Passwort gesichert abzulegen und bei Bedarf vom Skript einlesen zu lassen.


Dazu wird eine Kombination aus Verschlüsselung und NTFS Berechtigungen verwendet. Somit kann das verschlüsselte Passwort grundsätzlich nur von berechtigten Benutzern in Kombination mit einem Keyfile verwendet werden. Zu Beginn muss das Keyfile erstellt werden, mit dem im Anschluss das gewünschte Passwort verschlüsselt in einer Datei abgelegt wird. Dazu wird folgendes PowerShell Skript verwendet.

CreateSecurePassword.ps1

Die Variablen „$KeyFile“, „$PasswordFile“, „$Password“ müssen an die eigenen Gegebenheiten angepasst werden.

# Create keyfile and encrypted password
# 29.11.2016

# Execution examples:
# powershell.exe -ExecutionPolicy Bypass "& '.\CreateSecurePassword.ps1'"

#----------------------------------------------------------------------------------
# Global variables. Change values here if needed

$KeyFile = "C:\Temp\AES256.key"
$PasswordFile = "C:\Temp\Password.txt"
$Password = "MyVerySpecialSecretPassword"

#--------------------------------
#							
#   STOP CHANGING THINGS NOW   
#							
#--------------------------------

# create AES-256 keyfile
$CryptoKey = New-Object Byte[] 32
[Security.Cryptography.RNGCryptoServiceProvider]::Create().GetBytes($CryptoKey)
$CryptoKey | out-file $KeyFile

# Encrypt password
$CryptoKey = Get-Content $KeyFile
$SecurePassword = $Password | ConvertTo-SecureString -AsPlainText -Force
$SecurePassword | ConvertFrom-SecureString -key $CryptoKey | Out-File $PasswordFile

Das Skript kann dann direkt in der PowerShell Konsole ausgeführt werden. Danach sollten die beiden neuen Dateien vorhanden sein. Diese können dann per NTFS Berechtigungen zusätzlich abgesichert werden. Im nächsten Schritt geht es um den Skriptteil, der sich um das Versenden von Emails mittels „Send-MailMessage“ kümmert. Dazu wird ein weiteres Skript erstellt.

sendmail.ps1
# Send mail with PowerShell
# 29.11.2016

# Execution examples:
# powershell.exe -ExecutionPolicy Bypass "& '.\sendmail.ps1'"

#----------------------------------------------------------------------------------
# Global variables. Change values here if needed

# Credentials
$KeyFile = "C:\Temp\AES256.key"
$PasswordFile = "C:\Temp\Password.txt"
$MailUser = "MailBoxUser"

# SMTP Settings
$PSEmailServer = "smtp.provider.de"
$smtpFrom = "your@email.de"
$smtpTo = "your@email.de"
$messageSubject = "Sendmail with PowerShell"
$messageBody = "Mail was sent with PowerShell"

#--------------------------------
#						
#   STOP CHANGING THINGS NOW   
#							
#--------------------------------

# global error handling
# only show defined error messages
$ErrorActionPreference = "SilentlyContinue";
$error.Clear();

function errorhandling($message = $error[0].Exception.Message, $Code)
{
	# write execution Log to %tempp%
	$error | out-file -PSPath $env:temp\PowerShell_Execution_Error.log -Append;
	# on error just show content of Exeption.Message
	$message = "Error executing section $($code): " + $($message)
	write-warning $($message)
	# stop script on error
	read-host
	exit $code;
}

#----------------------------
#				     
#   create PSCredential  
#                  		  
#----------------------------

$CryptoKey = Get-Content $KeyFile
$creds = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $MailUser, (Get-Content $PasswordFile | ConvertTo-SecureString -Key $CryptoKey)
 
# errorhandling
if ($error.Count -gt 0)
{
	errorhandling -code 1;
}

#------------------------
#				 
#   send mail		
#                 
#------------------------

Send-MailMessage -Credential $creds -From $smtpFrom -To $smtpTo -Subject $messageSubject -Body $messageBody

# errorhandling
if ($error.Count -gt 0)
{
	errorhandling -code 2;
}

Auch hier müssen nur die Variablen „Credentials“ und „SMTP Settings“ angepasst werden. Das gespeicherte Skript kann dann entweder direkt aus der PowerShell Konsole ausgeführt werden oder aber parametrisiert über die powershell.exe.

powershell.exe -ExecutionPolicy Bypass "& '.\sendmail.ps1'"

Im Posteingang sollte dann direkt eine neue Mail eintreffen, die durch das PowerShell Skript mit „Send-MailMessage“ verschickt wurde. Die beiden PowerShell Skripte lassen sich auch bei Github herunterladen. Klick