none
Powershell, Outlook COM-Objekt, Mail aus Template generieren -> Save As bringt Berechtigungs-Fehlermeldung RRS feed

  • Frage

  • Hallo,

    vermutlich habe ich einen Bug gefunden. Aber ich bin mir nicht sicher, ob es an PowerShell oder dem COM-Objekt liegt.

    Folgender Hintergrund:

    Ich muss jeden Monat eine circa 30 fast identische Mails versenden. Es ändern sich pro Monat nur eine Deadline (1x im Mailtext) und die Angabe des aktuellen Monats (1x im Betreff, und 1x im Mailtext). Auch ein jeweils verschiedener Empfänger, CC und Anhang.
    Um mir die Arbeit und das ständige Copy+Paste zu ersparen, erstelle ich die Mails per Powershell-Script. Das minimiert auch menschliche Fehler.

    Ich möchte die Mails aber im Script NICHT versenden, sondern nur erstellen. Erst nach einer Prüfung sende ich die Mails dann manuell.

    Dafür habe ich ein Mail-Template als OFT Datei generiert und die entsprechenden Platzhalter darin gesetzt.

    Leider habe ich nur über Citrix Zugriff auf meine Dokumente, sprich ich bin gezwungen, mit Netzwerkpfaden zu arbeiten. Bislang war das nie ein Problem.

    So bearbeite ich die benötigten Daten vor:

    #Outlook-Objekt erstellen
    $outlook = New-Object -com outlook.application
    
    #Empfänger einlesen (liegen immer im Format Empfängername_dd.mm.YYYY-HH:ii:ss.xlsx vor)
    $recipients = gci *.xlsx | foreach { $_.Name.Substring(0,$_.Name.IndexOf("_")) }
    
    #E-Mail-Adressen der Empfänger einlesen
    $mail_adresses = import-csv .\mail.csv -Encoding UTF-8 -Delimiter ";"
    
    #Benötigte Daten abfragen
    $month = read-host ("Monat")
    $deadline = read-host ("Deadline")


    Jeder Empfänger wird nun durchgespielt:

    foreach($rec in $recipients){
     #Neue Mail auf Basis des Templates generieren
     $mail = gci -filter "tpl.oft" | foreach { $outlook.CreateItemFromTemplate($_.FullName) }
    
     #Platzhalter ersetzen
     $mail.HTMLBody = $mail.HTMLBody.Replace("___MONTH___", $month)
     $mail.HTMLBody = $mail.HTMLBody.Replace("___DEADLINE___", $deadline)
     $mail.Subject = $mail.Subject.Replace("___MONTH___", $month)
      $mail.Subject = $mail.Subject.Replace("___EMPF___", $rec)
    
     #Mailadresse(n) einsetzen
     $mailaddrTo = ($recipients | where Rolle -eq $rec).EMail
     $mailaddrCC = ($recipients | where Rolle -eq $rec).CC
     $mail.To = $mail.To.Replace("___TO___",$mailaddrTo)
     $mail.CC = $mail.CC.Replace("___CC___",$mailaddrCC)
    
     #"Im Auftrag von" setzen
     $mail.SentOnBehalfOfName "irgendwas@irgendwo.net"
    
     #Anhang hinzufügen
     gci $rec"*.xlsx" | foreach { $mail.Attachments.Add($_.FullName) }
    
     [...]
    }

    Und bis hierhin habe ich auch keine Probleme.

    Das Problem ist nun, wenn ich die Mail speichern möchte (innerhalb der foreach)...

    $mail.SaveAs($rec+".msg")

    die Meldung kommt:

    Ausnahme beim Aufrufen von SaveAs mit 1 Argument(en): "Sie besitzen nicht die erforderlichen Berechtigungen, um den Vorgang auszuführen."


    Auch wenn ich den SaveAs Befehl manuell ausführe, bekomme ich den Fehler.

    Erst wenn ich eine beliebige Datei manuell per Powershell erstelle (z.B. "123" > 1.txt), und dann den SaveAs Befehl ausführe, macht er was er soll.

    Vielleicht könnt ihr mir auf die Sprünge helfen, aktuell glaube ich an einen Bug. Berechtigungen fehlen mir jedenfalls nicht, da es sich um meine eigenen Dokumente (auf einem Server-Share) handelt. Alle Dateien liegen im selben Verzeichnis.

    Freundliche Grüße, xola123

    Montag, 20. März 2017 11:18

Antworten

  • Hm, dann könnte auch einfach ein ungünstiges Zusammenspiel von der Art wie Mailitem.saveas() die Datei versucht zu erstellen (zu knapper Timeout z.b.) und dem Zugriff über Citrix sein. Ich befürchte dann ist dein Workaround wohl der Weg.
     
    Unabhängig davon, ist das hier ein seltsames Konstrukt:

     $mail = gci -filter "tpl.oft" | foreach { $outlook.CreateItemFromTemplate($_.FullName) }

    So kann das wegen dem Filter nur auf eine Datei zutreffen. Was natürlich auch wichtig ist, denn bei anderem Filter (und mehreren Treffern) entstünde ein Array und der komplette folgende Code schlägt fehl.
    Also kannst du es auch gleich so schreiben:

    $mail = $outlook.CreateItemFromTemplate("$TemplDir\tpl.oft") 
     
    Grüße, Denniver


    Blog: http://bytecookie.wordpress.com

    Kostenloser Powershell Code Manager v5: Link
    (u.a. Codesnippets verwalten + komplexe Scripte graphisch darstellen)

    Hilf mit und markiere hilfreiche Beiträge mit dem "Abstimmen"-Button (links) und Beiträge die eine Frage von dir beantwortet haben, als "Antwort" (unten).
    Warum das Ganze? Hier gibts die Antwort.

    Montag, 20. März 2017 16:09
    Moderator

Alle Antworten

  • In der Regel deutet der Fehler auf fehlende Rechte hin. :)

    Was passiert, wenn du innerhalb des gleichen Scripts(!) auf anderem Weg eine Datei am selben Ort erstellst? Z.b. mit New-item oder Set-Content? Gleicher Fehler?
     


    Blog: http://bytecookie.wordpress.com

    Kostenloser Powershell Code Manager v5: Link
    (u.a. Codesnippets verwalten + komplexe Scripte graphisch darstellen)

    Hilf mit und markiere hilfreiche Beiträge mit dem "Abstimmen"-Button (links) und Beiträge die eine Frage von dir beantwortet haben, als "Antwort" (unten).
    Warum das Ganze? Hier gibts die Antwort.

    Montag, 20. März 2017 14:47
    Moderator
  • Hallo, danke für die Antwort.

    auf diese Weise erhalte ich keinen Fehler.
    Mein Script kann danach wie gewünscht die Dateien erstellen.

    Das ist bis jetzt auch mein Workaround. Leere Datei erstellen und wieder löschen, dann die Mail-Dateien erstellen.

    Das Problem besteht nur beim Aufrufen, wenn davor noch nicht mit dem Verzeichnis gearbeitet wurde.

    Montag, 20. März 2017 15:21
  • Hm, dann könnte auch einfach ein ungünstiges Zusammenspiel von der Art wie Mailitem.saveas() die Datei versucht zu erstellen (zu knapper Timeout z.b.) und dem Zugriff über Citrix sein. Ich befürchte dann ist dein Workaround wohl der Weg.
     
    Unabhängig davon, ist das hier ein seltsames Konstrukt:

     $mail = gci -filter "tpl.oft" | foreach { $outlook.CreateItemFromTemplate($_.FullName) }

    So kann das wegen dem Filter nur auf eine Datei zutreffen. Was natürlich auch wichtig ist, denn bei anderem Filter (und mehreren Treffern) entstünde ein Array und der komplette folgende Code schlägt fehl.
    Also kannst du es auch gleich so schreiben:

    $mail = $outlook.CreateItemFromTemplate("$TemplDir\tpl.oft") 
     
    Grüße, Denniver


    Blog: http://bytecookie.wordpress.com

    Kostenloser Powershell Code Manager v5: Link
    (u.a. Codesnippets verwalten + komplexe Scripte graphisch darstellen)

    Hilf mit und markiere hilfreiche Beiträge mit dem "Abstimmen"-Button (links) und Beiträge die eine Frage von dir beantwortet haben, als "Antwort" (unten).
    Warum das Ganze? Hier gibts die Antwort.

    Montag, 20. März 2017 16:09
    Moderator