zadopeck
Goto Top

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 face-sad(((((

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"

Content-Key: 299051

Url: https://administrator.de/contentid/299051

Ausgedruckt am: 19.03.2024 um 11:03 Uhr

Mitglied: MrCount
MrCount 14.03.2016 aktualisiert um 12:29:16 Uhr
Goto Top
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:

$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"  
Mitglied: Zadopeck
Zadopeck 14.03.2016 aktualisiert um 19:10:36 Uhr
Goto Top
Hi,

danke erstmal für den Beitrag, hab das mal so umgesetzt doch leider scheitert es immernoch.
Das ganze hab ich jetzt mit mehreren externen Smtp Servern versucht - solange ich die Benutzerdaten manuell eingebe
funktioniert das bei allen - aber mit dem automatischen Übergeben machen sie alle zu -
FM Benutzer nicht authen... jetzt hab ich keine Ahnung, ob das eine Einstellung der Smtp Servern ist, die automatische
Anmeldungen nicht zulässt oder in der Variablen nicht die richtigen Sachen drin stehen !?
Mit der Powershell stehe ich auch noch ein wenig auf Kriegsfuss, weil ich es nicht schaffe Haltepunkte einzufügen und
mir den Inhalt der Variablen anzeigen zu lassen - wäre halt schon hilfreich wenn ich mal auslesen könnte was in $anonCredentials so drin steht.
Hab schon soviele Sachen gelesen und bin dabei auch öftersmal auf Einträge gestossen, dass wohl in Credentials
das Passwort für den "gecachten" Benutzer drin steht bzw. dahin nur das PW übergeben wird - kann das sein, dass man da nur ein Passwort reinschreiben kann

Hier ein Nachtrag:

Ok das mit den Haltepunkten und dem Auslesen hab ich jetzt hinbekommen, da steht mein Benutzeranme und bei Passwort irgendwas von Securitystring - also verschlüsselt.
Wie kommt das jetzt aber beim Smtp Server an, liegt hier vielleicht das Problem ??
Hab jetzt auch mal den Mailbetreiber angeschrieben vielleicht bringt das Licht ins Dunkel

Danke für die Hilfe

Gruss Mike
Mitglied: SaschaRD
SaschaRD 16.03.2016 aktualisiert um 10:14:26 Uhr
Goto Top
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:
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
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.
$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
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
Mitglied: Zadopeck
Zadopeck 19.03.2016 aktualisiert um 17:24:19 Uhr
Goto Top
Hi Sascha,

danke erstmal für deine Hilfe. Leider häng ich immer noch. Wenn ich das jetzt so umsetze dann kommt immer noch das Anmeldefenster wo jetzt aber bei User "Username\$" drinsteht - lösch ich Dollar und Slash weg und gebe darunter mein Kennwort ein bekomme ich die E-Mail face-sad(((
Wenn ich das richtig verstehe was dein Script macht dann schreibst das PW in $UserpassDecrypted und das im Klartext.
Aber scheinbar kommt das PW nicht an bzw. nicht mit der richtigen Stelle. Liegt das jetzt am Mailserver ? Wird überhaupt ein PW übermittelt ?? kann ich das testen ??
Ich hab mal gelesen das die send-messagemail locale bzw. domänenaccounts benötigt und von denen die Anmeldeinformationen nimmt bzw.
das man von denen diese verwenden kann.

Hast noch eine Idee.

Gruss Mike

Ok Nachtrag,

Das mit dem Benuzternamen hab ich wohl gefunden - wenn ich $MailUser in " " setze dann steht der Name ohne Slash und Dollarzeichen drin aber das Passwortfeld ist immer noch leer.

Ok weitere Erkenntnisse.
Das Dollarzeichen war das erste Zeichen von meinem Passwort - der Rest davon wurde nicht angezeigt. Hab das Passwort jetzt mal geändert - ohne Dollarzeichen und das Passwort wird komplett angezeigt allerdings direkt hinter dem Benutzernamen. Also wird es ja übertragen aber es landet nicht an der richtigen Stelle, woran liegt das jetzt ??? muss und kann ich da Steuerzeichen mitgeben für Tab und Enter oder wie ???
Puhh härter als gedacht face-smile)) aber dennoch spassig

Danke für die Hilfe
Mitglied: SaschaRD
SaschaRD 21.03.2016 um 09:53:06 Uhr
Goto Top
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:
Write-Host Zeile 19: Send-MailMessage -To $To -Subject $Subject -Body $Body -SmtpServer $Smtp -From $From -Credential $MailUser\$UserPassDecrypted -UseSSL
Immer die Zeilennummer wo Du dich im Code befindest vorne Weg schreiben, dann ist es einfacher, wenn Du mehrere Ausgaben auf einmal durchführst.

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.de

Beim 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
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:
Remove-Variable -Name MailUser
so wird der Inhalt der in der Variable MailUser steht entfernt.

Wenn Du weitere Fragen hast meld dich =)

Gruß, Sascha