Mail aus Batchdatei verschicken
Hallo zusammen,
das Thema hab ich hier schon gefunden, aber leider konnte ich für meinen Fall die Lösung nicht finden.
Habe hier eine Batchdatei für das Verschicken ein Email.
Die Batch arbeitet dazu mit einem powershell Einzeiler und das scheint auch genau mein Problem zusein.
Das Ganze funktioniert, aber nur mit manueller Eingabe meiner Daten für den Smtp Server von hotmail.
Da das aber ja nicht Sinn der Sache ich - habe ich jetzt erfolglos versucht die Anmeldedaten in
die $perf Variable zu übergeben.
Dazu hab ich nachgelesen, dass man die Anmeldedaten mit der Funktion
(Get-Credential).password | ConvertFrom-SecureString > MailPW.txt
in die Textdatei schreiben soll und dann später wieder mit folgendem auslesen und in die $cerd Variable übergeben
$pw = Get-Content .\MailPW.txt | ConvertTo-SecureString
$cred = New-Object System.Management.Automation.PSCredential "MailUser", $pw
Innerhalb meiner Batch funktioniert das aber so nicht, müsste dann doch einen Bereich irgendwie als Powershell Absatz kennzeichnen - oder ??
Also die txt Datei hab ich erstellt und in den Ordner gepackt in der meine Batch liegt.
Hatte den Zweizeiler zum erzeugen von $cred hab ich vor die Powershellzeile gelegt, aber da kennt die Batch die PS ja noch nicht.
Wahrscheinlich ist es keine grosse Sache und ich muss mir an den Kopf, dass ich da nicht allein drauf gekommen bin (((((
Bitte helft mir auf die Sprünge und sorry für die laienhafte Beschreibung - sind meine ersten Gehversuch auf dem Gebiet.
meine Batch:
echo off
set SMTP=smtp.live.com
set SUBJECT=Erfolgsmeldung DASI
set BODY=Datensicherung war erfolgreich.
set FROM=XXX@hotmail.de
set TO=XXXX@yahoo.de
set port=25
echo Die EMail wird verschickt
powershell -ExecutionPolicy Unrestricted -c "Send-MailMessage -To '%TO%' -Subject '%SUBJECT%' -Body '%BODY%' -SmtpServer '%SMTP%' -From '%FROM%' -Credential 'Mailuser' -UseSSL"
das Thema hab ich hier schon gefunden, aber leider konnte ich für meinen Fall die Lösung nicht finden.
Habe hier eine Batchdatei für das Verschicken ein Email.
Die Batch arbeitet dazu mit einem powershell Einzeiler und das scheint auch genau mein Problem zusein.
Das Ganze funktioniert, aber nur mit manueller Eingabe meiner Daten für den Smtp Server von hotmail.
Da das aber ja nicht Sinn der Sache ich - habe ich jetzt erfolglos versucht die Anmeldedaten in
die $perf Variable zu übergeben.
Dazu hab ich nachgelesen, dass man die Anmeldedaten mit der Funktion
(Get-Credential).password | ConvertFrom-SecureString > MailPW.txt
in die Textdatei schreiben soll und dann später wieder mit folgendem auslesen und in die $cerd Variable übergeben
$pw = Get-Content .\MailPW.txt | ConvertTo-SecureString
$cred = New-Object System.Management.Automation.PSCredential "MailUser", $pw
Innerhalb meiner Batch funktioniert das aber so nicht, müsste dann doch einen Bereich irgendwie als Powershell Absatz kennzeichnen - oder ??
Also die txt Datei hab ich erstellt und in den Ordner gepackt in der meine Batch liegt.
Hatte den Zweizeiler zum erzeugen von $cred hab ich vor die Powershellzeile gelegt, aber da kennt die Batch die PS ja noch nicht.
Wahrscheinlich ist es keine grosse Sache und ich muss mir an den Kopf, dass ich da nicht allein drauf gekommen bin (((((
Bitte helft mir auf die Sprünge und sorry für die laienhafte Beschreibung - sind meine ersten Gehversuch auf dem Gebiet.
meine Batch:
echo off
set SMTP=smtp.live.com
set SUBJECT=Erfolgsmeldung DASI
set BODY=Datensicherung war erfolgreich.
set FROM=XXX@hotmail.de
set TO=XXXX@yahoo.de
set port=25
echo Die EMail wird verschickt
powershell -ExecutionPolicy Unrestricted -c "Send-MailMessage -To '%TO%' -Subject '%SUBJECT%' -Body '%BODY%' -SmtpServer '%SMTP%' -From '%FROM%' -Credential 'Mailuser' -UseSSL"
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 299051
Url: https://administrator.de/contentid/299051
Ausgedruckt am: 25.11.2024 um 20:11 Uhr
5 Kommentare
Neuester Kommentar
Hallo Zadopeck,
ist Subject, Body, Sender und Empfänger immer gleich?
Falls ja, dann kannst du doch das ganze komplett in PS (deinScript.ps1) auslagern, und nur per batch starten.
Die 2 Zeilen für $cred sind Powershell-Code...
Hier mal eine Hilfe:
Quelle: serverfault.com
Gruß
P.S.: Das PowerShell-Script (deinScript.ps1) startest du dann aus der Batch mit:
ist Subject, Body, Sender und Empfänger immer gleich?
Falls ja, dann kannst du doch das ganze komplett in PS (deinScript.ps1) auslagern, und nur per batch starten.
Die 2 Zeilen für $cred sind Powershell-Code...
Hier mal eine Hilfe:
$anonUsername = "anonymous"
$anonPassword = ConvertTo-SecureString -String "anonymous" -AsPlainText -Force
$anonCredentials = New-Object System.Management.Automation.PSCredential($anonUsername,$anonPassword)
Send-MailMessage -to "Big Boss <ceo@example.com>" -from "Me <advis12@example.com>" -subject "It's working! EOM" -credential $anonCredentials
Quelle: serverfault.com
Gruß
P.S.: Das PowerShell-Script (deinScript.ps1) startest du dann aus der Batch mit:
powershell.exe -executionpolicy Unrestricted -File "deinScript.ps1"
Hallo Mike,
sorry war einige Tage sehr beschäftigt.
Zuallererst meine Empfehlung; wechsel teils Batch/Powershell direkt zu Powershell. Wenn Du dabei Unterstützung benötigst, meld dich hier im Forum.
Zu deiner Fragestellung:
Umsetzung in Powershell:
Die Funktion GeneratePassword wird einmalig ausgeführt um das Passwort zu generieren und die Datei pass.txt auszulagern. Anschließend entfernst Du den eingetragen Wert aus der Variable und kommentierst sie aus.
Funktionsaufrufe erfolgen in dem der Funktionsname GeneratePassword z.B. am Ende der Powershell-Datei geschrieben wird. Dasselbe gilt für die Funktion, nach Ausführung dieser, nimmst Du sie wieder raus.
Der Port ist Standardmäßig auf 25, sollte dieser abweichen einfach -Port hinzufügen.
Informationen zur Send-MailMessage Funktion findest Du auch hier im Technet
Kann den Mail versandt aus meiner Umgebung hier nicht testen, Feedback wäre super =)
Hier ist noch Anleitung auf Administrator.de welche ich noch nicht zur Gänze vollendet habe *schäm*.
Gruß, Sascha
sorry war einige Tage sehr beschäftigt.
Zuallererst meine Empfehlung; wechsel teils Batch/Powershell direkt zu Powershell. Wenn Du dabei Unterstützung benötigst, meld dich hier im Forum.
Zu deiner Fragestellung:
powershell -ExecutionPolicy Unrestricted -c "Send-MailMessage -To '%TO%' -Subject '%SUBJECT%' -Body '%BODY%' -SmtpServer '%SMTP%' -From '%FROM%' -Credential 'Mailuser' -UseSSL"
Mailuser wird nicht als Variable erkannt; wenn Du sie in Batch deklariert hast. Der Mix aus Batch/Powershell kann an dieser Stelle nicht verarbeitet werden.Umsetzung in Powershell:
$MailUser = "Mike"
$MailPassword = "Mike"
$PassFile = "C:\Powershell\Mail\pass.txt"
# Funktion zum Verschlüsseln des Passworts, welches in der Variable $MailPassword deklariert wurde.
function GeneratePassword {
ConvertTo-SecureString -String $MailPassword -AsPlainText -Force |
ConvertFrom-SecureString | Out-File $PassFile
}
GeneratePassword
Funktionsaufrufe erfolgen in dem der Funktionsname GeneratePassword z.B. am Ende der Powershell-Datei geschrieben wird. Dasselbe gilt für die Funktion, nach Ausführung dieser, nimmst Du sie wieder raus.
$MailUser = "Mike"
#$MailPassword = ""
$PassFile = "C:\Powershell\Mail\pass.txt"
# Funktion zum Verschlüsseln des Passworts, welches in der Variable $MailPassword deklariert wurde.
function GeneratePassword {
ConvertTo-SecureString -String $MailPassword -AsPlainText -Force |
ConvertFrom-SecureString | Out-File $PassFile
}
# Funktion zum E-Mail Versand
function SendMail {
$UserPassCrypted = Get-Content $PassFile | ConvertTo-SecureString
$UserPassDecrypted = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto([System.Runtime.InteropServices.Marshal]::SecureStringToBSTR(($UserPassCrypted)))
$Smtp = "smtp.live.com"
$Subject = "Erfolgsmeldung DASI"
$Body = "Datensicherung war erfolgreich."
$From = "XXX@hotmail.de"
$To = "XXXX@yahoo.de"
Send-MailMessage -To $To -Subject $Subject -Body $Body -SmtpServer $Smtp -From $From -Credential $MailUser\$UserPassDecrypted -UseSSL
}
SendMail
Informationen zur Send-MailMessage Funktion findest Du auch hier im Technet
Kann den Mail versandt aus meiner Umgebung hier nicht testen, Feedback wäre super =)
Hier ist noch Anleitung auf Administrator.de welche ich noch nicht zur Gänze vollendet habe *schäm*.
Gruß, Sascha
Morgen Mike,
wo befinden wir uns, Batch oder Powershell? Die einfachste Methode zum Überprüfen ob ein Skript erfolgreich arbeitet ist mit Write-Host Ausgaben zu arbeiten. Füge also an die Stellen in deinem Skript Ausgaben ein, welche zu einem Problem führen.
Hier ein Beispiel an Hand des oben genannten Codes:Immer die Zeilennummer wo Du dich im Code befindest vorne Weg schreiben, dann ist es einfacher, wenn Du mehrere Ausgaben auf einmal durchführst.
Beim Ausführen merke ich selbst, dass die Credentials bei mir auch nicht genommen werden. Habe die Variable $UserPassDecrypted entfernt und die benötigte Variable hinzugefügt die ordentlich mit den Credentials umgehen kann. Somit steht das Passwort auch nicht mehr im Klartext; wenn Du nicht möchtest, dass die Variable weiter verwendet wird:
so wird der Inhalt der in der Variable MailUser steht entfernt.
Wenn Du weitere Fragen hast meld dich =)
Gruß, Sascha
wo befinden wir uns, Batch oder Powershell? Die einfachste Methode zum Überprüfen ob ein Skript erfolgreich arbeitet ist mit Write-Host Ausgaben zu arbeiten. Füge also an die Stellen in deinem Skript Ausgaben ein, welche zu einem Problem führen.
Hier ein Beispiel an Hand des oben genannten Codes:
Write-Host Zeile 19: Send-MailMessage -To $To -Subject $Subject -Body $Body -SmtpServer $Smtp -From $From -Credential $MailUser\$UserPassDecrypted -UseSSL
Wenn ich das richtig verstehe was dein Script macht dann schreibst das PW in $UserpassDecrypted und das im Klartext.
Ja das Passwort steht im Klartext dort, siehe hier die schöne Antwort von @114757 Administrator.deBeim Ausführen merke ich selbst, dass die Credentials bei mir auch nicht genommen werden.
$MailUser = "Mike"
#$MailPassword = ""
$PassFile = "C:\Powershell\Mail\pass.txt"
# Funktion zum Verschlüsseln des Passworts, welches in der Variable $MailPassword deklariert wurde.
function GeneratePassword {
ConvertTo-SecureString -String $MailPassword -AsPlainText -Force |
ConvertFrom-SecureString | Out-File $PassFile
}
# Funktion zum E-Mail Versand
function SendMail {
$UserPassCrypted = Get-Content $PassFile | ConvertTo-SecureString
$Credentials = New-Object System.Management.Automation.PSCredential ("$MailUser", $UserPassCrypted)
$Smtp = "smtp.live.com"
$Subject = "Erfolgsmeldung DASI"
$Body = "Datensicherung war erfolgreich."
$From = "XXX@hotmail.de"
$To = "XXXX@yahoo.de"
Send-MailMessage -To $To -Subject $Subject -Body $Body -SmtpServer $Smtp -From $From -Credential $Credentials -UseSSL
}
#GeneratePassword
SendMail
Remove-Variable -Name MailUser
Wenn Du weitere Fragen hast meld dich =)
Gruß, Sascha