spsman
Goto Top

Outlook: Empfangsdatum auslesen und in Dateinamen schreiben

Hallo,

Wenn ich eine Email aus Outlook eine mail per drag'n'drop in einen Ordner Verschiebe wird eine Betreff.msg Datei erzeugt. Jetzt ist die frage ob ich das Empfangs-(bzw. Sende-Datum) auslesen kann und dann in den Dateinamen einfügen kann?

Also Quelle:
Betreff.msg
Ziel:
210427_Betreff.msg

VBS/Batch oder externes Tool ist mir egal ;)

Danke im Voraus.

Content-ID: 666153

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

Ausgedruckt am: 24.11.2024 um 03:11 Uhr

148121
148121 27.04.2021 aktualisiert um 15:59:05 Uhr
Goto Top
Unser Forum liefert dir z.B. passendes Futter:
Outlook Mail in Explorer speichern mit Zeitstempel der Mail

Gruß w.
colinardo
Lösung colinardo 27.04.2021, aktualisiert am 29.04.2021 um 10:22:46 Uhr
Goto Top
Oder alternativ zu meinem von @148121 geposteten AutoIt Skript, wenn man's schnell mit VBA in Outlook abfackeln möchte:

Gewünschte Mails in Outlook markieren, dann das Makro abfeuern, Ausgabe-Ordner im sich öffnenden Dialog wählen, fertig.
Sub SaveSelectedMailsWithDate()
    Dim mail As MailItem, strNewSubject As String, strNewFilePath As String, objFolder As Object, OUTPUTPATH As String
    ' max Anzahl an zu übernehmenden Zeichen des Subjects  
    Const MAXSUBJECTCHARS = 30
    ' Filesystem Object erstellen  
    Set fso = CreateObject("Scripting.FileSystemObject")  
    Set objShell = CreateObject("Shell.Application")  
    ' Ausgabeordner mit FolderBrowserDialog abfragen  
    Set objFolder = objShell.BrowseForFolder(0, "Ausgabe-Ordner angeben", &H10)  
    ' prüfe auf gültigen Pfad  
    If fso.FolderExists(objFolder.Self.path) Then
       OUTPUTPATH = objFolder.Self.path
    Else
        MsgBox "Ungültiger Pfad!", vbExclamation  
        Exit Sub
    End If
    
    With ActiveExplorer
        ' wenn eine Auswahl besteht ...  
        If .Selection.Count > 0 Then
            ' verarbeite alle markierten Mails  
            For Each obj In .Selection
                If obj.Class = olMail Then
                    Set mail = obj
                    ' ersetze illegale Zeichen durch underscores  
                    strNewSubject = Trim(ReplaceIllegalChars(mail.SUBJECT))
                    ' wenn das Subject durch die Änderung leer istm benutze als Namen der Datei die eindeutige Outlook-EntryID  
                    If strNewSubject = "" Then  
                        strNewSubject = mail.EntryID
                    End If
                    ' kürze den Betreff wenn die definierte maximale Zeichenanzahl erreicht ist  
                    If Len(strNewSubject) > MAXSUBJECTCHARS Then
                        strNewSubject = Left(strNewSubject, MAXSUBJECTCHARS) & "..."  
                    End If
                    ' baue den neuen Pfad zusammen  
                    strNewFilePath = fso.BuildPath(OUTPUTPATH, Format(mail.ReceivedTime, "yymmdd") & "_" & strNewSubject & ".msg")  
                    ' sollte der Name bereits im Ausgabeordner existieren, hänge die Datum-Ticks als Randomizer an den Dateinamen an  
                    While fso.FileExists(strNewFilePath)
                        ticks = DateDiff("s", #1/1/1970#, Now())  
                        strNewFilePath = fso.BuildPath(OUTPUTPATH, Format(mail.ReceivedTime, "yymmdd") & "_" & strNewSubject & "_" & ticks & ".msg")  
                    Wend
                    ' speichere Mail als MSG(Unicode-Format)  
                    mail.SaveAs strNewFilePath, olMSGUnicode
                End If
            Next
        Else
            ' Keine Mail für den Export markiert  
            MsgBox "Bitte mindestens eine E-Mail für den Export markieren!", vbExclamation  
        End If
    End With
    MsgBox "Export abgeschlossen.", vbInformation  
End Sub

' Illegale Pfadzeichen ersetzen  
Function ReplaceIllegalChars(strText)
    Set regex = CreateObject("vbscript.regexp")  
    regex.Pattern = "[\\/:?<>|""*]"  
    regex.Global = True
    ReplaceIllegalChars = regex.Replace(strText, "_")  
    Set regex = Nothing
End Function
Grüße Uwe
SPSman
SPSman 29.04.2021 um 10:05:04 Uhr
Goto Top
Hallo,

das Ergebnis ist schonmal super. Ich habe auf dem Desktop Ordner-Verknüpfungen die ich in dem Auswahl Dialog nicht nutzen kann. Gibt es eine Möglichkeit die zu nutzen? Alternativ würde ich auch den Ordnerpfad in ein Pop-Up Feld reinkopieren.

Jetzt suche ich noch eine Option einen Button direkt in Outlook zu implementieren.
Gruß und vielen dank.
colinardo
Lösung colinardo 29.04.2021 aktualisiert um 10:34:36 Uhr
Goto Top
Zitat von @SPSman:

Hallo,

das Ergebnis ist schonmal super. Ich habe auf dem Desktop Ordner-Verknüpfungen die ich in dem Auswahl Dialog nicht nutzen kann. Gibt es eine Möglichkeit die zu nutzen? Alternativ würde ich auch den Ordnerpfad in ein Pop-Up Feld reinkopieren.
Du kannst den BrowseForFolder Dialog einfach noch ein Eingabefeld hinzufügen in dem man Pfade manuell einfügen kann. Dazu Zeile 9 so umschreiben (Habs oben ergänzt).
Set objFolder = objShell.BrowseForFolder(0, "Ausgabe-Ordner angeben", &H10)  
Ansonsten die Verknüpfungen durch "Junctions" (mit mklink erstellen) ersetzen dann kannst du diese auch direkt auswählen face-wink.

Jetzt suche ich noch eine Option einen Button direkt in Outlook zu implementieren.
Gruß und vielen dank.
Du kannst das Makro z.B. in einem Modul speichern und dann im Ribbon direkt einem eigenen Button zuweisen (vorher eine eigene Gruppe auf dem gewünschten Tab hinzufügen).

screenshot
SPSman
SPSman 07.05.2021 aktualisiert um 20:36:43 Uhr
Goto Top
Hey danke.. hat alles super funktioniert und jetzt habe ich noch ein PS Script für euch das die Junctions ganz einfach erstellt ;):

Function Get-Folder($initialDirectory="")  

{
    [System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms")|Out-Null  

    $foldername = New-Object System.Windows.Forms.FolderBrowserDialog
    $foldername.Description = "Ordner auswaehlen:"  
    $foldername.rootfolder = "MyComputer"  
    $foldername.SelectedPath = $initialDirectory

    if($foldername.ShowDialog() -eq "OK")  
    {
        $folder += $foldername.SelectedPath
    }
    return $folder
}

Function Get-LinkName($LinkPATH,$linkName="Verknüfung")  
{
Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing

$form = New-Object System.Windows.Forms.Form
$form.Text = 'Eingabe:'  
$form.Size = New-Object System.Drawing.Size(600,200)
$form.StartPosition = 'CenterScreen'  

$okButton = New-Object System.Windows.Forms.Button
$okButton.Location = New-Object System.Drawing.Point(75,120)
$okButton.Size = New-Object System.Drawing.Size(75,23)
$okButton.Text = 'OK'  
$okButton.DialogResult = [System.Windows.Forms.DialogResult]::OK
$form.AcceptButton = $okButton
$form.Controls.Add($okButton)

$cancelButton = New-Object System.Windows.Forms.Button
$cancelButton.Location = New-Object System.Drawing.Point(160,120)
$cancelButton.Size = New-Object System.Drawing.Size(75,23)
$cancelButton.Text = 'Cancel'  
$cancelButton.DialogResult = [System.Windows.Forms.DialogResult]::Cancel
$form.CancelButton = $cancelButton
$form.Controls.Add($cancelButton)

$label = New-Object System.Windows.Forms.Label
$label.Location = New-Object System.Drawing.Point(10,20)
$label.Size = New-Object System.Drawing.Size(580,50)
$label.Text = "Verknüpfungsname  für $LinkPATH eingeben:"  
$form.Controls.Add($label)

$textBox = New-Object System.Windows.Forms.TextBox
$textBox.Location = New-Object System.Drawing.Point(10,71)
$textBox.Size = New-Object System.Drawing.Size(260,20)
$form.Controls.Add($textBox)

$form.Topmost = $true

$form.Add_Shown({$textBox.Select()})

$result = $form.ShowDialog()

    if ($result -eq [System.Windows.Forms.DialogResult]::OK)
        {
        $linkName = $textBox.Text
        
        }
    return $linkName
}
function Get-ScriptDirectory {
    $Invocation = (Get-Variable MyInvocation -Scope 1).Value
    Split-Path $Invocation.MyCommand.Path
}


#Adminrechte anfordern
if (!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")) { Start-Process powershell.exe "-NoProfile -ExecutionPolicy Bypass -File `"$PSCommandPath`"" -Verb RunAs; exit }  

#Netzlaufwerk anzeigen:
$valueExists = (Get-Item HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System -EA Ignore).Property -contains 'EnableLinkedConnections'  
if ($valueExists) {}else
{
New-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System -Name EnableLinkedConnections -PropertyType DWord -Value 1
} 




$LinkFolderPath = Get-Folder ("C:\")  
if ($LinkFolderPath)
{
$ScripPath = Get-ScriptDirectory 
$UserLinkName = Get-LinkName($LinkFolderPath)
$LinkNamePath = "$ScripPath\$UserLinkName"  
#Write-Output $LinkFolderPath

#Write-Output $LinkNamePath

#New-Item -ItemType Junction -Path $LinkNamePath -Target $LinkFolderPath 
New-Item -Path $LinkNamePath -ItemType SymbolicLink -Value $LinkFolderPath

}


VG ROB
SPSman
SPSman 07.05.2021 um 14:12:47 Uhr
Goto Top
Hi,
während bei mir alle Laufwerke inkl. Netzlaufwerke angezeigt werden, sehe ich das auf einem anderen PC keine Netzlaufwerke:

$foldername = New-Object System.Windows.Forms.FolderBrowserDialog

Hat jemand eine Idee warum?
colinardo
Lösung colinardo 07.05.2021 aktualisiert um 15:29:15 Uhr
Goto Top
Zitat von @SPSman:

Hi,
während bei mir alle Laufwerke inkl. Netzlaufwerke angezeigt werden, sehe ich das auf einem anderen PC keine Netzlaufwerke:

> $foldername = New-Object System.Windows.Forms.FolderBrowserDialog

Hat jemand eine Idee warum?
Wird der Dialog elevated ausgeführt bzw. Ist die UAC ausgeschaltet? Dann wäre klar warum. Netzlaufwerke werden Userabhängig gemappt, und erscheinen in elevated Sessions nur wenn ein Registry Key (EnableLinkedConnections) gesetzt ist.
Ebenso wenn die Netzlaufwerke unter einem anderen User-Account gemappt als dem Prozess welcher den Dialog ausführt.

https://stackoverflow.com/questions/18251983/folderbrowserdialog-doesnt- ...
SPSman
SPSman 07.05.2021 um 20:37:28 Uhr
Goto Top
Cool das Wars! habe das Script um einen Reg Eintrag erweitert.