P
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
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