klausk94
Goto Top

PowerShell Script für MailVersand mit Anhang

Hallo Zusammen,

ich bin aktuell etwas am verzweifeln an einem PS Script für den Emailversand...
Das Script funktioniert, jedoch wird mir kein Anhang in die Mail angehängt.

Die Datei sowie der Pfad sind existent.
Die PS wird mit Administratorenrechten gestartet.

Anbei das Script:

## e-mail notfication
$EmailFrom = "VON@DOMAIN.de"  
$EmailTo = "AN@DOMAIN.de"  
$Subject = "[TimedWindowsUpdates] WindowsUpdatesAuslesen und VersandViaMail"  
$Body = "Nachrichttext?"  
$SMTPServer = "smtp.office365.com"  
$SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer, 587)
$SMTPClient.EnableSsl = $true
$SMTPClient.Credentials = New-Object System.Net.NetworkCredential("VON@DOMAIN.de", "Passwort");  
$SMTPClient.Send($EmailFrom, $EmailTo, $Subject, $Body)

$attached_file=“C:\temp\PSLogReport.html“

if($email_receiver.count -gt 0){}

 foreach($receiver in $email_receiver){
  write-host "-send email to: "$receiver  
  send-mailmessage -from $email_sender -to $receiver -subject $email_subject -Body "see attached file" -Attachments $attached_file -dno onSuccess,   
  onFailure -smtpServer $email_server
 }

Wenn jemand mir n Tipp geben könnte wäre das super!

Vielen Dank im Voraus

Grüße
Klaus

Content-ID: 617207

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

Ausgedruckt am: 21.11.2024 um 21:11 Uhr

DerWoWusste
Lösung DerWoWusste 29.10.2020 aktualisiert um 11:40:29 Uhr
Goto Top
Hi.

Nimm mal die schicken Zeichen rund um den Pfad zum Anhang weg und ersetze diese durch "
klausk94
klausk94 29.10.2020 aktualisiert um 11:42:45 Uhr
Goto Top
Ist erl.
Jedoch keine Besserung.

## e-mail notfication
$EmailFrom = "VON@DOMAIN.de"  
$EmailTo = "AN@DOMAIN.de"  
$Subject = "[TimedWindowsUpdates] WindowsUpdatesAuslesen und VersandViaMail"  
$Body = "Nachrichttext?"  
$SMTPServer = "smtp.office365.com"  
$SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer, 587)
$SMTPClient.EnableSsl = $true
$SMTPClient.Credentials = New-Object System.Net.NetworkCredential("VON@DOMAIN.de", "Passwort");  
$SMTPClient.Send($EmailFrom, $EmailTo, $Subject, $Body)

$attached_file="C:\temp\PSLogReport.html"  

if($email_receiver.count -gt 0){}

 foreach($receiver in $email_receiver){
  write-host "-send email to: "$receiver  
  send-mailmessage -from $email_sender -to $receiver -subject $email_subject -Body "see attached file" -Attachments $attached_file -dno onSuccess,   
  onFailure -smtpServer $email_server
 }

Trotzdem Danke für den Tipp ;)
manuel-r
Lösung manuel-r 29.10.2020 um 12:23:45 Uhr
Goto Top
Mahlzeit

Kannst du einfach mal mit einer einfachen .txt als Anhang testen? Nicht, dass irgendeine Instanz die angehängte .html aus der eMail entfernt...

Manuel
mbehrens
Lösung mbehrens 29.10.2020 um 12:29:26 Uhr
Goto Top
Zitat von @klausk94:

ich bin aktuell etwas am verzweifeln an einem PS Script für den Emailversand...
Das Script funktioniert, jedoch wird mir kein Anhang in die Mail angehängt.

attached_file=“C:\temp\PSLogReport.html“

Wenn jemand mir n Tipp geben könnte wäre das super!

Der Parameter Attachments erwartet doch einen Wert vom Typ String und nicht vom Typ String.
klausk94
klausk94 29.10.2020 um 12:29:40 Uhr
Goto Top
Hallo Manuel,

wurde gemacht, jedoch auch ohne Erfolg.

Grüße
Klaus
klausk94
klausk94 29.10.2020 um 12:31:02 Uhr
Goto Top
@mbehrens

kann dir da nicht ganz folgen.
Kannst du mir auf die Sprünge helfen?

Grüße
Klaus
manuel-r
Lösung manuel-r 29.10.2020 um 12:36:42 Uhr
Goto Top
string
ist ein Array das explizit als String definiert ist. @mbehrens meint also du sollst anstelle eines Strings ein String-Array übergeben.

Manuel
Tektronix
Tektronix 29.10.2020 aktualisiert um 12:39:17 Uhr
Goto Top
Moin,
get-help Send-MailMessage -examples

email-anhang-powershell
146189
Lösung 146189 29.10.2020 aktualisiert um 13:25:41 Uhr
Goto Top
Da mischt einer den SMTPClient mit Send-Mailmessage face-smile. Denn dem das sind zwei völlig verschiedene paar Schuhe min Jung face-wink. Btw. beide sind mittlerweile als veraltet markiert und nicht mehr empfehlenswert. Würde daher besser gleich zu Mailkit raten das auch moderne Methoden unterstützt.

Wilst du trotzdem weiterhin den SMTPClient nutzen, siehe den Link von Tektronix
Email mit Anhang über Powershell?

Du mischst hier nur beide Varianten auch mit nicht vorhandenen Variablen, deshalb geht das nicht.
klausk94
klausk94 29.10.2020 um 14:10:51 Uhr
Goto Top
Vielen Herzlichen Dank für eure Hilfe!

Ein kleines Ding hätte ich noch, die Datei die Angehängt wird, wird sich am Namen ändern
auf ein bestimmtes Datum.

Sprich ich würde gerne noch einen Schritt haben, dass das Script immer die "aktuelleste" Datei versendet.

Beispiel der Namen:
01_10_2020_log.html
05_10_2020_log.html
10_10_2020_log.html
29_10_2020_log.html

Wie kann ich das realisieren?

Grüße
Klaus
manuel-r
Lösung manuel-r 29.10.2020 aktualisiert um 14:39:04 Uhr
Goto Top
Kein Problem
$Suchpfad = "c:\temp"  
$NeuesteDatei = Get-ChildItem -Path $Suchpfad | Sort-Object LastAccessTime -Descending | Select-Object -First 1
$NeuesteDateiNurName = $NeuesteDatei.name
$NeuesteDateiMitPfad = $NeuesteDatei.fullname

Manuel

PS:
Anstelle von LastAccessTime könntest du u.U. auch CreationTime verwenden. Das kommt drauf an, was du brauchst.
146189
146189 29.10.2020 aktualisiert um 14:58:16 Uhr
Goto Top
Beispiel der Namen:
01_10_2020_log.html
05_10_2020_log.html
10_10_2020_log.html
29_10_2020_log.html
Oder wenn es zwingend das Datum aus dem Dateinamen sein muss das ausgewertet werden soll dann
$latestfile = ls 'C:\temp' -file -Filter *.html | ?{$_.Basename -match '(\d{2})_(\d{2})_(\d{4})'} | sort {get-date "$($matches[3])-$($matches[2])-$($matches[1])"} -Desc | select -F 1  
$latestfile.FullName
klausk94
klausk94 29.10.2020 um 15:02:33 Uhr
Goto Top
@146189

wenn ich folgendes in PS ausführe:
$User = "USER"  
$File = "C:\LoginSendMailPW.txt"  
$cred=New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $User, (Get-Content $File | ConvertTo-SecureString)
$EmailTo = "ZU"  
$EmailFrom = "VON"  
$Subject = "[KD-Nummer] WindowsUpdate-Report"   
$Body = "Dies ist eine automatisch generierte Nachricht.   
Bitte antworten Sie nicht auf diese!"   
$SMTPServer = "smtp.office365.com"  
$latestfile = ls 'C:\temp' -file -Filter *.html | ?{$_.Basename -match '(\d{2})_(\d{2})_(\d{4})'} | sort {(get-date "$($matches[3])-$($matches[2])-$($matches[1])")} -Desc | select -First 1  
$latestfile
$filenameAndPath = "C:\temp\PSLogReport.html"  
$SMTPMessage = New-Object System.Net.Mail.MailMessage($EmailFrom,$EmailTo,$Subject,$Body)
$attachment = New-Object System.Net.Mail.Attachment($filenameAndPath)
$SMTPMessage.Attachments.Add($attachment)
$SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer, 587) 
$SMTPClient.EnableSsl = $true 
$SMTPClient.Credentials = New-Object System.Net.NetworkCredential($cred.UserName, $cred.Password); 
$SMTPClient.Send($SMTPMessage)

erhalte ich das als Ausgabe:
New-Object : Ausnahme beim Aufrufen von ".ctor" mit 1 Argument(en):  "Der Parameter fileName kann keine leere Zeichenfolge sein.  
Parametername: fileName"  
In Zeile:13 Zeichen:15
+ $attachment = New-Object System.Net.Mail.Attachment($filenameAndPath)
+               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [New-Object], MethodInvocationException
    + FullyQualifiedErrorId : ConstructorInvokedThrowException,Microsoft.PowerShell.Commands.NewObjectCommand
klausk94
klausk94 29.10.2020 um 15:06:30 Uhr
Goto Top
Okay! Kommando zurück, das war meine Unfähigkeit! Bitte Entschuldige.

Was ich jetzt als letztes Problem für heute hätte ist, dass zwar die Abfrage zur aktuellsten Datei existiert, er mir aber trotzdem nicht die aktuellste schickt.

Aktuell gibts zwei Dateien in dem C:\temp Ordner
eine generiert um 9:54 Uhr und eine um 11:02Uhr.

senden tut er mir nur die von 09:54Uhr und nicht die von 11:02Uhr

Oder hab ich Tomaten auf den Augen...

$User = "USER"  
$File = "C:\LoginSendMailPW.txt"  
$cred=New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $User, (Get-Content $File | ConvertTo-SecureString)
$EmailTo = "ZU"  
$EmailFrom = "AN"  
$Subject = "[KD-Nummer] WindowsUpdate-Report"   
$Body = "Dies ist eine automatisch generierte Nachricht.   
Bitte antworten Sie nicht auf diese!"   
$SMTPServer = "smtp.office365.com"  
$latestfile = ls 'C:\temp' -file -Filter *.html | ?{$_.Basename -match '(\d{2})_(\d{2})_(\d{4})'} | sort {(get-date "$($matches[3])-$($matches[2])-$($matches[1])")} -Desc | select -First 1  
$filenameAndPath = "C:\temp\PSLogReport.html"  
$SMTPMessage = New-Object System.Net.Mail.MailMessage($EmailFrom,$EmailTo,$Subject,$Body)
$attachment = New-Object System.Net.Mail.Attachment($filenameAndPath)
$SMTPMessage.Attachments.Add($attachment)
$SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer, 587) 
$SMTPClient.EnableSsl = $true 
$SMTPClient.Credentials = New-Object System.Net.NetworkCredential($cred.UserName, $cred.Password); 
$SMTPClient.Send($SMTPMessage)

Grüße
Klaus
146189
Lösung 146189 29.10.2020 aktualisiert um 15:08:16 Uhr
Goto Top
Bitte nochmal ganz genau den Code aus dem anderen Beitrag ansehen, und nicht immer vorschnell posten bitte! Danke...
$SMTPMessage.Attachments.Add($filenameAndPath)
Steht ja schon in der Fehlermeldung ....
klausk94
klausk94 29.10.2020 um 15:08:15 Uhr
Goto Top
Uff... Was trag ich dann dort ein?
146189
146189 29.10.2020 um 15:08:27 Uhr
Goto Top
s.o.
klausk94
klausk94 29.10.2020 um 15:13:17 Uhr
Goto Top
Sorry ich glaub ich bin grad echt bissl überfordert oder ich hab zu viel im Kopf...


$User = "USER"
$File = "C:\LoginSendMailPW.txt"
$cred=New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $User, (Get-Content $File | ConvertTo-SecureString)
$EmailTo = "ZU"
$EmailFrom = "VON"
$Subject = "[KD-Nummer] WindowsUpdate-Report"
$Body = "Dies ist eine automatisch generierte Nachricht.
Bitte antworten Sie nicht auf diese!"
$SMTPServer = "smtp.office365.com"
$latestfile = ls 'C:\temp' -file -Filter *.html | ?{$_.Basename -match '(\d{2})_(\d{2})_(\d{4})'} | sort {(get-date "$($matches[3])-$($matches[2])-$($matches[1])")} -Desc | select -First 1
$filenameAndPath = "C:\temp\PSLogReport.html"
$SMTPMessage = New-Object System.Net.Mail.MailMessage($EmailFrom,$EmailTo,$Subject,$Body)
$attachment = New-Object System.Net.Mail.Attachment($filenameAndPath)
$SMTPMessage.Attachments.Add($attachment)
$SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer, 587)
$SMTPClient.EnableSsl = $true
$SMTPClient.Credentials = New-Object System.Net.NetworkCredential($cred.UserName, $cred.Password);
$SMTPClient.Send($SMTPMessage)

Gehe ich der Annahme richtig, bitte korregiere mich wenn ich Falsch bin:
$SMTPMessage.Attachments.Add($attachment) -> Sagt, füge einen Anhang hinzu der dem Wert $attachment entspricht
$attachment -> Sagt, neues Objekt, dass du dir holen sollst von $filenameAndPath
$filenameAndPath -> gibt den Pfad zur Datei an die versendet wird

Wo hab ich denn jetzt meinen Haken
146189
146189 29.10.2020 aktualisiert um 15:18:35 Uhr
Goto Top
Wo hab ich denn jetzt meinen Haken
Wie gesagt Brille aufsetzen, falsche Variable benutzt ....
klausk94
klausk94 29.10.2020 um 15:45:51 Uhr
Goto Top
Sorry, ich werde daraus nicht schlau.
Kannst du mir die Lösung sagen?