By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
446,280 Members | 2,125 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 446,280 IT Pros & Developers. It's quick & easy.

vb.net pop3 class

P: n/a
Dear sir,

I am writing a pop3 component myself.

After sending "RETR" command, I use below function to get the response from
Pop server. For some pop servers, it works ok, but some other pop servers
such as mailenable.com returns "+OK 2222 octets", followed by many white
space.

It seems that my function does not understand what the server is responsing
and return with all white space except the first line.

Does some one familiar with RFC standards and can point out what I did wrong
here.
Public Function GetResponse() As String
Dim Start As Double
Dim Tmr As Double
Dim bytes() As Byte
Start = Now.TimeOfDay.TotalSeconds
ReDim bytes(qqTcpClient.ReceiveBufferSize)
While Not qqNetworkStream.DataAvailable
Tmr = Now.TimeOfDay.TotalSeconds - Start
If Tmr > m_TimeOut Then
GetResponse = "TIMEOUT!"
Exit Function
End If
End While

If qqNetworkStream.DataAvailable Then
qqNetworkStream.Read(bytes, 0, CInt(qqTcpClient.ReceiveBufferSize))
GetResponse = System.Text.Encoding.ASCII.GetString(bytes)
Else
GetResponse = "TIMEOUT!"
Exit Function
End If
End Function
--
Kind regards

Guoqi Zheng
guoqi AT meetholland dot com
Http://www.meetholland.com

Nov 21 '05 #1
Share this Question
Share on Google+
2 Replies


P: n/a
Hi,

I converted this c# pop3 mail class to vb.net. Maybe this will
help.

http://www.programmersheaven.com/2/Art_CSharp_3

How to use

Dim mail As New Pop3Mail

mail.Connect("mail.xxxx.net", "user", "password")

For Each msg As Pop3Mail.Pop3Message In mail.List

Trace.WriteLine(DirectCast(mail.Retrieve(msg),
Pop3Mail.Pop3Message).message)

Next

The class

Imports System.Net.Sockets

Public Class Pop3Mail

Inherits System.Net.Sockets.TcpClient

Public Class Pop3Exception

Inherits System.ApplicationException
Public Sub New(ByVal str As String)

MyBase.New(str)
End Sub 'New

End Class 'Pop3Exception

Public Class Pop3Message

Public number As Long

Public bytes As Long

Public retrieved As Boolean

Public message As String

End Class 'Pop3Message

Public Overloads Sub Connect(ByVal server As String, ByVal username As
String, ByVal password As String)

Dim message As String

Dim strResponse As String

Connect(server, 110)

strResponse = Response()

If strResponse.Substring(0, 3) <> "+OK" Then

Throw New Pop3Exception(Response)

End If

message = "USER " + username + vbCr + vbLf

Write(message)

strResponse = Response()

If strResponse.Substring(0, 3) <> "+OK" Then

Throw New Pop3Exception(strResponse)

End If

message = "PASS " + password + vbCr + vbLf

Write(message)

strResponse = Response()

If strResponse.Substring(0, 3) <> "+OK" Then

Throw New Pop3Exception(strResponse)

End If

End Sub 'Connect

Public Sub Disconnect()

Dim message As String

Dim strResponse As String

message = "QUIT" + vbCr + vbLf

Write(message)

strResponse = Response()

If strResponse.Substring(0, 3) <> "+OK" Then

Throw New Pop3Exception(strResponse)

End If

End Sub 'Disconnect

Public Function List() As ArrayList

Dim message As String

Dim strResponse As String

Dim retval As New ArrayList

message = "LIST" + vbCr + vbLf

Write(message)

strResponse = Response()

If strResponse.Substring(0, 3) <> "+OK" Then

Throw New Pop3Exception(strResponse)

End If

While True

strResponse = Response()

If strResponse = "." & vbCr & vbLf Then

Return retval

Else

Dim msg As New Pop3Message

Dim seps As Char() = " ".ToCharArray

Dim values As String() = strResponse.Split(seps)

msg.number = Int32.Parse(values(0))

msg.bytes = Int32.Parse(values(1))

msg.retrieved = False

retval.Add(msg)

End If

End While

End Function 'List

Public Function Retrieve(ByVal rhs As Pop3Message) As Pop3Message

Dim message As String

Dim strResponse As String

Dim msg As New Pop3Message

msg.bytes = rhs.bytes

msg.number = rhs.number

message = "RETR " & rhs.number & vbCr & vbLf

Write(message)

strResponse = Response()

If strResponse.Substring(0, 3) <> "+OK" Then

Throw New Pop3Exception(strResponse)

End If

msg.retrieved = True

While True

strResponse = Response()

If strResponse = "." & vbCr & vbLf Then

Exit While

Else

msg.message += strResponse

End If

End While

Return msg

End Function 'Retrieve

Private Sub Write(ByVal message As String)

Dim en As New System.Text.ASCIIEncoding

Dim WriteBuffer(1023) As Byte

WriteBuffer = en.GetBytes(message)

Dim stream As NetworkStream = GetStream()

stream.Write(WriteBuffer, 0, WriteBuffer.Length)

Debug.WriteLine("WRITE:" + message)

End Sub 'Write

Public Sub Delete(ByVal rhs As Pop3Message)

Dim message As String

Dim strResponse As String

message = "DELE " & rhs.number & vbCr & vbLf

Write(message)

strResponse = Response()

If strResponse.Substring(0, 3) <> "+OK" Then

Throw New Pop3Exception(strResponse)

End If

End Sub 'Delete

Private Function Response() As String

Dim enc As New System.Text.ASCIIEncoding

Dim serverbuff() As Byte = New [Byte](1023) {}

Dim stream As NetworkStream = GetStream()

Dim count As Integer = 0

While True

Dim buff() As Byte = New [Byte](1) {}

Dim bytes As Integer = stream.Read(buff, 0, 1)

If bytes = 1 Then

serverbuff(count) = buff(0)

count += 1

If buff(0) = Asc(vbLf) Then

Exit While

End If

Else

Exit While

End If

End While

Dim retval As String = enc.GetString(serverbuff, 0, count)

Debug.WriteLine("READ:" + retval)

Return retval

End Function 'Response

End Class

Ken

---------------------------------

"Guoqi Zheng" <no@sorry.nl> wrote in message
news:O$***************@TK2MSFTNGP11.phx.gbl...
Dear sir,

I am writing a pop3 component myself.

After sending "RETR" command, I use below function to get the response from
Pop server. For some pop servers, it works ok, but some other pop servers
such as mailenable.com returns "+OK 2222 octets", followed by many white
space.

It seems that my function does not understand what the server is responsing
and return with all white space except the first line.

Does some one familiar with RFC standards and can point out what I did wrong
here.
Public Function GetResponse() As String
Dim Start As Double
Dim Tmr As Double
Dim bytes() As Byte
Start = Now.TimeOfDay.TotalSeconds
ReDim bytes(qqTcpClient.ReceiveBufferSize)
While Not qqNetworkStream.DataAvailable
Tmr = Now.TimeOfDay.TotalSeconds - Start
If Tmr > m_TimeOut Then
GetResponse = "TIMEOUT!"
Exit Function
End If
End While

If qqNetworkStream.DataAvailable Then
qqNetworkStream.Read(bytes, 0, CInt(qqTcpClient.ReceiveBufferSize))
GetResponse = System.Text.Encoding.ASCII.GetString(bytes)
Else
GetResponse = "TIMEOUT!"
Exit Function
End If
End Function
--
Kind regards

Guoqi Zheng
guoqi AT meetholland dot com
Http://www.meetholland.com


Nov 21 '05 #2

P: n/a
yes, very nice. thanks a lot.

Did you have an updated version which solve the problem of max 1024 bytes
already?

--
Kind regards

Guoqi Zheng
guoqi AT meetholland dot com
Http://www.meetholland.com

"Ken Tucker [MVP]" <vb***@bellsouth.net> wrote in message
news:uX**************@TK2MSFTNGP09.phx.gbl...
Hi,

I converted this c# pop3 mail class to vb.net. Maybe this will help.

http://www.programmersheaven.com/2/Art_CSharp_3

How to use

Dim mail As New Pop3Mail

mail.Connect("mail.xxxx.net", "user", "password")

For Each msg As Pop3Mail.Pop3Message In mail.List

Trace.WriteLine(DirectCast(mail.Retrieve(msg),
Pop3Mail.Pop3Message).message)

Next

The class

Imports System.Net.Sockets

Public Class Pop3Mail

Inherits System.Net.Sockets.TcpClient

Public Class Pop3Exception

Inherits System.ApplicationException
Public Sub New(ByVal str As String)

MyBase.New(str)
End Sub 'New

End Class 'Pop3Exception

Public Class Pop3Message

Public number As Long

Public bytes As Long

Public retrieved As Boolean

Public message As String

End Class 'Pop3Message

Public Overloads Sub Connect(ByVal server As String, ByVal username As
String, ByVal password As String)

Dim message As String

Dim strResponse As String

Connect(server, 110)

strResponse = Response()

If strResponse.Substring(0, 3) <> "+OK" Then

Throw New Pop3Exception(Response)

End If

message = "USER " + username + vbCr + vbLf

Write(message)

strResponse = Response()

If strResponse.Substring(0, 3) <> "+OK" Then

Throw New Pop3Exception(strResponse)

End If

message = "PASS " + password + vbCr + vbLf

Write(message)

strResponse = Response()

If strResponse.Substring(0, 3) <> "+OK" Then

Throw New Pop3Exception(strResponse)

End If

End Sub 'Connect

Public Sub Disconnect()

Dim message As String

Dim strResponse As String

message = "QUIT" + vbCr + vbLf

Write(message)

strResponse = Response()

If strResponse.Substring(0, 3) <> "+OK" Then

Throw New Pop3Exception(strResponse)

End If

End Sub 'Disconnect

Public Function List() As ArrayList

Dim message As String

Dim strResponse As String

Dim retval As New ArrayList

message = "LIST" + vbCr + vbLf

Write(message)

strResponse = Response()

If strResponse.Substring(0, 3) <> "+OK" Then

Throw New Pop3Exception(strResponse)

End If

While True

strResponse = Response()

If strResponse = "." & vbCr & vbLf Then

Return retval

Else

Dim msg As New Pop3Message

Dim seps As Char() = " ".ToCharArray

Dim values As String() = strResponse.Split(seps)

msg.number = Int32.Parse(values(0))

msg.bytes = Int32.Parse(values(1))

msg.retrieved = False

retval.Add(msg)

End If

End While

End Function 'List

Public Function Retrieve(ByVal rhs As Pop3Message) As Pop3Message

Dim message As String

Dim strResponse As String

Dim msg As New Pop3Message

msg.bytes = rhs.bytes

msg.number = rhs.number

message = "RETR " & rhs.number & vbCr & vbLf

Write(message)

strResponse = Response()

If strResponse.Substring(0, 3) <> "+OK" Then

Throw New Pop3Exception(strResponse)

End If

msg.retrieved = True

While True

strResponse = Response()

If strResponse = "." & vbCr & vbLf Then

Exit While

Else

msg.message += strResponse

End If

End While

Return msg

End Function 'Retrieve

Private Sub Write(ByVal message As String)

Dim en As New System.Text.ASCIIEncoding

Dim WriteBuffer(1023) As Byte

WriteBuffer = en.GetBytes(message)

Dim stream As NetworkStream = GetStream()

stream.Write(WriteBuffer, 0, WriteBuffer.Length)

Debug.WriteLine("WRITE:" + message)

End Sub 'Write

Public Sub Delete(ByVal rhs As Pop3Message)

Dim message As String

Dim strResponse As String

message = "DELE " & rhs.number & vbCr & vbLf

Write(message)

strResponse = Response()

If strResponse.Substring(0, 3) <> "+OK" Then

Throw New Pop3Exception(strResponse)

End If

End Sub 'Delete

Private Function Response() As String

Dim enc As New System.Text.ASCIIEncoding

Dim serverbuff() As Byte = New [Byte](1023) {}

Dim stream As NetworkStream = GetStream()

Dim count As Integer = 0

While True

Dim buff() As Byte = New [Byte](1) {}

Dim bytes As Integer = stream.Read(buff, 0, 1)

If bytes = 1 Then

serverbuff(count) = buff(0)

count += 1

If buff(0) = Asc(vbLf) Then

Exit While

End If

Else

Exit While

End If

End While

Dim retval As String = enc.GetString(serverbuff, 0, count)

Debug.WriteLine("READ:" + retval)

Return retval

End Function 'Response

End Class

Ken

---------------------------------

"Guoqi Zheng" <no@sorry.nl> wrote in message
news:O$***************@TK2MSFTNGP11.phx.gbl...
Dear sir,

I am writing a pop3 component myself.

After sending "RETR" command, I use below function to get the response from Pop server. For some pop servers, it works ok, but some other pop servers
such as mailenable.com returns "+OK 2222 octets", followed by many white
space.

It seems that my function does not understand what the server is responsing and return with all white space except the first line.

Does some one familiar with RFC standards and can point out what I did wrong here.
Public Function GetResponse() As String
Dim Start As Double
Dim Tmr As Double
Dim bytes() As Byte
Start = Now.TimeOfDay.TotalSeconds
ReDim bytes(qqTcpClient.ReceiveBufferSize)
While Not qqNetworkStream.DataAvailable
Tmr = Now.TimeOfDay.TotalSeconds - Start
If Tmr > m_TimeOut Then
GetResponse = "TIMEOUT!"
Exit Function
End If
End While

If qqNetworkStream.DataAvailable Then
qqNetworkStream.Read(bytes, 0, CInt(qqTcpClient.ReceiveBufferSize)) GetResponse = System.Text.Encoding.ASCII.GetString(bytes)
Else
GetResponse = "TIMEOUT!"
Exit Function
End If
End Function
--
Kind regards

Guoqi Zheng
guoqi AT meetholland dot com
Http://www.meetholland.com

Nov 21 '05 #3

This discussion thread is closed

Replies have been disabled for this discussion.