pat.bat
Goto Top

PowerShell - E-Mail versenden über Outlook

Hallo zusammen,

ich habe jetzt ein kleines Skript in PS gebastelt, das E-Mails verschicken soll. Das Skript wird aus anderen Skripten heraus aufgerufen.

Die Daten werden auch korrekt übermittelt, aber sobald in dem Skript der Funktionsaufruf von Send-Mail ist, sind plötzlich alle Variablen leer außer einer ($Subject). Zumal er immer eine Exception schmeißt, das ein Objekt nicht verwendet werden kann :S

param(
    $bAttachments,
    $Subject,
    $Importance,
    $Body,
    $To,
    $cc,
    $FilePath,
    $Files,
    $PProcedure
)

function main()
{
    Try {
    # E-Mail versenden
    [bool]$BoolAttachments = $bAttachments
    [string]$Subject = $Subject
    [int16]$Importance = $Importance
    [string]$Text = $Body
    [string]$To = $To
    [string]$cc = $cc

    Send-Mail -Subject $Subject ` 
              -Importance $Importance  ` 
              -Body $Text ` 
              -To $To `
              -cc $cc ` 
              -Source $FilePath `
              -BoolAttachments $BoolAttachments `
              -Dateien @($Files) 
    }
    Catch {
	        $temp = $_.Exception
	        $invocationInfo = $_.InvocationInfo.PositionMessage
	        if ($_.InvocationInfo -ne $null) {
                Write-Host $InvocationInfo
                Write-Host $temp 
            }
        }
    }

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

    $mail = $o.CreateItem(0)
    $mail.importance = $Importance           ----> Exception wird verursacht
    $mail.subject = $Subject
    $mail.HTMLbody = $Body 
    $mail.To = $To
    $mail.CC = $CC
    
 
    # Gehe über alle Files in Pfad und füge nur Dateien mit bestimmten Name.Endung hinzu 
    if ($BoolAttachments)
        {
            $files = Get-ChildItem $Source
            for ($i=0; $i -lt $files.Count; $i++) {

            GetFiles -files $files
            }
        }

        $mail.Send()
 
        # Der E-Mail etwas Zeit geben zum verschicken
        Start-Sleep 10
    }
    catch {
	    $temp = $_.Exception
	    $invocationInfo = $_.InvocationInfo.PositionMessage
	    if ($_.InvocationInfo -ne $null) {
            # New-Log -TextID $InvocationInfo -LogArt 3 -LogAction ER
            write-host $temp
        }
    }
}

main

In der Funktion Main wird noch alles richtig befüllt.

Dann, nachdem das Outlook Com-Objekt erstellt wurde, sind alle Variablen leer außer $Subject. Ich finde den Fehler nicht.

Content-Key: 485845

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

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

Mitglied: 140777
Solution 140777 Aug 16, 2019 updated at 08:14:07 (UTC)
Goto Top
Erstens sind da überflüssige Variablendefinitionen in der Main Function (welche aber nicht der Fehler sind, aber sehr schlechter Stil wenn man hier Variablen aus dem übergeordneten Kontext aufgreift, Variablen sollte man überlichweise einer Funktion übergeben) sondern ein typischer Anfänger-Fehler, nämlich die Leerzeichen hinter(nicht vor) den Backticks an dieser Stelle, sollte dir aber die Intellisense auch eigentlich anzeigen.

(Hier sind Leerzeichen hinter den Backticks, die zu dem Fehler führen!)
Send-Mail -Subject $Subject ` 
              -Importance $Importance  `  
              -Body $Body ` 
              -To $To ` 
              -cc $cc `
              -Source $FilePath `
              -BoolAttachments $BoolAttachments `
              -Dateien @($Files) 
https://www.computerperformance.co.uk/powershell/backtick/#Problem_with_ ...

Das führt dazu das alle Variablen außer dem Parameter Subject nicht an die Send-Mail Funktion übermittelt werden . Und in der Send-Mail Funktion führt das natürlich zur Exception weil die Variablen alle fehlen weil du sie nicht überprüfst.
Member: Pat.bat
Pat.bat Aug 16, 2019 updated at 11:42:54 (UTC)
Goto Top
@140777

Danke, habs jetzt mit deiner Hilfe hinbekommen. Das einzige was ich jetzt noch lösen muss, ist die UTF-8 Konvertierung für den HTMLBody

anbei der gesamte Code:

param(
    $bAttachments,
    $Subject,
    $Importance,
    $Body,
    $To,
    $cc,
    $FilePath,
    $Files,
    $PProcedure
)

$Signatur2 = Get-Content -Path "G:\FD_50_Bank\System\Aufgabenplanungen\E-Mail\Signatur.htm"  
$htmlBody = "<HTML><meta charset=UTF-8><BODY><p>$Body</p><\BODY><\HTML>"  
# Funktion des LogWriters
#-------------------------------------------------------------------
function New-Log($TextID, $LogArt, $LogAction, $Value1, $Value2, $Value3, $Value4)
{
    $LogPath = "..\Logs\E-Mail.log"  
    &.\WriteLog.ps1 -LogPath $LogPath -TextID $TextID -LogArt $LogArt -Action $LogAction -Val1 $Value1 -Val2 $Value2 -Val3 $Value3 -Val4 $Value4
}

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

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

                GetFiles -files $files
              }
            }

            $mail.Send()
 
            # Der E-Mail etwas Zeit geben zum verschicken
            Start-Sleep 5

            # Outlook Objekt Schließen
             $o.Quit()
        }
    catch {
	    $temp = $_.Exception
	    $invocationInfo = $_.InvocationInfo.PositionMessage
	    if ($_.InvocationInfo -ne $null) {
            write-host $temp
        }
    }
}

function GetFiles( $files )
{
    $outfileName = $files[$i].Name
    $outfileNameFullname = $files[$i].FullName
    $outfileNameExtension = $files[$i].Extension
 
    # wenn der Name.Endung der ist, den wir wollen, füge die Datei hinzu
    # Dateien: "DatentraegerbegleitzettelEVSollst.rtf", "hhdopA.dat", "hhdopA-neue Schnittstelle.dat" 
    Foreach ( $f in $Dateien) {
        if($outfileName -eq $f)
        {
            $mail.Attachments.Add($outfileNameFullname);
        }
    }
}

Send-Mail   -Importance $Importance `
            -Subject $Subject `
            -Body $htmlBody `
            -To $To `
            -CC $cc `
            -Source $FilePath `
            -BoolAttachments $BoolAttachments `
            -Dateien @($Files)


Ich nutze Visual Studio Code, dort hat er mir nicht angezeigt, das nach dem Backticks was "faul" ist.