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-Key: 617207

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

Printed on: April 23, 2024 at 11:04 o'clock

Member: DerWoWusste
Solution DerWoWusste Oct 29, 2020 updated at 10:40:29 (UTC)
Goto Top
Hi.

Nimm mal die schicken Zeichen rund um den Pfad zum Anhang weg und ersetze diese durch "
Member: klausk94
klausk94 Oct 29, 2020 updated at 10:42:45 (UTC)
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 ;)
Member: manuel-r
Solution manuel-r Oct 29, 2020 at 11:23:45 (UTC)
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
Member: mbehrens
Solution mbehrens Oct 29, 2020 at 11:29:26 (UTC)
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.
Member: klausk94
klausk94 Oct 29, 2020 at 11:29:40 (UTC)
Goto Top
Hallo Manuel,

wurde gemacht, jedoch auch ohne Erfolg.

Grüße
Klaus
Member: klausk94
klausk94 Oct 29, 2020 at 11:31:02 (UTC)
Goto Top
@mbehrens

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

Grüße
Klaus
Member: manuel-r
Solution manuel-r Oct 29, 2020 at 11:36:42 (UTC)
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
Member: Tektronix
Tektronix Oct 29, 2020 updated at 11:39:17 (UTC)
Goto Top
Moin,
get-help Send-MailMessage -examples

email-anhang-powershell
Mitglied: 146189
Solution 146189 Oct 29, 2020 updated at 12:25:41 (UTC)
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.
Member: klausk94
klausk94 Oct 29, 2020 at 13:10:51 (UTC)
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
Member: manuel-r
Solution manuel-r Oct 29, 2020 updated at 13:39:04 (UTC)
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.
Mitglied: 146189
146189 Oct 29, 2020 updated at 13:58:16 (UTC)
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
Member: klausk94
klausk94 Oct 29, 2020 at 14:02:33 (UTC)
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
Member: klausk94
klausk94 Oct 29, 2020 at 14:06:30 (UTC)
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
Mitglied: 146189
Solution 146189 Oct 29, 2020 updated at 14:08:16 (UTC)
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 ....
Member: klausk94
klausk94 Oct 29, 2020 at 14:08:15 (UTC)
Goto Top
Uff... Was trag ich dann dort ein?
Mitglied: 146189
146189 Oct 29, 2020 at 14:08:27 (UTC)
Goto Top
s.o.
Member: klausk94
klausk94 Oct 29, 2020 at 14:13:17 (UTC)
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
Mitglied: 146189
146189 Oct 29, 2020 updated at 14:18:35 (UTC)
Goto Top
Wo hab ich denn jetzt meinen Haken
Wie gesagt Brille aufsetzen, falsche Variable benutzt ....
Member: klausk94
klausk94 Oct 29, 2020 at 14:45:51 (UTC)
Goto Top
Sorry, ich werde daraus nicht schlau.
Kannst du mir die Lösung sagen?