0
votes

The following is a VBScript (VBS) that I use the check for and process certain Outlook emails and attachments. The script finds the emails via their email address and subject. It then saves the attachment in a folder and moves the email to a folder within Outlook. (Most of this code was adapted from a stackoverflow.com post, but I have since forgotten which one.)

My issue: Sometimes this script has to be run before the user has opened Outlook for the day; therefore, none of the Outlook folders have been updated and the script can't find emails that have been sent to the user since the user shut Outlook down last.

My question: How do I update the Outlook inbox then proceed with the rest of the script ensuring that the Inbox is (or all Outlook folders are) completely updated? I'm not sure if VBS will wait for the folder update to happen, but if it won't, I, of course, need it to. I don't know how to update the inbox or wait for it to update if waiting is applicable.

Other tips on how to make the script better are welcome.

My VBScript:

Const olFolderInbox = 6

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objOutlook = CreateObject("Outlook.Application")

Set objNamespace = objOutlook.GetNamespace("MAPI")
Set objFolder = objNamespace.GetDefaultFolder(olFolderInbox)

Call SaveAndMoveAttachment("'subject 1'", objFolder)
Call SaveAndMoveAttachment("'subject 2'", objFolder)
Call SaveAndMoveAttachment("'subject 3'", objFolder)

Set objFSO = Nothing
Set objOutlook = Nothing
Set objNamespace = Nothing
WScript.Quit

Sub SaveAndMoveAttachment(sSubject, objFolder)
  Set colItems = objFolder.Items
  Set colFilteredItems = colItems.Restrict("[Subject] = " & sSubject)

  If colFilteredItems.count = 0 then
    Msgbox "An email with subject " & sSubject & " in it was not found in your Outlook Inbox"
    WScript.Quit
  end if

  For Each objMessage In colFilteredItems
    Set colAttachments = objMessage.Attachments 
    intCount = colAttachments.Count

    If intCount <> 0  and objMessage.Sender.Address = "[email protected]" Then
      For i = 1 To intCount
        strFileName = "Z:\somepath\" & objMessage.Attachments.Item(i).FileName
        objMessage.Attachments.Item(i).SaveAsFile strFileName
        'move the message to somefolder folder
        Set objFoldersomefolder = objNamespace.GetDefaultFolder(olFolderInbox).Folders("somefolder")

        objMessage.Move objFoldersomefolder
      Next
    End If
  Next

  Set colFilteredItems = Nothing
  Set colAttachments = Nothing
  Set colItems = Nothing
End Sub
2

2 Answers

1
votes

Add logon step between above 2 lines

WSCript.Sleep 2000 objNamespace.Logon objNamespace.SendAndReceive(True)

0
votes

Below this line:

Set objNamespace = objOutlook.GetNamespace("MAPI")

Add this:

WSCript.Sleep 2000
objNamespace.SendAndReceive(True) 

I found it here: http://www.experts-exchange.com/Software/Office_Productivity/Groupware/Outlook/Q_28215854.html