Home All Groups Group Topic Archive Search About

Waht is the fastest/bets? Outlook Object/CDO/Redemption/...?

Author
1 Feb 2006 1:22 PM
Pieter
Hi,

I'm using a thight integration with Outlook 2003 (with an Exchange server)
in my VB.NET (2005) application.
Until now I'm using the Outlook Object Model, but it appears to be very
slow, and has some problems:
- doing a Move changes the ReceivedTime of the MailItem
- I can't use RichText in the MailItem.Body (only allows plain text or HTML)
- some other stuff like having to use small 'tricks' to show the default
signature in an email
- ...

So I'm looking to other ways to have an interactions with Outlook.
What I basicly need to do is:
- Move the currently selected mail to a specific folder, and write the data
of it to a database (subject, entryid, sender, recipients, attachments, ..)
- Create a new mail with a specific text, receiver, subject, attachements,
and once it is send move it to a specific folder and write the same data to
the database

These things actually do work, but especially the first one takes too much
time: on some clients more than 10 seconds!!
Is their a way to speed things up? using CDO or Redemption or ...? What are
the pros and cons of each way? Can they do what I need?

Any help our hints would be really aprpeciated!

Thanks a lot in advance,

Pieter


I did it now like this:

Public Function AddDocMails(ByVal DocList As Generic.List(Of clsDoc)) As
String
        Dim oApp As Outlook.Application
        Dim oExp As Outlook.Explorer
        Dim oSel As Outlook.Selection   ' You need a selection object for
getting the selection.
        Dim oFolder As Outlook.MAPIFolder
        Dim oItem As Outlook.MailItem

        Dim intGood As Integer = 0
        Dim intTotaal As Integer = 0

        Try
            oApp = New Outlook.Application
            oExp = oApp.ActiveExplorer  ' Get the ActiveExplorer.
            oSel = oExp.Selection       ' Get the selection.

            Dim intX As Integer
            Dim clsMail As clsDocMail
            oFolder = oExp.CurrentFolder
            intTotaal = oSel.Count

            For intX = 1 To (oSel.Count)
                Try

                    If oSel.Item(intX).Class = Outlook.OlObjectClass.olMail
Then
                        oItem = oSel.Item(intX)
                        clsMail = New clsDocMail(oItem, oFolder)
                        'save it!
                        clsMail.Save()
                    End If
                Catch ex As Exception
                    ErrorMessage(ex, "Inner AddDocMails")
                End Try
            Next
        Catch ex As Exception
            ErrorMessage(ex)
        End Try

        oItem = Nothing
        oFolder = Nothing
        oSel = Nothing
        oExp = Nothing
        oApp = Nothing

        Return strF
    End Function


    Public Sub New(ByVal ItemOutlook As Object, ByVal FolderOutlook As
Object)
        Me.New()
        Me.oItem = ItemOutlook
        Me.oFolder = FolderOutlook

       Me.GetMailInfo()
    End Sub


    Public Function GetMailInfo(Optional ByVal blnMove As Boolean = True) As
Boolean
        Dim blnOk As Boolean = True

        Try
            If blnMove Then
                Try
                    If (oFolder.StoreID <>
clsDocShared.GlobalDoc.MyOutlookFolder.StoreID) Or (oFolder.EntryID <>
clsDocShared.GlobalDoc.MyOutlookFolder.EntryID) Then
                        'Move it to the right folder: StoreID
                        oItem =
oItem.Move(clsDocShared.GlobalDoc.MyOutlookFolder)
                    End If
                Catch ex As Exception
                    blnOk = False
                    Return blnOk
                    Exit Function
                End Try
            End If

            'FolderID
            Me.FolderID = clsDocShared.GlobalDoc.MyOutlookFolderID
            'FileLink = MailLink = EntryID
            Me.FileLink = oItem.EntryID

            'From and to etc...
            Me.MailFrom = oItem.SenderName
            If oItem.To IsNot Nothing Then
                Me.MailTo = oItem.To
            End If

            If oItem.CC IsNot Nothing Then
                Me.MailCC = oItem.CC
            End If
            If oItem.BCC IsNot Nothing Then
                If Me.MailCC Is Nothing Then
                    Me.MailCC = ""
                End If
                If Me.MailCC.Length > 0 Then
                    Me.MailCC = Me.MailCC & ", "
                End If
                Me.MailCC = Me.MailCC & oItem.BCC
            End If
            If oItem.Subject IsNot Nothing Then
                Me.MailSubject = oItem.Subject
            End If

            Me.MailDate = oItem.ReceivedTime
           Me.AddDate = Me.MailDate

            Dim intA As Integer
            'premier Type identification
            '?oitem.MessageClass =
          -> FAX
            '?oitem.MessageClass =
           -> MAIL
            Dim strI As String
            If oItem.MessageClass = "IPM.FAX" Then
                'received
                strI = "FAX"
            Else
                strI = "MAIL"
            End If
            If (strI = "MAIL") And (oItem.Recipients.Count > 0) Then
                If oItem.Recipients.Item(1).AddressEntry.Type.ToString =
"FAX" Then
                    'send
                    strI = "FAX"
                ElseIf oItem.SenderName = "FAXINSDX" Then
                    'een fax wordt soms doorgemaild naar iemand!!!
                    strI = "FAX"
                End If
            End If
            Me.MailType = strI

            If oItem.Attachments.Count > 0 Then
                Me.MailType = Me.MailType & ".ATTACHMENT"
                Me.Attachments = ""
                For intA = 1 To oItem.Attachments.Count
                    If intA > 1 Then
                        Me.Attachments = Me.Attachments & ", "
                    End If
                    Me.Attachments = Me.Attachments &
oItem.Attachments.Item(intA).FileName.ToString
                Next
            End If

            If oItem.FlagStatus = Outlook.OlFlagStatus.olFlagMarked Then
                Me.Flag = "1"
            ElseIf oItem.FlagStatus = Outlook.OlFlagStatus.olFlagComplete
Then
                Me.Flag = "2"
            End If
            If oItem.Importance = Outlook.OlImportance.olImportanceHigh Then
                Me.Flag = "1"
            End If
        Catch ex As Exception
            blnOk = False
            ErrorMessage(ex, "GetMailInfoDebug: " & strStatus)
        End Try

        Return blnOk
    End Function

Author
1 Feb 2006 5:39 PM
Eric Legault [MVP - Outlook]
Use CDO/Redemption if you need to work with large sets of items, especially
looping through collections.  Use Redemption for bypassing the Object Model
Guard and to use some MAPI stuff, profile management and other functions not
handled by CDO.  Stick with the OOM if you are primarily working with UI
related elements of Outlook items.

There's been other discussions lately around ReceivedTime changing; google
this group to see some threads.

To modify Rich Text, use the Word Object Model if Word is being used as the
editor, or the SafeInspector object with Redemption.

--
Eric Legault (Outlook MVP, MCDBA, old school WOSA MCSD, B.A.)
Try Picture Attachments Wizard for Outlook:
http://www.collaborativeinnovations.ca
Blog: http://blogs.officezealot.com/legault/


Show quote
"Pieter" wrote:

> Hi,
>
> I'm using a thight integration with Outlook 2003 (with an Exchange server)
> in my VB.NET (2005) application.
> Until now I'm using the Outlook Object Model, but it appears to be very
> slow, and has some problems:
> - doing a Move changes the ReceivedTime of the MailItem
> - I can't use RichText in the MailItem.Body (only allows plain text or HTML)
> - some other stuff like having to use small 'tricks' to show the default
> signature in an email
> - ...
>
> So I'm looking to other ways to have an interactions with Outlook.
> What I basicly need to do is:
> - Move the currently selected mail to a specific folder, and write the data
> of it to a database (subject, entryid, sender, recipients, attachments, ..)
> - Create a new mail with a specific text, receiver, subject, attachements,
> and once it is send move it to a specific folder and write the same data to
> the database
>
> These things actually do work, but especially the first one takes too much
> time: on some clients more than 10 seconds!!
> Is their a way to speed things up? using CDO or Redemption or ...? What are
> the pros and cons of each way? Can they do what I need?
>
> Any help our hints would be really aprpeciated!
>
> Thanks a lot in advance,
>
> Pieter
>
>
> I did it now like this:
>
>  Public Function AddDocMails(ByVal DocList As Generic.List(Of clsDoc)) As
> String
>         Dim oApp As Outlook.Application
>         Dim oExp As Outlook.Explorer
>         Dim oSel As Outlook.Selection   ' You need a selection object for
> getting the selection.
>         Dim oFolder As Outlook.MAPIFolder
>         Dim oItem As Outlook.MailItem
>
>         Dim intGood As Integer = 0
>         Dim intTotaal As Integer = 0
>
>         Try
>             oApp = New Outlook.Application
>             oExp = oApp.ActiveExplorer  ' Get the ActiveExplorer.
>             oSel = oExp.Selection       ' Get the selection.
>
>             Dim intX As Integer
>             Dim clsMail As clsDocMail
>             oFolder = oExp.CurrentFolder
>             intTotaal = oSel.Count
>
>             For intX = 1 To (oSel.Count)
>                 Try
>
>                     If oSel.Item(intX).Class = Outlook.OlObjectClass.olMail
> Then
>                         oItem = oSel.Item(intX)
>                         clsMail = New clsDocMail(oItem, oFolder)
>                         'save it!
>                         clsMail.Save()
>                     End If
>                 Catch ex As Exception
>                     ErrorMessage(ex, "Inner AddDocMails")
>                 End Try
>             Next
>         Catch ex As Exception
>             ErrorMessage(ex)
>         End Try
>
>         oItem = Nothing
>         oFolder = Nothing
>         oSel = Nothing
>         oExp = Nothing
>         oApp = Nothing
>
>         Return strF
>     End Function
>
>
>     Public Sub New(ByVal ItemOutlook As Object, ByVal FolderOutlook As
> Object)
>         Me.New()
>         Me.oItem = ItemOutlook
>         Me.oFolder = FolderOutlook
>
>        Me.GetMailInfo()
>     End Sub
>
>
>     Public Function GetMailInfo(Optional ByVal blnMove As Boolean = True) As
> Boolean
>         Dim blnOk As Boolean = True
>
>         Try
>             If blnMove Then
>                 Try
>                     If (oFolder.StoreID <>
> clsDocShared.GlobalDoc.MyOutlookFolder.StoreID) Or (oFolder.EntryID <>
> clsDocShared.GlobalDoc.MyOutlookFolder.EntryID) Then
>                         'Move it to the right folder: StoreID
>                         oItem =
> oItem.Move(clsDocShared.GlobalDoc.MyOutlookFolder)
>                     End If
>                 Catch ex As Exception
>                     blnOk = False
>                     Return blnOk
>                     Exit Function
>                 End Try
>             End If
>
>             'FolderID
>             Me.FolderID = clsDocShared.GlobalDoc.MyOutlookFolderID
>             'FileLink = MailLink = EntryID
>             Me.FileLink = oItem.EntryID
>
>             'From and to etc...
>             Me.MailFrom = oItem.SenderName
>             If oItem.To IsNot Nothing Then
>                 Me.MailTo = oItem.To
>             End If
>
>             If oItem.CC IsNot Nothing Then
>                 Me.MailCC = oItem.CC
>             End If
>             If oItem.BCC IsNot Nothing Then
>                 If Me.MailCC Is Nothing Then
>                     Me.MailCC = ""
>                 End If
>                 If Me.MailCC.Length > 0 Then
>                     Me.MailCC = Me.MailCC & ", "
>                 End If
>                 Me.MailCC = Me.MailCC & oItem.BCC
>             End If
>             If oItem.Subject IsNot Nothing Then
>                 Me.MailSubject = oItem.Subject
>             End If
>
>             Me.MailDate = oItem.ReceivedTime
>            Me.AddDate = Me.MailDate
>
>             Dim intA As Integer
>             'premier Type identification
>             '?oitem.MessageClass =
>           -> FAX
>             '?oitem.MessageClass =
>            -> MAIL
>             Dim strI As String
>             If oItem.MessageClass = "IPM.FAX" Then
>                 'received
>                 strI = "FAX"
>             Else
>                 strI = "MAIL"
>             End If
>             If (strI = "MAIL") And (oItem.Recipients.Count > 0) Then
>                 If oItem.Recipients.Item(1).AddressEntry.Type.ToString =
> "FAX" Then
>                     'send
>                     strI = "FAX"
>                 ElseIf oItem.SenderName = "FAXINSDX" Then
>                     'een fax wordt soms doorgemaild naar iemand!!!
>                     strI = "FAX"
>                 End If
>             End If
>             Me.MailType = strI
>
>             If oItem.Attachments.Count > 0 Then
>                 Me.MailType = Me.MailType & ".ATTACHMENT"
>                 Me.Attachments = ""
>                 For intA = 1 To oItem.Attachments.Count
>                     If intA > 1 Then
>                         Me.Attachments = Me.Attachments & ", "
>                     End If
>                     Me.Attachments = Me.Attachments &
> oItem.Attachments.Item(intA).FileName.ToString
>                 Next
>             End If
>
>             If oItem.FlagStatus = Outlook.OlFlagStatus.olFlagMarked Then
>                 Me.Flag = "1"
>             ElseIf oItem.FlagStatus = Outlook.OlFlagStatus.olFlagComplete
> Then
>                 Me.Flag = "2"
>             End If
>             If oItem.Importance = Outlook.OlImportance.olImportanceHigh Then
>                 Me.Flag = "1"
>             End If
>         Catch ex As Exception
>             blnOk = False
>             ErrorMessage(ex, "GetMailInfoDebug: " & strStatus)
>         End Try
>
>         Return blnOk
>     End Function
>
>
>
>
Author
2 Feb 2006 11:04 AM
Pieter
Ok, thanks a lot!

Show quote
"Eric Legault [MVP - Outlook]" <elegault***@REMOVEZZZmvps.org> wrote in
message news:262051B4-8C1F-4A82-A524-88E754B3C5C6@microsoft.com...
> Use CDO/Redemption if you need to work with large sets of items,
> especially
> looping through collections.  Use Redemption for bypassing the Object
> Model
> Guard and to use some MAPI stuff, profile management and other functions
> not
> handled by CDO.  Stick with the OOM if you are primarily working with UI
> related elements of Outlook items.
>
> There's been other discussions lately around ReceivedTime changing; google
> this group to see some threads.
>
> To modify Rich Text, use the Word Object Model if Word is being used as
> the
> editor, or the SafeInspector object with Redemption.
>
> --
> Eric Legault (Outlook MVP, MCDBA, old school WOSA MCSD, B.A.)
> Try Picture Attachments Wizard for Outlook:
> http://www.collaborativeinnovations.ca
> Blog: http://blogs.officezealot.com/legault/
>
>
> "Pieter" wrote:
>
>> Hi,
>>
>> I'm using a thight integration with Outlook 2003 (with an Exchange
>> server)
>> in my VB.NET (2005) application.
>> Until now I'm using the Outlook Object Model, but it appears to be very
>> slow, and has some problems:
>> - doing a Move changes the ReceivedTime of the MailItem
>> - I can't use RichText in the MailItem.Body (only allows plain text or
>> HTML)
>> - some other stuff like having to use small 'tricks' to show the default
>> signature in an email
>> - ...
>>
>> So I'm looking to other ways to have an interactions with Outlook.
>> What I basicly need to do is:
>> - Move the currently selected mail to a specific folder, and write the
>> data
>> of it to a database (subject, entryid, sender, recipients, attachments,
>> ..)
>> - Create a new mail with a specific text, receiver, subject,
>> attachements,
>> and once it is send move it to a specific folder and write the same data
>> to
>> the database
>>
>> These things actually do work, but especially the first one takes too
>> much
>> time: on some clients more than 10 seconds!!
>> Is their a way to speed things up? using CDO or Redemption or ...? What
>> are
>> the pros and cons of each way? Can they do what I need?
>>
>> Any help our hints would be really aprpeciated!
>>
>> Thanks a lot in advance,
>>
>> Pieter
>>
>>
>> I did it now like this:
>>
>>  Public Function AddDocMails(ByVal DocList As Generic.List(Of clsDoc)) As
>> String
>>         Dim oApp As Outlook.Application
>>         Dim oExp As Outlook.Explorer
>>         Dim oSel As Outlook.Selection   ' You need a selection object for
>> getting the selection.
>>         Dim oFolder As Outlook.MAPIFolder
>>         Dim oItem As Outlook.MailItem
>>
>>         Dim intGood As Integer = 0
>>         Dim intTotaal As Integer = 0
>>
>>         Try
>>             oApp = New Outlook.Application
>>             oExp = oApp.ActiveExplorer  ' Get the ActiveExplorer.
>>             oSel = oExp.Selection       ' Get the selection.
>>
>>             Dim intX As Integer
>>             Dim clsMail As clsDocMail
>>             oFolder = oExp.CurrentFolder
>>             intTotaal = oSel.Count
>>
>>             For intX = 1 To (oSel.Count)
>>                 Try
>>
>>                     If oSel.Item(intX).Class =
>> Outlook.OlObjectClass.olMail
>> Then
>>                         oItem = oSel.Item(intX)
>>                         clsMail = New clsDocMail(oItem, oFolder)
>>                         'save it!
>>                         clsMail.Save()
>>                     End If
>>                 Catch ex As Exception
>>                     ErrorMessage(ex, "Inner AddDocMails")
>>                 End Try
>>             Next
>>         Catch ex As Exception
>>             ErrorMessage(ex)
>>         End Try
>>
>>         oItem = Nothing
>>         oFolder = Nothing
>>         oSel = Nothing
>>         oExp = Nothing
>>         oApp = Nothing
>>
>>         Return strF
>>     End Function
>>
>>
>>     Public Sub New(ByVal ItemOutlook As Object, ByVal FolderOutlook As
>> Object)
>>         Me.New()
>>         Me.oItem = ItemOutlook
>>         Me.oFolder = FolderOutlook
>>
>>        Me.GetMailInfo()
>>     End Sub
>>
>>
>>     Public Function GetMailInfo(Optional ByVal blnMove As Boolean = True)
>> As
>> Boolean
>>         Dim blnOk As Boolean = True
>>
>>         Try
>>             If blnMove Then
>>                 Try
>>                     If (oFolder.StoreID <>
>> clsDocShared.GlobalDoc.MyOutlookFolder.StoreID) Or (oFolder.EntryID <>
>> clsDocShared.GlobalDoc.MyOutlookFolder.EntryID) Then
>>                         'Move it to the right folder: StoreID
>>                         oItem =
>> oItem.Move(clsDocShared.GlobalDoc.MyOutlookFolder)
>>                     End If
>>                 Catch ex As Exception
>>                     blnOk = False
>>                     Return blnOk
>>                     Exit Function
>>                 End Try
>>             End If
>>
>>             'FolderID
>>             Me.FolderID = clsDocShared.GlobalDoc.MyOutlookFolderID
>>             'FileLink = MailLink = EntryID
>>             Me.FileLink = oItem.EntryID
>>
>>             'From and to etc...
>>             Me.MailFrom = oItem.SenderName
>>             If oItem.To IsNot Nothing Then
>>                 Me.MailTo = oItem.To
>>             End If
>>
>>             If oItem.CC IsNot Nothing Then
>>                 Me.MailCC = oItem.CC
>>             End If
>>             If oItem.BCC IsNot Nothing Then
>>                 If Me.MailCC Is Nothing Then
>>                     Me.MailCC = ""
>>                 End If
>>                 If Me.MailCC.Length > 0 Then
>>                     Me.MailCC = Me.MailCC & ", "
>>                 End If
>>                 Me.MailCC = Me.MailCC & oItem.BCC
>>             End If
>>             If oItem.Subject IsNot Nothing Then
>>                 Me.MailSubject = oItem.Subject
>>             End If
>>
>>             Me.MailDate = oItem.ReceivedTime
>>            Me.AddDate = Me.MailDate
>>
>>             Dim intA As Integer
>>             'premier Type identification
>>             '?oitem.MessageClass =
>>           -> FAX
>>             '?oitem.MessageClass =
>>            -> MAIL
>>             Dim strI As String
>>             If oItem.MessageClass = "IPM.FAX" Then
>>                 'received
>>                 strI = "FAX"
>>             Else
>>                 strI = "MAIL"
>>             End If
>>             If (strI = "MAIL") And (oItem.Recipients.Count > 0) Then
>>                 If oItem.Recipients.Item(1).AddressEntry.Type.ToString =
>> "FAX" Then
>>                     'send
>>                     strI = "FAX"
>>                 ElseIf oItem.SenderName = "FAXINSDX" Then
>>                     'een fax wordt soms doorgemaild naar iemand!!!
>>                     strI = "FAX"
>>                 End If
>>             End If
>>             Me.MailType = strI
>>
>>             If oItem.Attachments.Count > 0 Then
>>                 Me.MailType = Me.MailType & ".ATTACHMENT"
>>                 Me.Attachments = ""
>>                 For intA = 1 To oItem.Attachments.Count
>>                     If intA > 1 Then
>>                         Me.Attachments = Me.Attachments & ", "
>>                     End If
>>                     Me.Attachments = Me.Attachments &
>> oItem.Attachments.Item(intA).FileName.ToString
>>                 Next
>>             End If
>>
>>             If oItem.FlagStatus = Outlook.OlFlagStatus.olFlagMarked Then
>>                 Me.Flag = "1"
>>             ElseIf oItem.FlagStatus = Outlook.OlFlagStatus.olFlagComplete
>> Then
>>                 Me.Flag = "2"
>>             End If
>>             If oItem.Importance = Outlook.OlImportance.olImportanceHigh
>> Then
>>                 Me.Flag = "1"
>>             End If
>>         Catch ex As Exception
>>             blnOk = False
>>             ErrorMessage(ex, "GetMailInfoDebug: " & strStatus)
>>         End Try
>>
>>         Return blnOk
>>     End Function
>>
>>
>>
>>

AddThis Social Bookmark Button