Outlook 2010 VBA für JPG Bilder komprimieren und Senden
Schönen guten Tag,
im Outlook 2010 kann man in der Nachricht über Datei -> Informationen -> Größe von Bildern beim senden anpassen.
Da das Umschalten bei den Mitarbeitern immer vergessen wird, wollte ich mal nachfragen, ob man das über VBA realisieren kann.
Also bei Klick auf Senden nach JPG im Anhang suchen und diese automatisch verkleinern und Nachricht absenden.
Wir arbeiten nicht mit Exchange.
Viele Grüße
Zunaras
im Outlook 2010 kann man in der Nachricht über Datei -> Informationen -> Größe von Bildern beim senden anpassen.
Da das Umschalten bei den Mitarbeitern immer vergessen wird, wollte ich mal nachfragen, ob man das über VBA realisieren kann.
Also bei Klick auf Senden nach JPG im Anhang suchen und diese automatisch verkleinern und Nachricht absenden.
Wir arbeiten nicht mit Exchange.
Viele Grüße
Zunaras
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 217226
Url: https://administrator.de/forum/outlook-2010-vba-fuer-jpg-bilder-komprimieren-und-senden-217226.html
Ausgedruckt am: 21.12.2024 um 07:12 Uhr
15 Kommentare
Neuester Kommentar
Hallo Zunaras,
du könntest die User daran gewöhnen diese Methode anzuwenden um Bilder zu verschicken. Im Explorer > Bilder markieren > Rechtsklick auf die Bilder > Senden an > E-Mail-Empfänger. Dann müssen sie die Bildgröße im Dialog angeben bevor die Mail angezeigt wird.
Die Option die du meinst lässt sich nicht via VBA steuern, man müsste dazu dann schon z.B. eine native .NET-Bibliothek benutzen die die Bilder verkleinert und wieder an die Mail anhängt. Dazu musst du aber entweder ein Plugin schreiben oder eine COM-Bibliothek mit der entsprechenden Funktionen registrieren, oder die Windows API-Funktionen nutzen.
Werde bei Zeiten mal schauen ob sich da was dazu basteln lässt...
Grüße Uwe
du könntest die User daran gewöhnen diese Methode anzuwenden um Bilder zu verschicken. Im Explorer > Bilder markieren > Rechtsklick auf die Bilder > Senden an > E-Mail-Empfänger. Dann müssen sie die Bildgröße im Dialog angeben bevor die Mail angezeigt wird.
Die Option die du meinst lässt sich nicht via VBA steuern, man müsste dazu dann schon z.B. eine native .NET-Bibliothek benutzen die die Bilder verkleinert und wieder an die Mail anhängt. Dazu musst du aber entweder ein Plugin schreiben oder eine COM-Bibliothek mit der entsprechenden Funktionen registrieren, oder die Windows API-Funktionen nutzen.
Werde bei Zeiten mal schauen ob sich da was dazu basteln lässt...
Grüße Uwe
So, habe zum Thema mal was zusammengebaut...(funktioniert auch mit Outlook 2013)
Unten stehender Code funktioniert nur im Zusammenhang mit meinem folgendem Assembly (.NET 2.0) das ein COM-Objekt mit einer Funktion zum Ändern der Bildgröße bereitstellt.
Download des Assemblies (selbstextrahierendes RAR-Archiv mit Installationsfunktion)
Eine Abfrage für den Benutzer ob er die Bilder verkleinert senden will habe ich noch nicht eingebaut, werde es aber bei Zeiten nachholen
Grüße Uwe
Unten stehender Code funktioniert nur im Zusammenhang mit meinem folgendem Assembly (.NET 2.0) das ein COM-Objekt mit einer Funktion zum Ändern der Bildgröße bereitstellt.
Download des Assemblies (selbstextrahierendes RAR-Archiv mit Installationsfunktion)
- Zuerst installiert man das Assembly als Admin - es ist ein selbsextrahierendes RAR-Archiv das nach dem entpacken fragt ob man es installieren will. (Wer mir nicht vertraut kann das Archiv mit WinRAR entpacken und findet dort den Quellcode des AutoIT-Installers - ich habe halt versucht es so einfach wie möglich für euch zu gestallten)
- Der Code muss in Oulook im VBA-Editor (ALT-F11) in ThisOutlookSession eingefügt werden.
- Die max. Bildgröße die die reduzierten Bilder haben sollen legt man in Zeile 4 fest. Im Beispiel werden die Bilder auf 800 Pixel verkleinert, je nachdem welche Bildseite länger ist.
"jpg", "jpeg", "png", "bmp", "gif", "tiff", "tif"
werden vor dem Sendevorgang in einen temporären Ordner gesichert, dann mit der benutzerdefinierten COM-Funktion verkleinert, danach die ursprünglichen Attachments entfernt (natürlich nur die Bilder andere Attachments bleiben erhalten) und die verkleinerten Bilder wieder hinzugefügt. Da beim Speichervorgang der Original-Attachments Outlook Dateireferenzen auf diese Dateien im Speicher hält, kann dieser Ordner erst beim nächsten Start von Outlook gelöscht werden. Um Duplikate in diesem Ordner zu vermeiden, werden die Dateinamen mit einem Base36 kodierten String im Dateinamen ergänzt abgespeichert.Private Sub Application_ItemSend(ByVal Item As Object, Cancel As Boolean)
If Item.Class = olMail Then
'Fit image in a rect of (n) pixels
IMG_FIT_PIXELS = 800
Dim objMail As MailItem, Att As Attachment, arrDel() 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
'check if folders exist
If Not fso.FolderExists(imgOrigTempFolder) Then
MkDir (imgOrigTempFolder)
End If
If Not fso.FolderExists(imgResizedTempFolder) Then
MkDir (imgResizedTempFolder)
End If
'assemble Paths to images in filesystem
imgOrigPath = imgOrigTempFolder & "\" & fso.GetBaseName(Att.FileName) & "_" & tobase36(CLng((Now() - #1/1/1970#) * 86400)) & "." & strExt
imgResizedPath = imgResizedTempFolder & "\" & Att.FileName
'save attachment in message to filesystem
Att.SaveAsFile (imgOrigPath)
'Resize Image with custom function library
Set imageResizer = CreateObject("ImageresizerCom.ImageResizerCom")
imageResizer.ResizeImage imgOrigPath, imgResizedPath, IMG_FIT_PIXELS
Set imageResizer = Nothing
'-------------
'add image name to array to delete it later
ReDim Preserve arrDel(counter)
arrDel(counter) = Att.FileName
counter = counter + 1
Exit For
End If
End If
Next
Next
If counter > 0 Then
'Delete the original Attachments from message
For i = 0 To UBound(arrDel)
objMail.Attachments(arrDel(i)).Delete
Next
'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)
End If
End If
Set fso = Nothing
Set regex = Nothing
End If
End Sub
Function tobase36(ByVal number As Long) As String
Dim cList
cList = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
Dim finalString As String
While Not number = 0
If CInt(number Mod 36) = 0 Then
finalString = finalString & Mid(cList, CInt(number Mod 36) + 1, 1)
Else
finalString = finalString & Mid(cList, CInt(number Mod 36), 1)
End If
number = number / 36
Wend
tobase36 = finalString
End Function
Private Sub Application_Startup()
On Error Resume Next
Set fso = CreateObject("Scripting.FilesystemObject")
tempfolder = Environ("Temp")
imgOrigTempFolder = tempfolder & "\img_orig"
If fso.FolderExists(imgOrigTempFolder) Then
fso.GetFolder(imgOrigTempFolder).Delete
End If
Set fso = Nothing
End Sub
Eine Abfrage für den Benutzer ob er die Bilder verkleinert senden will habe ich noch nicht eingebaut, werde es aber bei Zeiten nachholen
Grüße Uwe
Zitat von @Zunaras:
Hallo colinardo,
Beim probieren ist mir aufgefallen, das die verkleinerten JPG nicht im Temp\img_res Ordner landen, sondern im Temp. Und werden
wohl dementsprechend nicht gelöscht - wenn so vorgesehen.
kann aus Prinzip eigentlich nicht sein, die Variablen sind alle korrekt gesetzt! Vielleicht meinst du den "img_orig" Ordner dort landen die Originale, welche erst bei einem Neustart von Outlook gelöscht werden. Vielleicht hast du im Temp-Ordner noch alte Dateileichen liegen.Hallo colinardo,
Beim probieren ist mir aufgefallen, das die verkleinerten JPG nicht im Temp\img_res Ordner landen, sondern im Temp. Und werden
wohl dementsprechend nicht gelöscht - wenn so vorgesehen.
Kann dein Verhalten hier auf mehreren Systemen nicht nachvollziehen.
Grüße Uwe
Den wirst du auch nicht sehen, denn sobald die Bilder alle an die Mail angehängt wurden wird der auch sogleich wieder gelöscht, das geht sehr schnell. Dadurch das Outlook beim Anhängen der Bilder diese sowieso in einen eigenen temp-Ordner kopiert sind sie obsolet.
Grüße Uwe
Jetzt habe ich eine Fehlermeldung bekommen beim versenden einer eMail, wo ich ein kleines Bild zwischen den Text eingebunden habe.
Diese soll/brauch er nicht komprimieren.
Diese Inline-Bilder werden bereits berücksichtigt und auch von der Bearbeitung ausgeschlossen.Diese soll/brauch er nicht komprimieren.
Der Debugger springt hier in die 2. Zeile:
Stimmt da habe ich noch eine Überprüfung vergessen das überhaupt Bilder bearbeitet wurden, dadurch war das Array(arrDel) leer und es kam ein "Index out of Bounds" - habe es oben korrigiert...Grüße Uwe
Habe den obigen Code noch robuster gemacht und noch erweitert durch einen Dialog, in dem der Nutzer die Möglichkeit hat zu bestimmen ob die Bilder reduziert werden und wenn ja, in welcher Auflösung:
Den Dialog könnt Ihr hier herunterladen -> Download
Um den Dialog einzubinden, Rechtsklick im VBA-Editor auf den Knoten Formulare > Importieren... und dann die runtergeladene entpackte Datei(*.frm) auswählen.
Zusätzlich muss die folgende Variable vor alle anderen Prozeduren ganz am Anfang von "ThisOutlookSession" eingesetzt werden:
Grüße Uwe
Den Dialog könnt Ihr hier herunterladen -> Download
Um den Dialog einzubinden, Rechtsklick im VBA-Editor auf den Knoten Formulare > Importieren... und dann die runtergeladene entpackte Datei(*.frm) auswählen.
Zusätzlich muss die folgende Variable vor alle anderen Prozeduren ganz am Anfang von "ThisOutlookSession" eingesetzt werden:
Public RESIZE_RES As Long
Geänderter Code für "ThisOutlookSession"
Private Sub Application_ItemSend(ByVal Item As Object, Cancel As Boolean)
If Item.Class = olMail Then
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 arrFiles() 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
formResizeImages.Show 'show dialog to choose resolution
If RESIZE_RES > 0 Then 'check resolution from dialog
'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, RESIZE_RES
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)
End If
End If
End If
Set fso = Nothing
Set regex = Nothing
End If
End Sub
Function tobase36(ByVal number As Long) As String
Dim cList
cList = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
Dim finalString As String
While Not number = 0
If CInt(number Mod 36) = 0 Then
finalString = finalString & Mid(cList, CInt(number Mod 36) + 1, 1)
Else
finalString = finalString & Mid(cList, CInt(number Mod 36), 1)
End If
number = number / 36
Wend
tobase36 = finalString
End Function
Private Sub Application_Startup()
On Error Resume Next
Set fso = CreateObject("Scripting.FilesystemObject")
tempfolder = Environ("Temp")
imgOrigTempFolder = tempfolder & "\img_orig"
If fso.FolderExists(imgOrigTempFolder) Then
fso.GetFolder(imgOrigTempFolder).Delete
End If
Set fso = Nothing
End Sub
Grüße Uwe
Ahhh, ich sehe deine Session heißt nicht "ThisOutlookSession" sondern "DieseOutlookSitzung" dann müssen diese beiden Prozeduren in der Form so heißen:
Grüße Uwe
Private Sub btnSendOriginals_Click()
DieseOutlookSitzung.RESIZE_RES = 0
Me.Hide
End Sub
Private Sub btnSendReduced_Click()
DieseOutlookSitzung.RESIZE_RES = Val(comboFormats.Value)
Me.Hide
End Sub
Grüße Uwe