thomas1972
Goto Top

Alle Mails aus verzeichnis versenden, diese aber zu je 10 Mails senden und verschieben

Hallo,

ich würde gerne per PowerShell Mails versenden.
Dieses funktioniert soweit ganz gut mit einer Datei.

Ich habe in dem Verzeichnis aber x Dateien, diese können aber nicht in einer email ,
und sollen in Blöcke zu maximal 10 Stück versendet werden.

Leider weiß ich nicht, wie ich dieses machen soll.

Einen Teil des Auszuges aus dem Script $param ist die Datei / Verzeichnis aus welche zurückgegriffen wird.
Wie muss ich es erweitern, so dass im Vorfeld das Verzeichnis auf Anzahl geprüft wird, dann maximal 10 Mails an Anhang zusammen gefasst werden,
bei mehr als 10 eine weitere mail mit x , bis wieder 10 erreicht sind.

Diese sollen dann verschoben werden.

# Teilbereich Email versenden
$param =$param.replace("-sOutputFile=","")  
$ol = New-Object -comObject Outlook.Application  
$mail = $ol.CreateItem(0)
$mail.Recipients.Add("xx@xx.de")  

$mail.Subject "nötige Unterlagen " + $tifBaseName  
$mail.Body = "Anbei zur weiteren Verwendung."  
$mail.Attachments.Add($param)
$Mail.display() 
#$Mail.send()
# email versenden ende

#$msg = "Wurde die Mail mit Anhang " +$dateiname_für_msgbo +" erstellt?" 
[System.Windows.Forms.MessageBox]::Show($msg,"Prüfung",0)  
    
#Datei verschieben     
#Get-ChildItem $inputDir $pdf | Rename-Item -NewName {$_.Name -replace 'g','versendet_'} 
Move-Item -Path $param -Destination $move_mail_item
Kommentar vom Moderator tomolpi am 11.07.2020 um 22:51:04 Uhr
Formatierung des Quellcodes bearbeitet und Rechtschreibung/Grammatik der Frage leicht bearbeitet

Content-Key: 587026

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

Ausgedruckt am: 19.03.2024 um 07:03 Uhr

Mitglied: em-pie
em-pie 11.07.2020 um 23:52:05 Uhr
Goto Top
Moin,

Bin kein Powershell-Experte, daher such kein Code, aber eher ein logischer Ansatz:

Du schreibst, du hast Dateien in einem Verzeichnis. Dann baue eine Schleife drumherum:
  • Lies das Verzeichnis aus und schreibe die Files in ein Array.
  • Für jedes Element wird die Mail versendet und verschiebst die erfolgreich versendete Mail.
  • Nach 10 Elementen baust du eine Pause ein.

Wenn alle Files verarbeitet wurden, liest du das Verzeichnis erneut ein. Ist es leer, bist du durch. Andernfalls geht es von vorn los


Gruß
em-pie
Mitglied: thomas1972
thomas1972 12.07.2020 aktualisiert um 12:19:36 Uhr
Goto Top
So etwas habe ich bereits mal in VBA geschrieben..
nur muss ich passen, dieses in PowerShell umzusetzen.
mein Alter Code zum versenden sah damals in VBA so aus

' maximale Anzahl an Anlagen pro Mail  
    Const MAXATTACH = 10
    ' Ordner mit den Attachments  
    Const ATTACHMENTFOLDER = "C:\temp\blaAnträge"  
    ' Archivordner  
    Const ARCHIVEFOLDER = "c:\temp\versendet_bla_Anträge"  
    ' Suchwort für Dateien  
    Const SEARCHTERM = "bla-Antrag"  
    '--------------------------  
    ' counter für Attachments  
    Dim cnt As Integer: cnt = 0
    Dim colAttachments As Collection
    
    ' Filesystemobject  
    Set fso = CreateObject("Scripting.FileSystemObject")  
    'Neue Mail nach Vorgabe erstellen  
    Set mail = CreateMailTemplate
    ' Attachments suchen ...  
    Set colAttachments = SearchFilesInFolder(ATTACHMENTFOLDER, SEARCHTERM)
    'Wenn Attachments da ...  
    
    
    If colAttachments.Count > 0 Then
        ' Für jedes Attachment  
        For Each File In colAttachments
            ' Wenn max. Attachment-Anzahl erreicht zeige mail und erstelle eine neue  
            If cnt > 0 And (cnt Mod MAXATTACH) = 0 Then
                mail.Display
                Set mail = CreateMailTemplate
            End If
            'Attachment hinzufügen  
            mail.Attachments.Add File
            'counter erhöhen  
            cnt = cnt + 1
        Next
        ' Mail Anzeigen  
        mail.Display
        
        ' Dateien in Archivordner verschieben  
        For Each File In colAttachments
            'Prüfen ob Dateiname der Vorgabe entspricht  xxxxxxxx_xxxxxxx_bla-Antrag_xxxxxxx  
             Dim Txt(1) As String
             Dim i As Long
             Dim Match As Boolean
             Set Re = CreateObject("VBScript.RegExp")  
             Re.MultiLine = True
             Re.pattern = "\d{8}_\d{7}_bla-Antrag_"  


                Txt(1) = Right(File, (Len(File) - (Len(ATTACHMENTFOLDER) + 1)))


                For i = 1 To 1
                Match = Re.test(Txt(i))
                     If Match Then
                     fso.MoveFile File, ARCHIVEFOLDER & "\"  
                 Else
                     Debug.Print (File), " ---> Fehler, nicht verschoben"  
                     End If
                Next
                     
        
            
        Next
            myDebug (File) & " ---> bitte das temp. Verzeichnis auf weitere nicht versendete Dateien prüfen und bei bedarf umbenennen."  

    Else
        ' Keine Attachments gefunden  
        MsgBox "Keine Attachments für Suchwort gefunden!", vbExclamation  
    End If
    'Cleanup  
    Set fso = Nothing
End Sub
Mitglied: erikro
erikro 12.07.2020 um 21:47:03 Uhr
Goto Top
Moin,

Zitat von @thomas1972:
Einen Teil des Auszuges aus dem Script $param ist die Datei / Verzeichnis aus welche zurückgegriffen wird.

Das ist wohl eher die Datei, die angehängt wird. face-wink

Um das drumherum, was Du hast. $dir wäre dann das Verzeichnis, in dem die Dateien liegen:

$counter = 0
$params = get-childitem $dir -file # wenn rekursiv gesucht werden soll -recurse
foreach($param in $params) {

     #hier das, was Du hast und funktioniert

     $counter++
     if($counter -eq 10) {

                start-sleep -s 60
                $counter = 0

     }

}

Das schickt das Skript eine Minute nach jeder zehnten Mail schlafen. Wenn es länger oder kürzer sein soll, dann einfach die 60 in den gewünschten Wert ändern.

hth

Erik
Mitglied: TK1987
Lösung TK1987 13.07.2020 aktualisiert um 13:44:54 Uhr
Goto Top
Moin,

# Ordner mit Anhängen
$Dir='C:\Test'  

# Anhänge in jeweils 10 Dateien unterteilen
$Files  = ls -File $Dir
For ($i=0;$i -lt $Files.Count;$i+=10) { $Each10 += ,($Files|select -skip $i -first 10) }

# Outlook öffnen
$OL=New-Object -ComObject Outlook.Application

# Mails mit jeweils 10 Dateien erstellen
$Each10 | % {$C=1} {
  $Mail=$OL.CreateItem(0)
  [void]$Mail.Recipients.Add("xx@xx.de")  
  $Mail.Subject="nötige Unterlagen $tifBaseName - Mail $C/$($Each10.Count)"  
  $Mail.Body = "Anbei zur weiteren Verwendung."  
  $_ | % {[void]$Mail.Attachments.Add($_.FullName)}
  $Mail.Display()
  # $Mail.send()
  
  $C++
  }

Gruß Thomas
Mitglied: thomas1972
thomas1972 14.07.2020 um 06:52:59 Uhr
Goto Top
Guten Morgen Thomas,

vielen dank für deine Hilfe. Ich habe es etwas umständlich selbst angepasst(wobei ich eher dein Script übernehmen werde, da deutlich kürzer.)

Bin in PowerShell selbst nicht so bewandt, daher ist der Anfang leider sehr schwer.

Nochmal vielen Dank.