' -- Example to demonstrate CODE of built-in Outlook *email objects*
' -- DO NOT RUN without BACKUP and SAFETY test for your unique environment and version
' -- requires prior creation of target email folders as CONSTANTS
Const TARGETPATH = "\My Documents\CONSTANTNAME\xEmailArchive\"
Option Explicit
' ' SUPPLEMENT TO native AUTO ARCHIVE - saves to pre-set folder ' ' ' '
' ───────
Sub SaveAttachmentsToFolder()
' checks selected messages with attachments
' of a specific type (here file with an "xls" extension) ' and saves them to disk. Saved files are timestamped. The user
' can choose to view the saved files in Windows Explorer.
On Error GoTo SaveAttachmentsToFolder_err
Dim myItem As Outlook.Inspector ' objects from a MicSoft sample routine
Dim myOlExp As Outlook.Explorer
Dim myOlSel As Outlook.Selection
Dim ns As NameSpace
Set ns = GetNamespace("MAPI")
Dim Inbox As MAPIFolder
Set Inbox = ns.GetDefaultFolder(olFolderInbox)
Dim SubFolder As MAPIFolder ' not used
Dim Item As Object
Dim Atmt As Attachment
Dim FileName, strSaveToPath As String
Dim x, i As Integer
Dim varResponse As VbMsgBoxResult
'below set statements were for hard coded target email folders
'Set SubFolder = Inbox.Folders("Sales Reports")
' Enter correct subfolder name.
'Set myOlSel = Inbox.Folders("Sales Reports")
' Enter correct subfolder name.
' For x = 1 To myOlSel.Count 'added
strSaveToPath = getENV("USERPROFILE") & TARGETPATH
'MUST HAVE TRAILING SLASH
'strSaveToPath = getENV("HOMEPATH") & "\My Documents\TEMP\"
Set myItem = Application.ActiveInspector
Set myOlExp = Application.ActiveExplorer
Set myOlSel = myOlExp.Selection
''''''''''''''
For x = 1 To myOlSel.Count
'For Each Item In myOlSel.Items ''replaced by net for each
myOlSel.Item(x).Display
For Each Atmt In myOlSel.Item(x).Attachments
' strname = stripIllegalChars(myOlSel.Item(x).Subject)
' save if filename has "xls" extension ' If Right(Atmt.FileName, 3) = "xls" Then
' This path must exist! Change folder name as necessary.
FileName = strSaveToPath & _
Format(myOlSel.Item(x).CreationTime, "yyyymmdd_hhnnss_") & Atmt.FileName ' & stripIllegalChars(Atmt.FileName) & ".xyz"
' Format(Item.CreationTime, "yyyymmdd_hhnnss_") & Atmt.FileName
Atmt.SaveAsFile FileName
Next Atmt
myOlSel.Item(x).Close olPromptForSave
Next x
' Show summary message
i = myOlSel.Count
If i > 0 Then
varResponse = MsgBox("I found " & i & " attached files." _
& vbCrLf & "I have saved them into the " & strSaveToPath & "." _
& vbCrLf & vbCrLf & "Would you like to view the files now?" _
, vbQuestion + vbYesNo, "Finished!")
' Open Windows Explorer to display saved files if user chooses
If varResponse = vbYes Then '
' Shell "Explorer.exe /e,C:\Email Attachments", vbNormalFocus
Shell "Explorer.exe /e," & strSaveToPath, vbNormalFocus
End If
Else
MsgBox "I didn't find any attached files in your mail.", vbInformation, "Finished!"
End If
' Clear memory
SaveAttachmentsToFolder_exit:
Set Atmt = Nothing
Set Item = Nothing
Set ns = Nothing
Exit Sub
' Handle Errors
SaveAttachmentsToFolder_err:
MsgBox "An unexpected error has occurred." _
& vbCrLf & "Please note and report the following information." _
& vbCrLf & "Macro Name: GetAttachments" _
& vbCrLf & "Error Number: " & Err.Number _
& vbCrLf & CONSTANT_FULL_NAME_and_EMAIL ' "Joe Xplsknik - joex@utestme.com" _
& vbCrLf & "Error Description: " & Err.Description _
, vbCritical, "Error!"
Resume SaveAttachmentsToFolder_exit
End Sub
' ───────
Sub SaveSelectedAsHTML()
Dim myItem As Outlook.Inspector
Dim myOlExp As Outlook.Explorer '
Dim myOlSel As Outlook.Selection '
Dim objItem As Object
Dim strname, strSaveToPath As String
Dim x As Integer
strSaveToPath = getENV("USERPROFILE") & "\Desktop\"
strSaveToPath = getENV("HOMEPATH") & "\My Documents\CONSTANTNAME\xEmailArchive\"
Set myItem = Application.ActiveInspector
Set myOlExp = Application.ActiveExplorer
Set myOlSel = myOlExp.Selection
If Not TypeName(myOlExp) = "Nothing" Then
' Set objItem = myOlExp.CurrentItem
' strname = stripIllegalChars(objItem.Subject)
'Prompt the user for confirmation
Dim strPrompt As String
strPrompt = IIf(myOlSel.Count = 1, myOlSel.Count & " Selected Item", myOlSel.Count & " Selected Items")
strPrompt = strPrompt & " will be saved to " & vbCrLf & strSaveToPath & vbCrLf & _
"Any files with the same name will be OVERWRITTEN."
If MsgBox(strPrompt, vbYesNo + vbQuestion) = vbYes Then
'objItem.SaveAs Environ("HOMEPATH") & "\My Documents\" & strname & ".txt", olTXT
For x = 1 To myOlSel.Count
On Error GoTo FileError
' strname = stripIllegalChars(myOlSel.Item(x).Subject)
' strname = stripIllegalChars(myOlSel.Item(x).SenderEmailAddress & myOlSel.Item(x).Subject)
strname = stripIllegalChars(myOlSel.Item(x).SenderName) 'SenderName SenderEmailAddress
strname = strname & "_" & stripIllegalChars(myOlSel.Item(x).Subject)
strname = strname & "_" & Format(myOlSel.Item(x).CreationTime, "yyyymmdd_hhnnss")
'MsgTxt = MsgTxt & vbCrLf & myOlSel.Item(x).SenderName & ";"
'objItem.SaveAs Environ("USERPROFILE") & "\Desktop\" & strname & ".txt", olTXT
myOlSel.Item(x).Display
myOlSel.Item(x).SaveAs strSaveToPath & strname & ".htm", olHTML 'olMSGUnicode olTXT
'The file type to save. Can be one of the following OlSaveAsType constants:
' olHTML, olMSG, olRTF, olTemplate, olDoc, olTXT, olVCal, olVCard, olICal, or olMSGUnicode.
myOlSel.Item(x).Close olPromptForSave
' olSave olDiscard either has no effect if NOT changed
' myFolder.Items(1).Display
'Set myinspector = Application.ActiveInspector
'Set myItem = myinspector.CurrentItem
'myItem.Close olSave
Next x
End If
Else
MsgBox "There is no current active Explorer."
End If
Exit Sub
FileError:
MsgBox "Error: (Likely " & strSaveToPath & " does not exist!)" _
& vbCrLf & "Please note and report the following information." _
& vbCrLf & "Macro Name: SaveSelectedAsHTML" _
& vbCrLf & "Error Number: " & Err.Number _
& vbCrLf & CONSTANT_FULL_NAME_and_EMAIL & _ ' "Joe Xplsknik - joex@utestme.com" _
& vbCrLf & "Error Description: " & Err.Description _
, vbCritical, "Error!"
'Resume 'SaveAttachmentsToFolder_exit
End Sub
' ───────
Sub SaveSelectedAsTXT()
Dim myItem As Outlook.Inspector
Dim myOlExp As Outlook.Explorer '
Dim myOlSel As Outlook.Selection '
Dim objItem As Object
Dim strname, strSaveToPath As String
Dim x As Integer
'strSaveToPath = getENV("USERPROFILE") & "\Desktop\"
'strSaveToPath = getENV("HOMEPATH") & "\My Documents\CONSTANTNAME\xEmailArchive\"
strSaveToPath = getENV("USERPROFILE") & "\My Documents\CONSTANTNAME\xEmailArchive\"
On Error GoTo FileError
Set myItem = Application.ActiveInspector
Set myOlExp = Application.ActiveExplorer
Set myOlSel = myOlExp.Selection
If Not TypeName(myOlExp) = "Nothing" Then
' Set objItem = myOlExp.CurrentItem
' strname = stripIllegalChars(objItem.Subject)
'Prompt the user for confirmation
Dim strPrompt As String
strPrompt = IIf(myOlSel.Count = 1, myOlSel.Count & " Selected Item", myOlSel.Count & " Selected Items")
strPrompt = strPrompt & " will be saved to " & vbCrLf & strSaveToPath & vbCrLf & _
"Any files with the same name will be OVERWRITTEN."
If MsgBox(strPrompt, vbYesNo + vbQuestion) = vbYes Then
'objItem.SaveAs Environ("HOMEPATH") & "\My Documents\" & strname & ".txt", olTXT
For x = 1 To myOlSel.Count
strname = stripIllegalChars(myOlSel.Item(x).SenderName) 'SenderName SenderEmailAddress
strname = strname & "_" & stripIllegalChars(myOlSel.Item(x).Subject)
strname = strname & "_" & Format(myOlSel.Item(x).CreationTime, "yyyymmdd_hhnnss") & Int(Rnd(1) * 1000)
'strname = stripIllegalChars(myOlSel.Item(x).Subject)
'MsgTxt = MsgTxt & vbCrLf & myOlSel.Item(x).SenderName & ";"
'objItem.SaveAs Environ("USERPROFILE") & "\Desktop\" & strname & ".txt", olTXT
myOlSel.Item(x).Display
myOlSel.Item(x).SaveAs strSaveToPath & strname & ".txt", olTXT
'The file type to save. Can be one of the following OlSaveAsType constants:
' olHTML, olMSG, olRTF, olTemplate, olDoc, olTXT, olVCal, olVCard, olICal, or olMSGUnicode.
myOlSel.Item(x).Close olPromptForSave ' olSave olDiscard either has no effect if NOT changed
' myFolder.Items(1).Display
'Set myinspector = Application.ActiveInspector
'Set myItem = myinspector.CurrentItem
'myItem.Close olSave
Next x
End If
Else
MsgBox "There is no current active Explorer."
End If
Exit Sub
FileError:
MsgBox "Error: (Likely " & strSaveToPath & " does not exist!)" _
& vbCrLf & "Please note the following information." _
& vbCrLf & "Macro Name: SaveSelectedAsTXT" _
& vbCrLf & "Error Number: " & Err.Number _
& vbCrLf & CONSTANT_FULL_NAME_and_EMAIL & _' redundant - see above
& vbCrLf & "Error Description: " & Err.Description _
, vbCritical, "Error!"
'Resume 'SaveAttachmentsToFolder_exit
End Sub
' ───────
Private Function getENV(strReturn As String)
'CALLED BY ChDir getENV("userprofile") & "\Desktop\"
Dim EnvString, Indx, Msg, PathLen ' Declare variables.
Indx = 1 ' Initialize index to 1.
For Indx = 1 To Len(Environ(Indx)) + 2
EnvString = Environ(Indx) ' Get environment
If UCase(Left(EnvString, Len(strReturn))) = UCase(strReturn) Then
getENV = Mid(EnvString, Len(strReturn) + 2)
End If
Next Indx 'Loop Until EnvString = ""
End Function
' ───────
Private Function stripIllegalChars(strTest As String)
Dim strTemp, testThis As String
Dim kount As Integer
strTemp = ""
strTest = Trim(strTest)
For kount = 1 To Len(strTest)
testThis = Mid(strTest, kount, 1)
If InStr(".|\/?*:<>' ", testThis) > 0 Or Asc(testThis) < 32 Or Asc(testThis) = 34 Or Asc(testThis) > 129 Then
'strTemp = strTemp & "_"
Else: strTemp = strTemp & Mid(strTest, kount, 1)
End If
Next kount
stripIllegalChars = IIf(Len(strTemp) < 1, "Missing_Subject" & Int(Rnd(1) * 1000), strTemp)
End Function
' ───────
Sub SetFlagIcon()
Dim mpfInbox As Outlook.Folder
Dim obj As Outlook.MailItem
Dim i As Integer
Set mpfInbox = Application.GetNamespace("MAPI").GetDefaultFolder(olFolderInbox).Folders("Test")
' Loop all items in the Inbox\Test Folder
For i = 1 To mpfInbox.Items.Count
If mpfInbox.Items(i).Class = olMail Then
Set obj = mpfInbox.Items.Item(i)
If obj.SenderEmailAddress = "someone@example.com" Then
'Set the yellow flag icon
obj.FlagIcon = olYellowFlagIcon
obj.Save
End If
End If
Next
End Sub
' ───────