VSTO Outlook ItemAdd not being fired when incoming e-mail is moved by rule to subfolder - vb.net

I have an Outlook VSTO add-in. I want to respond to incoming emails. This works quite well with the declaration
Public WithEvents items As Outlook.Items
And the definition for the items that are observed. (I'm afraid that's why only "Inbox" is watched):
inbox = objOutlook.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox)
items = inbox.Items
and the eventhandler
Private Sub Items_ItemAdd(ByVal item As Object) Handles items.ItemAdd
Even if Outlook is closed, an event is triggered for each new email when Outlook is started.
I've now noticed that some users of the add-in have created a rule that moves incoming emails to a subfolder of "Inbox". In this case, the Items_ItemAdd event is not fired when a new email arrives.
How can I also capture these new emails that are moved via a rule?

The item is moved on the server side by the server side rule, and even if Outlook was running, it could've been moved before Outlook downloaded the original item to the OST store. So if ItemAdd event fires, it only fires on the folder where the item was moved to, not in the Inbox folder.
Besides watching the Inbox folder, you'd need to watch the other folders that the rules might point to - retrieve the rules using Store.GetRules(), loop through all rules, check if Rule.MoveToFolder action is enabled, and if yes, retrieve the target folder from MoveOrCopyRuleAction.Folder property.

Use the NewMailEx event of the Application class which is fired once for every received item that is processed by Microsoft Outlook. The item can be one of several different item types, for example, MailItem, MeetingItem, or SharingItem. The EntryIDsCollection string contains the Entry ID that corresponds to that item.
The NewMailEx event fires when a new message arrives in the Inbox and before client rule processing occurs. Use the Entry ID returned in the EntryIDCollection array to call the NameSpace.GetItemFromID method and process the item.
Also you may track the items in the folders by combining multiple mechanisms like this event handler plus getting new items at startup to not skip any of them that was added silently. The Find/FindNext or Restrict methods of the Items class can help you with such tasks. Read more about that in the series of articles:
Outlook NewMail event unleashed: the challenge (NewMail, NewMailEx, ItemAdd)
Outlook NewMail event: solution options
Outlook NewMail event and Extended MAPI: C# example
Outlook NewMail unleashed: writing a working solution (C# example)

Related

Saving Outlook Attachments Automatically Based On Attachment File Name Only

I need to save an Outlook file attachment with a static file name to a specific network location automatically when that email arrives. This file will be saved in a network location for upload using a monthly SSI server package. I hope to do this automatically without any interaction but not opposed to manually running a macro. I am unsure of references that are needed in VBA to get this to execute. I am also unfamiliar with the "ThisOutlookSession" configuration that I've seen in similar threads
I have attempted to use the existing script that I've seen here with no luck. ( I can get them to run without error but do not get any results ) I want to search all incoming email and only have it take action if the email has an attachment and that attachment has a specific unchanging file name. I have the developer tab enabled in Outlook and can access VBA through it. Looking for a solid simple solution. Constants are the file name and extension as well as the network folder. Variables would be the sender and date of delivery. Office 365 running Windows 10 in a professional environment. Any help or direction would be greatly appreciated.
You can handle incoming emails in Outlook in the NewMailEx event handler. The event fires once for every received item that is processed by Microsoft Outlook. The item can be one of several different item types, for example, MailItem, MeetingItem, or SharingItem. The EntryIDsCollection string contains the Entry ID that corresponds to that item. Use the Entry ID string to call the NameSpace.GetItemFromID method and process the item. The NewMailEx event fires when a new message arrives in the Inbox and before client rule processing occurs.
Also, as a possible workaround, you may consider handling the ItemAdd event on the Inbox folder. This event is fired when one or more items are added to the specified collection. This event does not run when a large number of items are added to the folder at once. For example:
Public WithEvents myOlItems As Outlook.Items
Public Sub Application_Startup()
Set myOlItems = Application.GetNamespace("MAPI").GetDefaultFolder(olFolderContacts).Items
End Sub
Private Sub myOlItems_ItemAdd(ByVal Item As Object)
MsgBox Item.Attachments.Count
End Sub

How can I automatically flag an email after reply in Outlook

I would like to see if there is any way that anyone replies in a shared mailbox to any email and the email is automatically flagged in outlook. Can be via Power Automate or VBA.
One way or another, you would need to set the MailItem.Categories property and/or MailItem.ReminderSet / ReminderTime properties on the original item in the folder.
You can use Explorer.SelectionChange event to track the item selection, set up MailItem.Reply/ReplyAll event handlers on the item(s) from the Explorer.Selection collection, and then set the reminder properties in the event handler. Or you can use Explorer.InlineResponse event to set up the properties on the first item in the Explorer.Selection collection

Use link from email outlook to fire VBA code

is there any chance to make the following scenario working
user gets email in Outlook containing link/text/object
clicking the object runs simple VBA code (i.e. replace string in txt) file on users computer
Thank you.
No, it is not possible. This is a potential path for malware.
Instead, you can handle the NewMailEx event of the Application class in Outlook VBA macros where can detect such mails (with a specific text or links) and run your business logic accordingly.
The NewMailEx event fires once for every received item that is processed by Microsoft Outlook. The item can be one of several different item types, for example, MailItem, MeetingItem, or SharingItem. The NewMailEx event fires when a new message arrives in the Inbox and before client rule processing occurs. You can use the Entry ID returned in the EntryIDCollection array to call the NameSpace.GetItemFromID method and process the item.

Custom Extended Properties on AppointmentItem is not available for Recipients

Before sending the appointmentItem in outlook 2010 I have created an extended property and set some values. The property is not available for the recipient (recipients are using outlook and they are from the same domain).
However, the property is available in the owner's calendar item.
Any inputs about this issue is much appreciated.
Keep in mind that ApointmentItem object is never sent - Outlook creates a MeetingItem object and sends. The original ApointmentItem remains in the Calendar folder.
You can try to use Application.ItemSend event - Outlook will pass MeetingItem as the parameter, and you should be able to set the extra properties. Now where these properties will be copied by Outlook from MeetingItem in the Inbox to the new ApointmentItem is a different question...
I have already replied to your post on MSDN forums two days ago:
The fact is that a meeting item is not sent to a recipient. Instead, a corresponding meeting request is created and sent to the recipient. Just check the message class of the item when the item is sent. You can handle the ItemSend event of the Application class which is fired whenever an Microsoft Outlook item is sent, either by the user through an Inspector (before the inspector is closed, but after the user clicks the Send button) or when the Send method for an Outlook item.

How to execute VBA after Outlook Application_Startup event handler and after all folders sync?

I'm trying to run a macro that moves emails received before today to a cabinet folder whenever Outlooks starts. The problem is that the Application_Startup event handler happens before Outlook is completely loaded and folders have synced. Consequently, all the emails that came in last night aren't moved to the cabinet when I open Outlook in the morning.
To fix this I created a custom class to instantiate an Outlook.syncObject which syncs all folders and provides an event handler when the syncing is complete. I create an object from this class within the Application_Startup event handler. However, this sync doesn't seem to actually retrieve any emails and also seems to complete before Outlook has even loaded.
It seems like being able to execute code after Outlook has done all of it's startup processes would be a common feature request. Thanks for any help.
This sample code simply shows me how many unread emails are in my inbox. If I close Outlook, send myself an email, then open Outlook, I need Outlook to load and a full sync to occur before generating the messagebox with the number of unread emails in my inbox.
Oulook Application_Startup event handler:
Dim mySyncInstance As New mySync
Private Sub Application_Startup()
mySyncInstance.Initialize_handler
End Sub
Custom mySync Class Code:
Dim WithEvents mySync As Outlook.syncObject
Sub Initialize_handler()
Set mySync = Application.Session.SyncObjects.item(1)
mySync.Start
End Sub
Private Sub mySync_SyncEnd()
MsgBox Application.GetNamespace("MAPI").GetDefaultFolder(olFolderInbox).items.Restrict("[UnRead] = True").Count & _
" Emails are unread in the main inbox."
End Sub
I'm trying to run a macro that moves emails received before today to a cabinet folder whenever Outlooks starts.
You may consider handling the NewMailEx event of the Application class which is fired when a new item is received in the Inbox. So, you can get the mail item and decide whether you need to move it in a subfolder or not. This event fires once for every received item that is processed by Microsoft Outlook. The item can be one of several different item types, for example, MailItem, MeetingItem, or SharingItem. The EntryIDsCollection string contains the Entry ID that corresponds to that item.
Also you can create a rule and assign a VBA macro sub. The incoming instance of the mail item object will be passed as a parameter. For example:
public sub test(mail as MailItem)
' do whatever you need
end sub
As an alternative way you can handle the ItemAdd event of the Items class which is fired when one or more items are added to the specified collection. This event does not run when a large number of items are added to the folder at once (more than 16).
Why not use Items.ItemAdd event on the Inbox folder?