Top-Themen

Aktuelle Themen (A bis Z)

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

PowerShell - Text an HTMLbody übergeben mit UTF-8 Kodierung

Mitglied: Pat.bat

Pat.bat (Level 1) - Jetzt verbinden

19.08.2019 um 08:17 Uhr, 422 Aufrufe, 14 Kommentare

Hallo zusammen,

ich stoße momentan auf folgendes Problem.
Ich möchte mit meinem Skript E-Mails versenden.

Text und Signatur samt Bild funktioniert auch alles wunderbar allerdings werden Umlaute nicht richtig kodiert.

Um den Body Inhalt aufzubauen, gehe ich wie folgt vor:

01.
$htmlBody = "<HTML lang=""de""><meta charset=""utf-8""><BODY><p>$Body</p><\BODY><\HTML>"
Und beim Aufbau der E-Mail gehe ich wie folgt vor:

01.
$o = New-Object -ComObject Outlook.Application
02.

03.
        $mail = $o.CreateItem(0)
04.
        $mail.importance = $Importance
05.
        $mail.subject = "$Subject"
06.
        $mail.HTMLbody = $Body + $Signatur2
07.
        $mail.To = "$To"
08.
        $mail.CC = "$CC" 
Die Variable $Body wird vorher wie folgt gefüllt:

01.
$EmailBody = "Erste Zeile mit dynamischer Variable Datum Heute: $Today<br>"
02.
$EmailBody += "Zweite Zeile mit dynmischer Variable Datum in 28 Tagen: $EVFaelligkeit <br>"
03.
$EmailBody += "Das Verzeichnis können Sie hier aufrufen: <a href=""$pathFiles"">$pathFiles</a><br>"
Es sieht auch alles aus, wie ich es haben wollte, außer das die UTF-8 Konvertierung keine Wirkung zeigt.
Mitglied: 140777
19.08.2019, aktualisiert um 10:10 Uhr
Geht einwandfrei solange man natürlich die richtigen Variablen benutzt , schau dir dein "Variablen-Mischmasch" nochmal genau an, da passt so gar nichts zusammen . Außerdem steht da im HTML und Body End Tag ein Backslash anstatt richtigerweise einem Slash!

Test:
01.
$today = get-date
02.
$EVFaelligkeit = (get-date).AddDays(28)
03.
$pathFiles = "http://domain.tld/files"
04.
$EmailBody = "Erste Zeile mit dynamischer Variable Datum Heute: $Today<br>"
05.
$EmailBody += "Zweite Zeile mit dynmischer Variable Datum in 28 Tagen: $EVFaelligkeit <br>"
06.
$EmailBody += "Das Verzeichnis können Sie hier aufrufen: <a href=""$pathFiles"">$pathFiles</a><br>"
07.
$htmlBody = "<HTML lang=""de""><meta charset=""utf-8""><BODY><p>$EMailBody</p></BODY></HTML>"
08.

09.

10.
$o = New-Object -ComObject Outlook.Application
11.
$mail = $o.CreateItem(0)
12.
$mail.importance = 0
13.
$mail.subject = "Test"
14.
$mail.BodyFormat = 2
15.
$mail.HTMLbody = $htmlBody
16.
$mail.Display()
Result:

screenshot - Klicke auf das Bild, um es zu vergrößern

Und im Zweifel gibt es immer die entsprechenden NET Klassen für die Konvertierung
https://docs.microsoft.com/de-de/dotnet/api/system.text.utf8encoding.get ...
Bitte warten ..
Mitglied: erikro
19.08.2019 um 09:40 Uhr
Moin,

ganz einfach: In Deiner Variablen steht kein Unicode, sondern ISO 8859-1. Guckst Du mal hier:
https://mohitgoyal.co/2017/03/03/understanding-default-encoding-and-chan ...
https://docs.microsoft.com/en-us/powershell/scripting/components/vscode/ ...

hth

Erik
Bitte warten ..
Mitglied: Pat.bat
19.08.2019, aktualisiert um 09:50 Uhr
@140777 funktioniert bei mir nicht, hatte vergessen, den Funktionsaufruf zu erwähnen:

01.
Send-Mail   -Importance $Importance `
02.
            -Subject $Subject `
03.
            -Body $htmlBody `
04.
            -To $To `
05.
            -CC $cc `
06.
            -Source $FilePath `
07.
            -BoolAttachments $BoolAttachments `
08.
            -Dateien @($Files)

Anbei das komplette Skript zum senden einer E-Mail:

01.
param(
02.
    $bAttachments,
03.
    $Subject,
04.
    $Importance,
05.
    $Body,
06.
    $To,
07.
    $cc,
08.
    $FilePath,
09.
    $Files,
10.
    $PProcedure
11.
)
12.

13.
$Signatur2 = Get-Content -Path "G:\FD_50_Bank\System\Aufgabenplanungen\E-Mail\Signatur.htm"
14.
$htmlBody = "<HTML lang=""de""><meta charset=""utf-8""><BODY><p>$Body</p><\BODY><\HTML>"
15.

16.
# Funktion zum Senden einer E-Mail. Parameter müssen mit übergeben werden.
17.
Function Send-Mail($Importance, $Subject, $Body, $To, $CC, $Source, $BoolAttachments, [Array]$Dateien) 
18.
{
19.
    Try {
20.
        # Erstellen eines Outlook Application Objekts
21.
        $o = New-Object -ComObject Outlook.Application
22.

23.
        $mail = $o.CreateItem(0)
24.
        $mail.importance = $Importance          # 1 = Normal, 2 = Wichtig
25.
        $mail.subject = "$Subject"        
26.
        $mail.HTMLbody = $Body + $Signatur2
27.
        $mail.To = "$To" 
28.
        $mail.CC = "$CC"
29.
 
30.
        # Gehe über alle Files in Pfad und füge nur Dateien mit bestimmten Name.Endung hinzu 
31.
        if ($BoolAttachments)
32.
            {
33.
                $files = Get-ChildItem $Source
34.
               for ($i=0; $i -lt $files.Count; $i++) {
35.

36.
                GetFiles -files $files
37.
              }
38.
            }
39.

40.
            $mail.Send()
41.
 
42.
            # Der E-Mail etwas Zeit geben zum verschicken
43.
            Start-Sleep 5
44.

45.
            # Outlook Objekt Schließen
46.
             #$o.Quit()
47.
        }
48.
    catch {
49.
	    $temp = $_.Exception
50.
	    $invocationInfo = $_.InvocationInfo.PositionMessage
51.
	    if ($_.InvocationInfo -ne $null) {
52.
            write-host $temp
53.
        }
54.
    }
55.
}
56.

57.
function GetFiles( $files )
58.
{
59.
    $outfileName = $files[$i].Name
60.
    $outfileNameFullname = $files[$i].FullName
61.
    $outfileNameExtension = $files[$i].Extension
62.
 
63.
    # wenn der Name.Endung der ist, den wir wollen, füge die Datei hinzu
64.
    Foreach ( $f in $Dateien) {
65.
        if($outfileName -eq $f)
66.
        {
67.
            $mail.Attachments.Add($outfileNameFullname);
68.
        }
69.
    }
70.
}
71.

72.
Send-Mail   -Importance $Importance `
73.
            -Subject $Subject `
74.
            -Body $htmlBody `
75.
            -To $To `
76.
            -CC $cc `
77.
            -Source $FilePath `
78.
            -BoolAttachments $BoolAttachments `
79.
            -Dateien @($Files)
Folgende E-Mail wird erstellt:
e-mailkonvertierung - Klicke auf das Bild, um es zu vergrößern
Bitte warten ..
Mitglied: 140777
19.08.2019, aktualisiert um 09:54 Uhr
Nun du liest hier eine Signatur ein ohne das Encoding korrekt zu definieren:
01.
$Signatur2 = Get-Content -Path "G:\FD_50_Bank\System\Aufgabenplanungen\E-Mail\Signatur.htm"
und kombinierst das mit selbst definiertem UTF16 Text in der Powershell im Mail Parameter mit dem + Operator. Gebe beim Get-Content den -Encoding Parameter korrekt mit ein an und kombiniere beides vorher in einer Variablen statt erst in der Eigenschaft.

Und in der entsprechenden Konsole aus der du das PS1 Skript aus aufrufst muss das Output Encoding natürlich ebenfalls stimmen (außer du konvertierst über .NET direkt) s. @erikro
Bitte warten ..
Mitglied: Pat.bat
19.08.2019 um 11:07 Uhr
hm ich habs versucht, mit und ohne Signatur.

der cmdlet Get-Content besitzt keinen -Encoding Parameter.

Aber selbst wenn ich die Signatur raus lasse und nur den $Body übergebe, kann er keine Umlaute.
Bitte warten ..
Mitglied: 140777
19.08.2019, aktualisiert um 11:46 Uhr
der cmdlet Get-Content besitzt keinen -Encoding Parameter.
Doch. Einfach mal weiterbilden...
https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell. ...

Aber selbst wenn ich die Signatur raus lasse und nur den $Body übergebe, kann er keine Umlaute.
Siehe Kommentar oben.

Btw. wieso überhaupt mit Outlook senden, geht doch viel schneller auch mit Send-MailMessage?

In Outlook selbst muss natürlich UTF8 in den internationalen Optionen auch aktiviert sein
Bitte warten ..
Mitglied: Pat.bat
19.08.2019, aktualisiert um 14:21 Uhr
Hallo @140777

Hatte ich in der Doc übersehen, habe mich zu sehr auf Intellisense von VS Code verlassen. Der zeigt mir diesen Paramter hinter dem Get-Content Befehl nicht an.

Über Send-MailMessage bekomme ich das ganze gar nicht zum laufen. Hatte damals schon viel rum probiert und Outlook schien da die beste Lösung für zu sein.

Normal sollte das dann ja so funktionieren:

01.
$Signature = Get-Content -Path "G:\FD_50_Bank\System\Aufgabenplanungen\E-Mail\Signatur.htm" -Encoding utf-8 
Aber das funktioniert nicht.

In Outlook selber ist es meines Wissens nach aktiviert, sonst hätte ich doch das Problem mit den Umlauten in alle meinen E-Mails oder nicht?

So wollte ich es jetzt zusammenstellen:

01.
$Signature = Get-Content -Path "G:\FD_50_Bank\System\Aufgabenplanungen\E-Mail\Signatur.htm" #-Encoding utf-8
02.
$htmlBody = "<HTML><meta charset=""utf-8""><BODY><p>$Body</p>$Signature<\BODY><\HTML>"
ich finde es auch etwas kurios, das die Umlaute in der Signatur funktionieren :S
Bitte warten ..
Mitglied: erikro
19.08.2019 um 15:59 Uhr
Moin,

hast Du die Dokumente gelesen, auf die ich verwiesen habe? Das Problem ist nicht der input, sondern der output. Hier mal ein Beispiel. Ich habe mit einem Editor (Kate) eine Datei erzeugt, in der steht "Können". Und die jage ich jetzt auf die Powershell.

01.
PS P:\test> $in_utf8 = Get-Content .\umlaute_in_utf8.txt -Encoding utf8
02.
PS P:\test> $in_utf8
03.
Können
Soweit, so gut. Jetzt mal mit dem default encoding der Powershell

01.
PS P:\test> $in_default = Get-Content .\umlaute_in_utf8.txt -Encoding default
02.
PS P:\test> $in_default
03.
Können
Deshalb muss ich dem Eingabebefehlen in der Powershell das UTF8-Encoding mitteilen, wenn ich was anderes als ISO 8859-1 einlesen will. Das heißt aber noch lange nicht, dass in der Variablen $in_utf8 nun auch UTF8 drinsteht. Dem ist nämlich nicht so:

01.
PS P:\test> $in_utf8 | set-content umlaute_out.txt
02.
PS P:\test> $in_false = get-content .\umlaute_out.txt -encoding utf8
03.
PS P:\test> $in_false
04.
K?nnen
Aha, das ist also kein Unicode, was da raus kommt, sondern die Default-Kodierung der PS. Und das ist nun einmal ISO 8859-1 (jedenfalls bei uns).

01.
PS P:\test> $in_correct = Get-Content .\umlaute_out.txt -encoding default
02.
PS P:\test> $in_correct
03.
Können
Das ist Dein Problem. Du schreibst in den HTML-Header rein, dass UTF-8 kommt, lieferst aber im Body ISO 8859-1 aus. Und dann funktioniert das halt nicht.

Teile ich hingegen der PS bei der Ausgabe wieder mit, dass sie nicht default schreiben soll, sondern UTF-8, dann klappt das wieder.

01.
PS P:\test> $in_utf8 | set-content umlaute_out_utf8.txt -Encoding utf8
02.
PS P:\test> Get-Content .\umlaute_out_utf8.txt -encoding utf8
03.
Können
Anders gesagt, auch wenn ich was anderes schreiben will als ISO 8859-1, muss ich das der PS sagen.

Liebe Grüße

Erik
Bitte warten ..
Mitglied: 140777
19.08.2019 um 20:44 Uhr
Deshalb muss ich dem Eingabebefehlen in der Powershell das UTF8-Encoding mitteilen, wenn ich was anderes als ISO 8859-1 einlesen will.
Nicht zwingend. Powershell ist so intelligent das Encoding einer Datei zu erkennen sofern die Datei ein BOM enthält.
Bitte warten ..
Mitglied: erikro
20.08.2019 um 08:15 Uhr
Zitat von 140777:

Deshalb muss ich dem Eingabebefehlen in der Powershell das UTF8-Encoding mitteilen, wenn ich was anderes als ISO 8859-1 einlesen will.
Nicht zwingend. Powershell ist so intelligent das Encoding einer Datei zu erkennen sofern die Datei ein BOM enthält.

Das widerspricht nicht meiner Aussage. Dafür ist der BOM ja da, dass er einem Programm mitteilt: Achtung! Das ist UTF-X.
Bitte warten ..
Mitglied: 140777
20.08.2019, aktualisiert um 08:51 Uhr
Ich bezog mich auf das : "muss ich dem Eingabebefehlen".
Muss nicht, kommt drauf an .
Bitte warten ..
Mitglied: erikro
20.08.2019 um 08:56 Uhr
Zitat von 140777:

Ich bezog mich auf das : "muss ich dem Eingabebefehlen".
Muss nicht, kommt drauf an .

Wie gesagt, das ist eine Frage der Perspektive. Ich muss es mitteilen (entweder mit -encoding utf8 oder mit U+FEFF am Anfang des Datenstroms).
Bitte warten ..
Mitglied: 140777
20.08.2019, aktualisiert um 12:33 Uhr
Zitat von Pat.bat:
Über Send-MailMessage bekomme ich das ganze gar nicht zum laufen.
Ist doch kein Thema ...
01.
Send-MailMessage -From "user@domain.de" -to "empfaenger@domain.de" -Subject "BlaBlub" -Body $htmlbody -BodyAsHtml -SmtpServer smtp.domain.de -Credential (New-Object PSCredential("USERNAME",(ConvertTo-SecureString 'PASSWORD' -AsPlainText -Force))) -UseSSL -Encoding ([System.Text.Encoding]::UTF8) -Attachments $files -Priority High
Fertsch, und du kannst Outlook in den Schrank hängen ...

Außerdem gibt's alternativ auch noch die entsprechenden .NET Methoden dafür
https://blogs.msdn.microsoft.com/deva/2017/08/30/code-send-email-using-p ...
Bitte warten ..
Mitglied: LotPings
20.08.2019 um 19:10 Uhr
Aber Hallo,
Ist doch kein Thema ...
01.
> Send-MailMessage -From "user@domain.de" -to "empfaenger@domain.de" -Subject "BlaBlub" -Body $htmlbody -BodyAsHtml -SmtpServer smtp.domain.de -Credential (New-Object PSCredential("USERNAME",(ConvertTo-SecureString 'PASSWORD' -AsPlainText -Force))) -UseSSL -Encoding ([System.Text.Encoding]::UTF8) -Attachments $files -Priority High
02.
> 
Anstatt der Bandwurm Einzeiler würde ICH ja lieber Splatting benutzen

01.
$params = @{
02.
   From        = "user@domain.de" 
03.
   to          = "empfaenger@domain.de" 
04.
   Subject     = "BlaBlub" 
05.
   Body        = $htmlbody 
06.
   BodyAsHtml  = $True
07.
   SmtpServer  = 'smtp.domain.de' 
08.
   Credential  = ((New-Object PSCredential("USERNAME",(ConvertTo-SecureString 'PASSWORD' -AsPlainText -Force)))
09.
   UseSSL      = $True
10.
   Encoding    = ([System.Text.Encoding]::UTF8) 
11.
   Attachments = $files 
12.
   Priority    = 'High'
13.
}
14.

15.
Send-MailMessage @params
Bitte warten ..
Ähnliche Inhalte
Internet
FTP Umwandlung UTF-8 in ANSI
gelöst Frage von Xaero1982Internet12 Kommentare

Moin Zusammen, gibt es eine Möglichkeit das CSV Dateien direkt vom FTP Server oder beim Upload vom UTF-8 Format ...

Python
Python mal utf-8 mal nicht
gelöst Frage von peterpaPython1 Kommentar

Hallo, ich versuche gerade ein Programm zu schreiben, in Python, welches eine große HTML Datei in mehrere kleine aufspaltet. ...

Batch & Shell
PowerShell Import Text
gelöst Frage von derhoeppiBatch & Shell8 Kommentare

Hallo, ich habe mal eine Frage an die Profis. Ich erstelle gerade ein Script, welches den Arbeitsablauf beschleunigen und ...

Blogs

Immer wiederkehrende PHP Fehlermeldung bei Wordpress UTF-8 - ASCII

gelöst Frage von vcdweltBlogs11 Kommentare

Hi, seit einiger Zeit wird mein error_log meines Wordpress Blogs mit immer der gleichen Fehlermeldung überschwemmt. 14-Dec-2017 08:18:05 UTC ...

Neue Wissensbeiträge
Windows Server

Active Directory ESE Version Store Changes in Server 2019

Information von Dani vor 3 TagenWindows Server

Moin, Last month at Microsoft Ignite, many exciting new features rolling out in Server 2019 were talked about. But ...

Exchange Server

Microsoft Extending End of Support for Exchange Server 2010

Information von Dani vor 3 TagenExchange Server4 Kommentare

Moin, After investigating and analyzing the deployment state of an extensive number of Exchange customers we have decided to ...

Schulung & Training

Humble Book Bundle: Network and Security Certification 2.0

Tipp von NetzwerkDude vor 3 TagenSchulung & Training

Abend, bei HumbleBundle gibts mal wider ein schönes Paket e-books: sind verschiedene Zertifizierungen wie MCSA, CCNA, CompTIA etc., für ...

Voice over IP

Telekom Umstellung von ISDN Anlagenanschluss auf IP-Telefonie

Erfahrungsbericht von NixVerstehen vor 6 TagenVoice over IP10 Kommentare

Hallo zusammen, nachdem nun vor ein paar Tagen die zwangsweise Umstellung von ISDN auf IP-Telefonie problemlos über die Bühne ...

Heiß diskutierte Inhalte
VB for Applications
Euro-Zeichen in jedem neu erstellten Brief mit Word automatisch entfernen
gelöst Frage von imebroVB for Applications23 Kommentare

Hallo, ich habe ein Problem mit Word, bzw. mit dem €-Zeichen, welches bei Erstellung eines Word-Briefes automatisch eingesetzt wird. ...

Batch & Shell
Regedit eintrad ändern als Admin
Frage von cyberworm83Batch & Shell19 Kommentare

Hallo zusammen, ich bin derzeit als Rollout Techniker unterwegs und muss täglich bei zig Rechnern einen Registry Einträg ändern ...

Visual Studio
Prüfen, ob Programm schon disposed wurde
Frage von MarcoBornVisual Studio17 Kommentare

Hallo Forum, ich habe in VB.NET ein Programm geschrieben, welches Word startet und dort Daten ausliest. Obwohl ich die ...

Router & Routing
Mikrotik Config PTP
Frage von Marcel94Router & Routing17 Kommentare

Hallo, kennt sich jemand mit Mikrotik aus? Möchte gerne eine PTP Verbindung mit zwei SYTsq 5ac Antennen erstellen. So ...