|
dev
newsgroups
|
|||||||||||||||||||||||
|
|||||||||||||||||||||||
Waht is the fastest/bets? Outlook Object/CDO/Redemption/...?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 = 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 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. -- Show quoteEric 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 = > 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 > > > > 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 = >> 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 >> >> >> >> |
|||||||||||||||||||||||