zunaras
Goto Top

Bilder innerhalb der PST nach dem Empfang verkleinern

Schönen guten Tag,

meine Frage bezieht sich auf Outlook 2010.
Es gibt ja so Leute, die ihre Bilder in Originalgröße, z.B. vom Handy, per eMail verschicken. Eine Mail hat dann schon mal 10 MB statt 200 KB.

Kennt jemand von euch eine Möglichkeit, durch ein Tool oder durch VBA diese Bilder auf Knopfdruck nachträglich zu verkleinern? Entweder einzeln oder mehrere in einem Rutsch? Das eMail-Datum sollte davon unberührt bleiben.

Viele Grüße
Zunaras

Content-ID: 223063

Url: https://administrator.de/forum/bilder-innerhalb-der-pst-nach-dem-empfang-verkleinern-223063.html

Ausgedruckt am: 21.12.2024 um 08:12 Uhr

SlainteMhath
SlainteMhath 27.11.2013 um 11:10:57 Uhr
Goto Top
Moin,

schau dir mal IrvanView an.

lg,
Slainte
Zunaras
Zunaras 27.11.2013 um 11:40:43 Uhr
Goto Top
Hallo,

vielleicht habe ich es nicht genau genug beschrieben.

Ich meine die Bilder innerhalb der PST. Die, die sich als Anhang in den Nachrichten befinden.

Ich spinne jetzt mal ein wenig rum: die Mail müsste sicherlich exportiert werden, dessen Bilder in einen Ordner verschieben, diese dann auf z.B. auf 1024 dpi reduziert werden, diese wieder in die ausgelagerte Mail zurück verschieben und die ganze Mail dann mit den kleineren Bildern in Outlook an den Ursprungsort importiert werden.

Viele Grüße
Zunaras
colinardo
colinardo 28.11.2013 aktualisiert um 00:21:21 Uhr
Goto Top
Hallo Zunaras,
ich glaube hiermit habe in dir schon vor einiger Zeit eine Steilvorlage geliefert welche mit ein wenig Anpassung deinem Wunsch gerecht wäre...

Grüße Uwe
Zunaras
Zunaras 28.11.2013 um 09:05:07 Uhr
Goto Top
Hallo colinardo,

das wäre ja schön, wenn man das verwenden könnte.
Wichtig wäre, das man auch alte Nachrichten damit bearbeiten kann ohne die Zeitstempel zu verändern.
Leider recht mein Wissen nicht um das entsprechend anzupassen...

Viele Grüße
Zunaras
colinardo
colinardo 28.11.2013 um 09:06:56 Uhr
Goto Top
ohne Moos im Moment nix los ...
colinardo
colinardo 28.11.2013 aktualisiert um 17:31:17 Uhr
Goto Top
Wichtig wäre, das man auch alte Nachrichten damit bearbeiten kann ohne die Zeitstempel zu verändern.
geht nicht

Folgenden Code in dein Projekt einfügen / die globalen Variablen sollten am Anfang des Projektes stehen:
(Hinweis für andere die hier vorbei schauen: der Code funktioniert nur in Zusammenhang mit dieser benutzerdefinierten COM-Bibliothek)
Dim WithEvents m_objMailItem As MailItem
Dim WithEvents m_objExpl As Explorer
Dim m_IsMailFolder As Boolean
 
Private Sub m_objExpl_Close()
    If Application.Explorers.Count > 0 Then
        Set m_objExpl = Application.ActiveExplorer
    Else
        Set m_objExpl = Nothing
        Set m_objMailItem = Nothing
    End If
End Sub
 
Private Sub m_objExpl_FolderSwitch()
    Dim objFolder As MAPIFolder
    Set objFolder = m_objExpl.CurrentFolder
    If objFolder.DefaultItemType = olMailItem Then
        m_IsMailFolder = True
    Else
        m_IsMailFolder = False
    End If
    Set objFolder = Nothing
End Sub
 
Private Sub m_objExpl_SelectionChange()
    If m_IsMailFolder Then
        Dim objItem As Object
        Dim objAction As Outlook.Action
        If m_objExpl.Selection.Count > 0 Then
            Set objItem = m_objExpl.Selection(1)
            If objItem.Class = olMail Then
                Set m_objMailItem = objItem
                If m_objMailItem.Attachments.Count > 0 Then
                    Set objAction = m_objMailItem.Actions("Bilder verkleinern")  
                    If objAction Is Nothing Then
                        Set objAction = m_objMailItem.Actions.Add
                        With objAction
                            .Enabled = True
                            .Name = "Bilder verkleinern"  
                            .ShowOn = olMenu
                        End With
                        m_objMailItem.Save
                    End If
                End If
            End If
        End If
        Set objItem = Nothing
        Set objAction = Nothing
    End If
End Sub

Private Sub m_objMailItem_CustomAction(ByVal Action As Object, ByVal Response As Object, Cancel As Boolean)
    Cancel = True
    Select Case Action.Name
        Case "Bilder verkleinern"  
            resizeMailImages m_objMailItem
    End Select
End Sub

Sub resizeMailImages(Item As MailItem)
    Dim objMail As MailItem, Att As Attachment, arrFiles() As String, tempfolder As String, imgOrigTempFolder As String, imgResizedTempFolder As String, counter As Integer
    Set fso = CreateObject("Scripting.FilesystemObject")  
    Set regex = CreateObject("vbscript.regexp")  
    regex.IgnoreCase = True
    regex.Global = True
    Set objMail = Item
    tempfolder = Environ("Temp")  
    imgOrigTempFolder = tempfolder & "\img_orig"        'temp folder for original attachments  
    imgResizedTempFolder = tempfolder & "\img_res"      'temp folder for resized attachments  
    counter = 0     'counter for arrDel() Array  
    If objMail.Attachments.Count > 0 Then               'if there are attachments ...  
        'valid extensions for image resizing  
        arrValidExt = Array("jpg", "jpeg", "png", "bmp", "gif", "tiff", "tif")  
    
        For Each Att In objMail.Attachments
            strExt = LCase(fso.GetExtensionName(Att.FileName))  'get extension of attachment  
            For i = 0 To UBound(arrValidExt)
                If strExt = arrValidExt(i) Then         'if extension ist valid to be resized  
                    'check if attachment is normal attachment not inline  
                    patternFix = Replace(Att.FileName, ".", "\.", , , vbTextCompare)  
                    patternFix = Replace(patternFix, "[", "\[", , , vbTextCompare)  
                    patternFix = Replace(patternFix, "]", "\]", , , vbTextCompare)  
                    patternFix = Replace(patternFix, "^", "\^", , , vbTextCompare)  
                    patternFix = Replace(patternFix, "$", "\$", , , vbTextCompare)  
                    patternFix = Replace(patternFix, "+", "\+", , , vbTextCompare)  
                    patternFix = Replace(patternFix, "(", "\(", , , vbTextCompare)  
                    patternFix = Replace(patternFix, ")", "\)", , , vbTextCompare)  
                    regex.pattern = "<img [^>]*src=""[^""]*(" & patternFix & ")[^""]*"""  
                    Set myMatches = regex.Execute(objMail.HTMLBody)
                    If myMatches.Count = 0 Then     'attachment ist normal attachment not inline  
                        ReDim Preserve arrFiles(counter)
                        arrFiles(counter) = Att.FileName
                        counter = counter + 1
                        Exit For
                    End If
                End If
            Next
        Next
        
        If counter > 0 Then
            'check if folders exist  
            If Not fso.FolderExists(imgOrigTempFolder) Then
                MkDir (imgOrigTempFolder)
            End If
            If Not fso.FolderExists(imgResizedTempFolder) Then
                MkDir (imgResizedTempFolder)
            Else
                If fso.GetFolder(imgResizedTempFolder).Files.Count > 0 Then
                    fso.GetFolder(imgResizedTempFolder).Delete (True)
                End If
                MkDir (imgResizedTempFolder)
            End If
            
            'Resize Images  
            Set imageResizer = CreateObject("ImageresizerCom.ImageResizerCom")  
            For i = 0 To UBound(arrFiles)
                'assemble Paths to images in filesystem  
                imgOrigPath = imgOrigTempFolder & "\" & fso.GetBaseName(arrFiles(i)) & "_" & tobase36(CLng((Now() - #1/1/1970#) * 86400)) & "." & LCase(fso.GetExtensionName(arrFiles(i)))  
                imgResizedPath = imgResizedTempFolder & "\" & arrFiles(i)  
                'save attachment in message to filesystem  
                objMail.Attachments(arrFiles(i)).SaveAsFile (imgOrigPath)
                'Resize Image with custom function library  
                imageResizer.ResizeImage imgOrigPath, imgResizedPath, 500
            Next
            Set imageResizer = Nothing
             'Delete the original Attachments from message  
            For i = 0 To UBound(arrFiles)
                objMail.Attachments(arrFiles(i)).Delete
            Next
            're-add resized images as attachments  
            For Each file In fso.GetFolder(imgResizedTempFolder).Files
                objMail.Attachments.Add file.Path
            Next
            'delete folder with resized images  
            fso.GetFolder(imgResizedTempFolder).Delete (True)
            'Speichere Mail  
            objMail.Save
        End If
    
    End If
    Set fso = Nothing
    Set regex = Nothing
End Sub
Dann noch im Application_Startup-Event diese Zeile hinzufügen:
Private Sub Application_Startup()
  '...  
  Set m_objExpl = Application.ActiveExplorer
End Sub
Die Seitenlänge (in Pixel) die die Bilder bekommen sollen kannst du im letzten Parameter in Zeile 123 des Scriptes festlegen.

Wichtig: danach Outlook neu starten !

Jetzt kannst du bei Mails die mindestens ein Bild-Attachment besitzen, mit einem Rechtsklick auf die Mail die Aktion aufrufen:

2530cef5905ef2840255cc9dc455aac4

Grüße Uwe
p.s. jetzt wäre mal eine Spende(via Paypal) für den "armen" Coder angebracht !! > ist angekommen ...Bedankt !!
Zunaras
Zunaras 28.11.2013 um 14:17:58 Uhr
Goto Top
Hallo colinardo,

das letzte habe ich nicht verstanden. Was ist der "Application_Startup-Event" ?

Grüße
Zunaras
colinardo
colinardo 28.11.2013 um 14:22:06 Uhr
Goto Top
Zitat von @Zunaras:
das letzte habe ich nicht verstanden. Was ist der "Application_Startup-Event" ?
Dieses Event sollte schon in deinem VBA-Projekt vorhanden sein, wenn du mein erstes Makro zum Bilder verkleinern noch nutzt:
nach der Zeile:
Private Sub Application_Startup()
fügst du zusätzlich noch diese ein:
  Set m_objExpl = Application.ActiveExplorer
Zunaras
Zunaras 28.11.2013 um 15:08:35 Uhr
Goto Top
Natürlich nutze ich das Makro noch! face-smile

Habs gefunden und hinzugefügt.

Läuft prima!

Hier habe ich noch herausgefunden, das man eine andere Bildgröße einstellen kann

imageResizer.ResizeImage imgOrigPath, imgResizedPath, 1024

Und jetzt lässt Du Dir alles patentieren!

Viele Grüße und besten Dank!
Zunaras
Zunaras
Zunaras 07.08.2014 um 09:59:23 Uhr
Goto Top
Hallo colinardo,

evtl. kannst Du mir noch mal helfen.

Wenn ich mit Rechtsklick -> Bilder verkleinern oder beim weiterleiten -> verkleinern möchte,
kommt der Laufzeitfehler 75, Fehler beim Zugriff auf Pfad/Datei.
Bei Zeile 14 im Codeschnipsel bleibt er hängen.


Die letzte Änderung, die ich in Outlook gemacht habe:
GoogleCalendarSync deinstaliert, gSync installiert

Ich habe noch versucht Dein Assembly neu zu installieren. Es kommt aber nur die Abfrage ob es deinstalliert werden soll. Nach OK wird es erfolgreich bestätigt. Das kann ich beliebig oft wiederholen.
Wenn ich die Festplatte durchsuche, finde ich die Datei noch unter:
C:\Windows\System32 und C:\Windows\SysWOW64


.
.
If counter > 0 Then
            'check if folders exist  
            If Not fso.FolderExists(imgOrigTempFolder) Then
                MkDir (imgOrigTempFolder)
            End If
            If Not fso.FolderExists(imgResizedTempFolder) Then
                MkDir (imgResizedTempFolder)
            Else
                If fso.GetFolder(imgResizedTempFolder).Files.Count > 0 Then
                    fso.GetFolder(imgResizedTempFolder).Delete (True)
                End If
                MkDir (imgResizedTempFolder)
            End If
            
            'Resize Images  
            Set imageResizer = CreateObject("ImageresizerCom.ImageResizerCom")  
            For i = 0 To UBound(arrFiles)
                'assemble Paths to images in filesystem  
                imgOrigPath = imgOrigTempFolder & "\" & fso.GetBaseName(arrFiles(i)) & "_" & tobase36(CLng((Now() - #1/1/1970#) * 86400)) & "." & LCase(fso.GetExtensionName(arrFiles(i)))  
                imgResizedPath = imgResizedTempFolder & "\" & arrFiles(i)  
                'save attachment in message to filesystem  
                objMail.Attachments(arrFiles(i)).SaveAsFile (imgOrigPath)
                'Resize Image with custom function library  
                imageResizer.ResizeImage imgOrigPath, imgResizedPath, 1600
            Next
            Set imageResizer = Nothing
             'Delete the original Attachments from message  
            For i = 0 To UBound(arrFiles)
                objMail.Attachments(arrFiles(i)).Delete
            Next
.
.


Viele Grüße
Zunaras
colinardo
colinardo 07.08.2014 aktualisiert um 10:19:38 Uhr
Goto Top
Wenn ich mit Rechtsklick -> Bilder verkleinern oder beim weiterleiten -> verkleinern möchte,
kommt der Laufzeitfehler 75, Fehler beim Zugriff auf Pfad/Datei.
Bei Zeile 14 im Codeschnipsel bleibt er hängen.
abmelden und die temporären Dateien und Ordner in %temp% löschen ...

Grüße Uwe
Zunaras
Zunaras 07.08.2014 um 10:52:39 Uhr
Goto Top
Hallo,

Temp-Ordner ist jetzt leer.

Jetzt kommt Laufzeitfehler -2147221005 (800401f3)
Fehler beim Ausführen der Operation

Jetzt bleibt er bei Zeile 18 stehen.

Grüße
Zunaras
colinardo
colinardo 07.08.2014 um 10:54:54 Uhr
Goto Top
Zitat von @Zunaras:
Jetzt kommt Laufzeitfehler -2147221005 (800401f3)
Fehler beim Ausführen der Operation

Jetzt bleibt er bei Zeile 18 stehen.
das ist mir klar, du hast ja die COM-Library deinstalliert !!!
Zunaras
Zunaras 07.08.2014 um 11:40:14 Uhr
Goto Top
Die ImageResizerAssembly.exe will immer nur deinstallieren.
Ich habe die dll und tlb jetzt manuell gelöscht und die ImageResizerAssembly.exe ausgeführt. Er hat nun installiert und registriert.

Hab den PC dann neu gestartet. Wie oben, blieb er in Zeile 14 hängen.

Dann bin ich noch mal in den Temp-Ordner und hab die wiedervorhandenen img_orig und img_res gelöscht.

Scheint jetzt geholfen zuhaben.

Viele Grüße
Zunaras
colinardo
colinardo 07.08.2014 aktualisiert um 11:49:11 Uhr
Goto Top
Dann bin ich noch mal in den Temp-Ordner und hab die wiedervorhandenen img_orig und img_res gelöscht.
Das Problem ist hier manchmal das Outlook die Bilder im Hintergrund noch im Zugriff hat und sich deshalb der Ordner nicht löschen lässt. Das habe ich hier mit einer Löschroutine beim Start von Outlook gelöst:
Private Sub Application_Startup()
    On Error Resume Next
    Set fso = CreateObject("Scripting.FilesystemObject")  
    tempfolder = Environ("Temp")  
    imgOrigTempFolder = tempfolder & "\img_orig"  
    imgResizedTempFolder = tempfolder & "\img_res"  
    If fso.FolderExists(imgOrigTempFolder) Then
        fso.GetFolder(imgOrigTempFolder).Delete
    End If
    If fso.FolderExists(imgResizedTempFolder) Then
        fso.GetFolder(imgResizedTempFolder).Delete
    End If

    Set m_objExpl = Application.ActiveExplorer
    Set fso = Nothing
End Sub
Zunaras
Zunaras 07.08.2014 um 12:08:15 Uhr
Goto Top
Hab den Code übernommen. Danke vielmals!

Viele Grüße
Zunaras
Zunaras
Zunaras 16.12.2014, aktualisiert am 17.12.2014 um 11:50:13 Uhr
Goto Top
Hallo colinardo,

vielleicht kannst Du Dir das noch mal ansehen?

Laufzeitfehler '430':
Klasse unterstützt keine Automatisierung oder unterstützt erwartete Schnittstelle nicht.

Der Fehler kommt hin und wieder, wenn ich eine oder mehrere Nachrichten mit der Maus in einen anderen Ordner ziehe zum verschieben.
In Zeile 8 bleibt er dann hängen.
Mir kommt es so vor, wenn ich nach dem Markieren etwas warte und dann verschiebe, dann klappt es ohne Probleme.


Private Sub m_objExpl_SelectionChange()
    If m_IsMailFolder Then
        Dim objItem As Object
        Dim objAction As Outlook.Action
        If m_objExpl.Selection.Count > 0 Then
            Set objItem = m_objExpl.Selection(1)
            If objItem.Class = olMail Then
                Set m_objMailItem = objItem
                If m_objMailItem.Attachments.Count > 0 Then
                    Set objAction = m_objMailItem.Actions("Bilder verkleinern")  
                    If objAction Is Nothing Then
                        Set objAction = m_objMailItem.Actions.Add
                        With objAction
                            .Enabled = True
                            .Name = "Bilder verkleinern"  
                            .ShowOn = olMenu
                        End With
                        m_objMailItem.Save
                    End If
                End If
            End If
        End If
        Set objItem = Nothing
        Set objAction = Nothing
    End If
End Sub

Viele Grüße