trap outbound mail to update subject

  • Thread starter Thread starter andy tomic
  • Start date Start date
A

andy tomic

Hi all

Getting a little stuck on my outbound rules / vba code. I currently
run an excellent addin called TAGLOCITY which tags emails with
categories. What I am trying to do PREFIX the mail subject based on
the category. NOTE: The taglocity addin triggers a category request
AFTER the item.send action.

for example;
I have a category "100 Love St" (this is my project name)
I have a color for all PROJECTS -- construction project are DARKGREEN
When I send the mail I want the addin to check the subject for a ":"
Then if there is no ":", prefix with "Job:" and the category.

I have the code for this and it works fine if i manually trigger the
vba code. I have a rule to hold the email in outbox for 1minute to
give the program time to modify and for me to go in and cancel the send
;) . My question is how can I trigger the code to work AFTER the
item.send command and there after the TAGLOCITY addin has had a chance
to add in the category.

code below:
Sub PrefixMailItemInOutbox()
Dim oNS As Outlook.NameSpace
Dim oFld As Outlook.Folder
Dim oItems As Outlook.Items
Dim oItem As Object
Dim Item As Outlook.MailItem

On Error GoTo OL_Error

Set oNS = Application.GetNamespace("MAPI")
Set oFld = oNS.GetDefaultFolder(olFolderOutbox)

Set oItems = oFld.Items
'Set objItem = GetCurrentItem()
StoreID = oFld.StoreID

For Each oItem In oItems
If InStr(1, oItem.Subject, ":", vbTextCompare) = 0 Then

If Len(oItem.Categories) > 0 Then
Set objItem = oNS.GetItemFromID(oItem.EntryID, StoreID)

For Each objCategory In oNS.Categories
If InStr(1, objItem.Categories, objCategory.Name, vbTextCompare)
Select Case objCategory.Color
Case OlCategoryColor.olCategoryColorDarkRed
objItem.Subject = "Roofing:" & objCategory.Name & " - "
& objItem.Subject
objItem.Save
Case OlCategoryColor.olCategoryColorBlack
objItem.Subject = "Carpentry:" & objCategory.Name & " -
" & objItem.Subject
objItem.Save
Case OlCategoryColor.olCategoryColorDarkGreen
objItem.Subject = "Job:" & objCategory.Name & " - " &
objItem.Subject
objItem.Save
End Select
End If
Next
End If
objItem.Send
'Set objItem = Nothing
End If

Next

Exit Sub
OL_Error:
MsgBox Err.Description
Err.Clear
End Sub

Thanks in advance

Andy
 
Hook into the Application.ItemSend event in the ThisOutlookSession code
window. It gets passed the email that is being sent so that you can
manipulate it:-

Private Sub Application_ItemSend(ByVal Item As Object, Cancel As Boolean)
Dim myItem As MailItem
If TypeName(Item) = "olMailItem" Then
Set myItem = Item
'Do something here such as call your routine passing the myItem object
End If
End Sub

I guess that your addin is already hooking into this event, so I am not sure
whether this would run before or after the addin, perhaps someone else can
advise.
 
It's impossible to determine what addin will run things in what order. It
depends on the load order of the addins (Outlook VBA is just another COM
addin) and which ones register for which events in which order.

If that addin is actually hooking to Application.ItemSend() then it might be
after or before a VBA hook. If the VBA code must be after the addin massages
the data then using an earlier event such as item.Send() wouldn't help, but
many addins do use that event rather than Application.ItemSend() since that
fires after the email transport is engaged and so is too late for some item
manipulations.
 
Thank you Alan and Ken.

The addin is definitely triggered after the Application.ItemSend event


What I was thinking as a work around is to delay the message in th
outbox for 1 min using a rule. Then manipulate the message with the
code. My only shortfall is that I have not the knowledge to create a
CUSTOM ACTION in the rules section.

Is there a simple way to call the procedure once the email gets int
the outbox ??

Thanking you in advance

And
 
If you touch the item in the Outbox using code the send will be cancelled.

Application_ItemSend() will always fire, but sometimes it fires too late for
what you want to do, or some properties aren't changeable at that time.

If you want to handle things earlier, before the item gets to the Outbox
handle the Send() event on the item rather than the application-wide event.
 
Thanks Ken,

This is my problem. The Application_Send event fires TO EARLY. I need
the PROPRIETARY addin to fire first, it sets the category for the
mailitem. Then I can manipulate the subject based on the newly set
category, and save and resend the mailitem.

Also, the form based send() event fires to early as well.

I basically need the code to run after the PROPRIETARY addin runs. The
only way I have thought of is to put a 1min delay on the outbound mail
rule and perform a custom action. Unfortunately my programming skills
dont travel to the DLL world.

Any other ideas on how to accomplish this.

Thank you

Andy
 
I have no idea what proprietary addin you're talking about.

Application.ItemSend() is the last event you'd get on outgoing items, so if
that's too early for you then you need to rethink your architecture.
 
Back
Top