Search The ForumSearch   RegisterRegister  LoginLogin

MailBee.NET POP3

 AfterLogic Forum : MailBee.NET POP3
Subject Topic: ASP.Net 3.5 Async Mutlipe Mailboxes Post ReplyPost New Topic
Author
Message << Prev Topic | Next Topic >>
opsoftware
Newbie
Newbie


Joined: 02 July 2012
Online Status: Offline
Posts: 5
Posted: 02 July 2012 at 1:02pm | IP Logged Quote opsoftware

I have a web based application that needs to access multiple mailboxes at the same time.

Once accessed all messages are downloaded and stored in an SQL database for use later.

I use the following at the moment:

Code:

Dim pop As New Pop3()
pop.BeginConnect(_pollHost, _pollPort, True, New AsyncCallback(AddressOf Pop3ConnectCallbackAndGetMessages), pop)


and

Code:

Dim pop As Pop3 = CType(result.AsyncState, Pop3)
' End the pending asynchronous connection request
pop.EndConnect()

pop.Login(_pollUser, _pollPass)

Dim msgs As MailMessageCollection = pop.DownloadEntireMessages()

For Each msg As MailMessage In msgs

'msg logic goes here

Next

pop.DeleteMessage(uids)
pop.Disconnect()



The issue is only the first mailbox is ever checked, i assume that it has something to do with the pop.EndConnect() at the start of the callback but then how can I get it to truely check mutliple mailboxes in different worker threads?

Many thanks for any help

Ozzie
Back to Top View opsoftware's Profile Search for other posts by opsoftware
 
Alex
AfterLogic Support
AfterLogic Support
Avatar

Joined: 19 November 2003
Online Status: Offline
Posts: 2206
Posted: 03 July 2012 at 3:38am | IP Logged Quote Alex

You need to create an array of Pop3 objects and issue BeginConnect for each of them in a loop. Each BeginConnect will create its own worker thread. This way, all of your mailboxes will be checked simultaneously (because BeginConnect returns immediately).

Regards,
Alex
Back to Top View Alex's Profile Search for other posts by Alex
 
opsoftware
Newbie
Newbie


Joined: 02 July 2012
Online Status: Offline
Posts: 5
Posted: 03 July 2012 at 7:38am | IP Logged Quote opsoftware

Hi Alex,

Thanks for the reply, apreciated.

Do you have an examples of the best way to create this array?

Currently I do a for each loop on data returned from an SQL query and within this loop I call the BeginConnect() method.

regards,

Ozzie
Back to Top View opsoftware's Profile Search for other posts by opsoftware
 
Alex
AfterLogic Support
AfterLogic Support
Avatar

Joined: 19 November 2003
Online Status: Offline
Posts: 2206
Posted: 03 July 2012 at 11:42am | IP Logged Quote Alex

No, we don't have such example. Actually, creating an array (or collection, list, it's not important how you'll store multiple objects) is quite a basic thing to write an example for it. Anyway, it's something like that (in C# syntax, for other .net langs the idea is the same):
Code:

Pop3[] arr = new Pop3[10]; // number of simult. threads you need
for (int i = 0; i < 10; i++)
{
  Pop3 pop = new Pop3();
  arr[ i ] = pop;
  pop.BeginConnect ...
}


That's how arrays of objects are created in .NET

Regards,
Alex
Back to Top View Alex's Profile Search for other posts by Alex
 
opsoftware
Newbie
Newbie


Joined: 02 July 2012
Online Status: Offline
Posts: 5
Posted: 04 July 2012 at 12:34am | IP Logged Quote opsoftware

Ahh OK, I thought it may have been something specific to MailBee did not think it would be as simple as that.

Thanks for the heads up much apreciated.

Ozzie
Back to Top View opsoftware's Profile Search for other posts by opsoftware
 
opsoftware
Newbie
Newbie


Joined: 02 July 2012
Online Status: Offline
Posts: 5
Posted: 09 July 2012 at 12:40pm | IP Logged Quote opsoftware

Hi Alex,

This is what I have come up with and does seem to work however when I debug the pop3 async callback I get the following error: There is already a connection in progress.

This would mean to me that a new thread is not being created can you see where I am going wrong with this?

Code:

Public Class PopObject
        Public Property Pop() As Pop3
            Get
                Return m_Pop
            End Get
            Set(value As Pop3)
                m_Pop = Value
            End Set
        End Property
        Private m_Pop As Pop3

        'ID of the POP3 Queue
        Public Property Pop3QId() As Integer
            Get
                Return m_Pop3QId
            End Get
            Set(value As Integer)
                m_Pop3QId = value
            End Set
        End Property
        Private m_Pop3QId As Integer

        'POP3 Server
        Public Property Pop3ServerName() As String
            Get
                Return m_Pop3ServerName
            End Get
            Set(value As String)
                m_Pop3ServerName = Value
            End Set
        End Property
        Private m_Pop3ServerName As String

        'POP3 Port
        Public Property Pop3Port() As Integer
            Get
                Return m_Pop3Port
            End Get
            Set(value As Integer)
                m_Pop3Port = Value
            End Set
        End Property
        Private m_Pop3Port As Integer

        'POP3 User
        Public Property Pop3UserName() As String
            Get
                Return m_Pop3UserName
            End Get
            Set(value As String)
                m_Pop3UserName = Value
            End Set
        End Property
        Private m_Pop3UserName As String

        'POP3 User Password
        Public Property Pop3Password() As String
            Get
                Return m_Pop3Password
            End Get
            Set(value As String)
                m_Pop3Password = Value
            End Set
        End Property
        Private m_Pop3Password As String

        'POP3 SSL?
        Public Property Pop3SSL() As Boolean
            Get
                Return m_Pop3SSL
            End Get
            Set(value As Boolean)
                m_Pop3SSL = value
            End Set
        End Property
        Private m_Pop3SSL As Boolean

        'POP3 Reply Email
        Public Property Pop3Email() As String
            Get
                Return m_Pop3Email
            End Get
            Set(value As String)
                m_Pop3Email = value
            End Set
        End Property
        Private m_Pop3Email As String

    End Class


Data Connection and Polling

Code:

Dim objConnection As SqlConnection
            Dim objDataAdapter As SqlDataAdapter

            'Set the license Key
            MailBee.Global.LicenseKey = "MN700-F73F40613F063F493F3BD64A2F3D-C92D"

            objConnection = New SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings("OPSDConnectionString").ConnectionString)
            objDataAdapter = New SqlDataAdapter("SELECT id, pollHost, pollPort, pollUser, pollPass, pollType, emailaddress, pollSSL FROM tbldepartment WHERE pollHost IS NOT NULL", objConnection)

            Try

                Dim ds As New DataSet()
                objDataAdapter.Fill(ds)

                For Each dr As DataRow In ds.Tables(0).Rows
                    
                    If dr("pollType") = 1 Then

                        'POP3
                        Dim pop As New Pop3()
                        Dim popObject As New PopObject()
                        If True Then
                            popObject.Pop = pop
                            popObject.Pop3QId = CInt(dr("id"))
                            popObject.Pop3ServerName = dr("pollHost").ToString()
                            popObject.Pop3Port = CInt(dr("pollPort"))
                            popObject.Pop3UserName = dr("pollUser").ToString()
                            popObject.Pop3Password = dr("pollPass").ToString()
                            popObject.Pop3SSL = CBool(dr("pollSSL"))
                            popObject.Pop3Email = dr("emailaddress").ToString()
                        End If

                        popObject.Pop.BeginConnect(popObject.Pop3ServerName, popObject.Pop3Port, True, New AsyncCallback(AddressOf Pop3ConnectCallbackAndGetMessages), popObject)

                    Else

                        'IMAP
                        Dim imap As New Imap()
                        Dim imapObject As New ImapObject()
                        If True Then
                            imapObject.Imap = imap
                            imapObject.ImapQId = CInt(dr("id"))
                            imapObject.ImapServerName = dr("pollHost").ToString()
                            imapObject.ImapPort = CInt(dr("pollPort"))
                            imapObject.ImapUserName = dr("pollUser").ToString()
                            imapObject.ImapPassword = dr("pollPass").ToString()
                            imapObject.ImapSSL = CBool(dr("pollSSL"))
                            imapObject.ImapEmail = dr("emailaddress").ToString()
                        End If

                        imapObject.Imap.BeginConnect(imapObject.ImapServerName, imapObject.ImapPort, Nothing, Nothing, New AsyncCallback(AddressOf ImapConnectCallbackAndGetMessages), imapObject)

                    End If

                Next

            Catch ex As Exception

                Elmah.ErrorSignal.FromCurrentContext().Raise(ex)

            Finally

                objDataAdapter.Dispose()
                objConnection.Close()
                objConnection.Dispose()


            End Try


POP3 Callback

Code:


Private Shared Sub Pop3ConnectCallbackAndGetMessages(ByVal result As IAsyncResult)

            Dim popObject As PopObject = CType(result.AsyncState, PopObject)

            ' End the pending asynchronous connection request
            'popObject.Pop.EndConnect()

            If popObject.Pop3SSL = True Then

                'Set SSL Mode to On
                popObject.Pop.SslMode = SslStartupMode.OnConnect

            End If

            Try
                'Supply username and password
                popObject.Pop.Login(popObject.Pop3UserName, popObject.Pop3Password) '<-- Error is triggered here

            Catch ex As Exception

                Elmah.ErrorSignal.FromCurrentContext().Raise(ex)

            End Try

            Try
End Sub


Emails are indeed polled, stored in the database and removed from the inbox, however the first connection is made and if I uncomment popObject.Pop.EndConnect() then the connection is closed and the second mailbox is polled instead.

This means that I am not creating a new thread and I cannot see where I am going wrong :-(

Thanks for any pointers you can give.

Regards,

Ozzie
Back to Top View opsoftware's Profile Search for other posts by opsoftware
 
Alex
AfterLogic Support
AfterLogic Support
Avatar

Joined: 19 November 2003
Online Status: Offline
Posts: 2206
Posted: 10 July 2012 at 4:48am | IP Logged Quote Alex

First of all, I don't see where you store your Pop3 objects. You create a new object each time the loop iterates and never store it in an array or collection. Garbage collector can remove these objects at any time then.

Also, you're not catching exception at popObject.Pop.EndConnect() line so the thread simply dies. Instead you should catch an exception to check what's going on there.

Regards,
Alex
Back to Top View Alex's Profile Search for other posts by Alex
 

If you wish to post a reply to this topic you must first login
If you are not already registered you must first register

  Post ReplyPost New Topic
Printable version Printable version

Forum Jump

Powered by Web Wiz Forums version 7.9
Copyright ©2001-2004 Web Wiz Guide