Right, it works with the following structure, even though Outlook's response
doesn't feel "natural" with a 100ms timer:
ThisApplication_Startup
_ToBeProcessed = New Collection
_moveTimer = New Timer
_moveTimer.Interval = 100
_moveTimer.Start()
ThisApplication_ItemSend
_ToBeProcessed.Add(Item)
Cancel = True
Private Sub _moveTimer_Tick(ByVal sender As Object, ByVal e As
System.EventArgs) Handles _moveTimer.Tick
If _ToBeProcessed.Count > 0 Then
For x As Integer = 1 To _ToBeProcessed.Count
CType(_ToBeProcessed(x), MailItem).Move(_myOutbox)
_ToBeProcessed.Remove(x)
Next
End If
End Sub
Do all the MVPs here think this really is the way to do it?
With the timer_tick running so frequently,
- What's the strain on system resources?
- Are there any concurrency issues? (is the function executed if it's
already being processed since the last timer tick?)
Ekin
Ps: Dmitry, re your "you cannot delete or move the message while Outlook is
still processing the event callback" comment. item.Delete():
Marshal.ReleaseComObject(item): item = Nothing does exactly that in ItemSend,
unless you meant something else...
"Dmitry Streblechenko" wrote:
> As long your timer interval is not 2 minutes, the user won't have a chance
> to do anything.
> Thee important part is that your cannot delete or move the message while
> Outlook is still processing the event callback. If the timer interval is 0,
> it will fire immediately after Outlook runs the Windows message loop, but by
> that time Outlook will be out of the event callback.
>
> Dmitry Streblechenko (MVP)
> http://www.dimastr.com/
> OutlookSpy - Outlook, CDO
> and MAPI Developer Tool
>
> "Ekin" <(E-Mail Removed)> wrote in message
> news:9B894B9A-96C6-428A-AC67-(E-Mail Removed)...
> > Thank you Ken. I tired with Item.Send (via inspectors) and had no luck.
> > Managing a dictionary of EntryIDs and going through them inside a timer
> > tick
> > doesn't sound too reliable, mainly because the user may do something else
> > with the email if it remains open.
> >
> > In my ItemSend, I added the following lines:
> > CloneMailItem(Item).Move(_myOutbox)
> > DeleteMailItem(Item)
> > Cancel = True
> >
> > DeleteMailItem does item.Delete(), Marshal.ReleaseComObject(item) and
> > item=Nothing.
> >
> > CloneMailItem creates a NEW MailItem object and gets a member by member
> > copy
> > of the input item. newItem.To = item.To, newItem.CC = item.CC, ....
> > (Binary
> > serialization doesn't work as MailItem isn't serializable.)
> >
> > Now, the new item doesn't have any pointers back to Item in ItemSend and
> > everything works fine without "Send operation failed because the item was
> > deleted" and "The item has been moved or deleted" errors / notifications.
> >
> > So if I could ditch the CloneMailItem function and use newitem =
> > item.Move(_myOutbox) and somehow dispose the pointer from newitem to Item,
> > my
> > problem would be solved. Marshal.ReleaseComObject(newitem) and newitem =
> > Nothing don't do the trick.
> >
> > Any ideas?
> >
> > Ekin
> >
> > "Ken Slovak - [MVP - Outlook]" wrote:
> >
> >> It might work better if you do that in item.Send rather than in the
> >> application wide event. Also, generally it's better to cancel the send,
> >> set
> >> a flag and check the flag later using a timer or something to first get
> >> out
> >> of the send event before you try to move the item. At least that's what
> >> I've
> >> found doing similar things.
> >>
> >> --
> >> Ken Slovak
> >> [MVP - Outlook]
> >> http://www.slovaktech.com
> >> Author: Professional Programming Outlook 2007
> >> Reminder Manager, Extended Reminders, Attachment Options
> >> http://www.slovaktech.com/products.htm
> >>
> >>
> >> "Ekin" <(E-Mail Removed)> wrote in message
> >> news
957626D-A6CC-4C6E-B845-(E-Mail Removed)...
> >> > Thank you, Sue, but that didn't work.
> >> >
> >> > When I debug in VS and follow the ThisApplication_ItemSend through line
> >> > by
> >> > line, I can get to End Sub without any errors; when I hit F10 on End
> >> > Sub,
> >> > the
> >> > annoying "The item has been moved or deleted" message is thrown by
> >> > Outlook
> >> > --VS Interop isn't even aware of it! So as far as VB is concerned,
> >> > there
> >> > is
> >> > no error.
> >> >
> >> > Problem remains...
> >> >
> >> > Ekin
> >>
> >>
>
>
>