Pop3 Email Client : Smtp Email « Socket Network « VB.Net Tutorial






Pop3 Email Client
' Quote from Book
' Visual Basic.net Programming
' Publisher Water Publisher
' China, Beijing


Imports System.Net
Imports System.Net.Sockets
Imports System.Text
Imports System.IO
Imports System.Threading

Imports System.Windows.Forms

public class Pop3Receive
   public Shared Sub Main
        Application.Run(New Form1)
   End Sub
End class

Public Class Form1 : Inherits System.Windows.Forms.Form

    Public Sub New()
        MyBase.New()

        InitializeComponent()
    End Sub

    Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
        If disposing Then
            If Not (components Is Nothing) Then
                components.Dispose()
            End If
        End If
        MyBase.Dispose(disposing)
    End Sub

    Private components As System.ComponentModel.IContainer

    Friend WithEvents txtMailContent As System.Windows.Forms.TextBox
    Friend WithEvents btnMailReceive As System.Windows.Forms.Button
    Friend WithEvents Label1 As System.Windows.Forms.Label
    Friend WithEvents Label2 As System.Windows.Forms.Label
    Friend WithEvents Label3 As System.Windows.Forms.Label
    Friend WithEvents Label4 As System.Windows.Forms.Label
    Friend WithEvents txtID As System.Windows.Forms.TextBox
    Friend WithEvents txtPassWord As System.Windows.Forms.TextBox
    Friend WithEvents txtServer As System.Windows.Forms.TextBox
    Friend WithEvents txtPort As System.Windows.Forms.TextBox
    Friend WithEvents lstMailList As System.Windows.Forms.ListBox
    Friend WithEvents Label5 As System.Windows.Forms.Label
    Friend WithEvents txtNumber As System.Windows.Forms.TextBox
    Friend WithEvents Label6 As System.Windows.Forms.Label
    Friend WithEvents txtSize As System.Windows.Forms.TextBox
    Friend WithEvents btnDelete As System.Windows.Forms.Button
    Friend WithEvents btnQUIT As System.Windows.Forms.Button
    <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
        Me.lstMailList = New System.Windows.Forms.ListBox()
        Me.txtMailContent = New System.Windows.Forms.TextBox()
        Me.txtID = New System.Windows.Forms.TextBox()
        Me.txtServer = New System.Windows.Forms.TextBox()
        Me.txtPort = New System.Windows.Forms.TextBox()
        Me.txtPassWord = New System.Windows.Forms.TextBox()
        Me.btnMailReceive = New System.Windows.Forms.Button()
        Me.Label1 = New System.Windows.Forms.Label()
        Me.Label2 = New System.Windows.Forms.Label()
        Me.Label3 = New System.Windows.Forms.Label()
        Me.Label4 = New System.Windows.Forms.Label()
        Me.Label5 = New System.Windows.Forms.Label()
        Me.txtNumber = New System.Windows.Forms.TextBox()
        Me.txtSize = New System.Windows.Forms.TextBox()
        Me.Label6 = New System.Windows.Forms.Label()
        Me.btnDelete = New System.Windows.Forms.Button()
        Me.btnQUIT = New System.Windows.Forms.Button()
        Me.SuspendLayout()
        '
        'lstMailList
        '
        Me.lstMailList.ItemHeight = 12
        Me.lstMailList.Location = New System.Drawing.Point(20, 48)
        Me.lstMailList.Name = "lstMailList"
        Me.lstMailList.Size = New System.Drawing.Size(666, 112)
        Me.lstMailList.TabIndex = 8
        '
        'txtMailContent
        '
        Me.txtMailContent.Location = New System.Drawing.Point(20, 176)
        Me.txtMailContent.Multiline = True
        Me.txtMailContent.Name = "txtMailContent"
        Me.txtMailContent.ScrollBars = System.Windows.Forms.ScrollBars.Both
        Me.txtMailContent.Size = New System.Drawing.Size(666, 344)
        Me.txtMailContent.TabIndex = 9
        Me.txtMailContent.Text = ""
        '
        'txtID
        '
        Me.txtID.Location = New System.Drawing.Point(727, 40)
        Me.txtID.Name = "txtID"
        Me.txtID.Size = New System.Drawing.Size(164, 21)
        Me.txtID.TabIndex = 0
        Me.txtID.Text = ""
        '
        'txtServer
        '
        Me.txtServer.Location = New System.Drawing.Point(727, 200)
        Me.txtServer.Name = "txtServer"
        Me.txtServer.Size = New System.Drawing.Size(164, 21)
        Me.txtServer.TabIndex = 3
        Me.txtServer.Text = ""
        '
        'txtPort
        '
        Me.txtPort.Location = New System.Drawing.Point(727, 144)
        Me.txtPort.Name = "txtPort"
        Me.txtPort.Size = New System.Drawing.Size(164, 21)
        Me.txtPort.TabIndex = 2
        Me.txtPort.Text = "110"
        '
        'txtPassWord
        '
        Me.txtPassWord.Location = New System.Drawing.Point(727, 93)
        Me.txtPassWord.Name = "txtPassWord"
        Me.txtPassWord.PasswordChar = Microsoft.VisualBasic.ChrW(42)
        Me.txtPassWord.Size = New System.Drawing.Size(164, 21)
        Me.txtPassWord.TabIndex = 1
        Me.txtPassWord.Text = ""
        '
        'btnMailReceive
        '
        Me.btnMailReceive.Location = New System.Drawing.Point(727, 240)
        Me.btnMailReceive.Name = "btnMailReceive"
        Me.btnMailReceive.Size = New System.Drawing.Size(164, 24)
        Me.btnMailReceive.TabIndex = 6
        Me.btnMailReceive.Text = "Check Mail"
        '
        'Label1
        '
        Me.Label1.Location = New System.Drawing.Point(727, 16)
        Me.Label1.Name = "Label1"
        Me.Label1.Size = New System.Drawing.Size(143, 16)
        Me.Label1.TabIndex = 7
        Me.Label1.Text = "Account"
        '
        'Label2
        '
        Me.Label2.Location = New System.Drawing.Point(727, 176)
        Me.Label2.Name = "Label2"
        Me.Label2.Size = New System.Drawing.Size(143, 16)
        Me.Label2.TabIndex = 8
        Me.Label2.Text = "Server"
        '
        'Label3
        '
        Me.Label3.Location = New System.Drawing.Point(727, 128)
        Me.Label3.Name = "Label3"
        Me.Label3.Size = New System.Drawing.Size(143, 16)
        Me.Label3.TabIndex = 9
        Me.Label3.Text = "port"
        '
        'Label4
        '
        Me.Label4.Location = New System.Drawing.Point(727, 72)
        Me.Label4.Name = "Label4"
        Me.Label4.Size = New System.Drawing.Size(143, 16)
        Me.Label4.TabIndex = 10
        Me.Label4.Text = "Password"
        '
        'Label5
        '
        Me.Label5.Location = New System.Drawing.Point(730, 275)
        Me.Label5.Name = "Label5"
        Me.Label5.Size = New System.Drawing.Size(153, 13)
        Me.Label5.TabIndex = 11
        Me.Label5.Text = "Total"
        '
        'txtNumber
        '
        Me.txtNumber.Location = New System.Drawing.Point(730, 299)
        Me.txtNumber.Name = "txtNumber"
        Me.txtNumber.Size = New System.Drawing.Size(153, 21)
        Me.txtNumber.TabIndex = 4
        Me.txtNumber.Text = ""
        '
        'txtSize
        '
        Me.txtSize.Location = New System.Drawing.Point(731, 355)
        Me.txtSize.Name = "txtSize"
        Me.txtSize.Size = New System.Drawing.Size(153, 21)
        Me.txtSize.TabIndex = 5
        Me.txtSize.Text = ""
        '
        'Label6
        '
        Me.Label6.Location = New System.Drawing.Point(731, 331)
        Me.Label6.Name = "Label6"
        Me.Label6.Size = New System.Drawing.Size(153, 13)
        Me.Label6.TabIndex = 13
        Me.Label6.Text = "Size(k)"
        '
        'btnDelete
        '
        Me.btnDelete.Location = New System.Drawing.Point(492, 8)
        Me.btnDelete.Name = "btnDelete"
        Me.btnDelete.Size = New System.Drawing.Size(194, 24)
        Me.btnDelete.TabIndex = 7
        Me.btnDelete.Text = "Delete"
        '
        'btnQUIT
        '
        Me.btnQUIT.Location = New System.Drawing.Point(732, 395)
        Me.btnQUIT.Name = "btnQUIT"
        Me.btnQUIT.Size = New System.Drawing.Size(164, 24)
        Me.btnQUIT.TabIndex = 6
        Me.btnQUIT.Text = "Quit"
        '
        'Form1
        '
        Me.AutoScaleBaseSize = New System.Drawing.Size(6, 14)
        Me.ClientSize = New System.Drawing.Size(911, 533)
        Me.Controls.AddRange(New System.Windows.Forms.Control() {Me.btnQUIT, Me.btnDelete, Me.txtSize, Me.Label6, Me.txtNumber, Me.Label5, Me.Label4, Me.Label3, Me.Label2, Me.Label1, Me.btnMailReceive, Me.txtPassWord, Me.txtPort, Me.txtServer, Me.txtID, Me.txtMailContent, Me.lstMailList})
        Me.Name = "Form1"
        Me.Text = "Form1"
        Me.ResumeLayout(False)

    End Sub

    Dim myTcpClient As New TcpClient()
    Dim myNetworkStream As NetworkStream
    Dim blnDelete As Boolean = False

    Private Sub btnMailReceive_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnMailReceive.Click

        Dim strMessage
        ConnectToMailServer()
        Dim t As New Thread(AddressOf GetMailNumber)
        t.Start()
    End Sub

    Public Sub ConnectToMailServer()
        Try
            Dim strReturnMessage As String

            myTcpClient.Connect(txtServer.Text, Integer.Parse(txtPort.Text))
            myNetworkStream = myTcpClient.GetStream()
            Dim myStreamReader As New StreamReader(myNetworkStream)

            strReturnMessage = myStreamReader.ReadLine() + vbCrLf
            strReturnMessage += SendCommand(myNetworkStream, "USER " + txtID.Text) + vbCrLf
            strReturnMessage += SendCommand(myNetworkStream, "PASS " + txtPassWord.Text) + vbCrLf
            MessageBox.Show(strReturnMessage)
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
    End Sub

    Private Sub GetMailNumber()
        Dim strMessage(2) As String
        Dim strMessageLine As String

        strMessageLine = SendCommand(myNetworkStream, "STAT")
        strMessage = strMessageLine.Split(" ")

        txtNumber.Text = strMessage(1)
        txtSize.Text = (Long.Parse(strMessage(2)) / 1000).ToString
        GetMailList(Long.Parse(strMessage(1)))

    End Sub

    Private Sub GetMailList(ByVal lngNumber As Long)
        Dim strReturnMessage As String
        Dim lngLoop As Long
        Dim lngIndex As Long
        Try
            For lngLoop = 0 To lngNumber - 1
                lngIndex = lngLoop + 1
                strReturnMessage = "[" + lngIndex.ToString + "]" + SendCommand(myNetworkStream, "LIST " + lngIndex.ToString)

                lstMailList.Items.Add(strReturnMessage)
            Next
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
    End Sub

    Private Function SendCommand(ByRef pNetStream As NetworkStream, ByVal pstrCommand As String) As String
        Try
            Dim strCommand = pstrCommand + vbCrLf
            Dim bteCommand() As Byte = Encoding.ASCII.GetBytes(strCommand)

            Dim myStreamReader As StreamReader
            Dim sstrLine As String
            Dim strLine As String

            pNetStream.Write(bteCommand, 0, bteCommand.Length)
            myStreamReader = New StreamReader(pNetStream)
            strLine = myStreamReader.ReadLine()
            Return strLine

        Catch ex As Exception
            Return ex.Message
        End Try
    End Function

    Private Sub lstMailList_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles lstMailList.SelectedIndexChanged
        If blnDelete = False Then
            Dim t As New Thread(AddressOf GetMessage)
            t.Start()
        End If
    End Sub

    Private Sub GetMessage()
        Dim strMessageContent As String = ""

        Dim intRead As Integer

        Dim strCommand = "RETR " + (lstMailList.SelectedIndex + 1).ToString + vbCrLf
        Dim bteCommand() As Byte = Encoding.ASCII.GetBytes(strCommand)
        Dim myStreamReader As StreamReader


        txtMailContent.Text = ""
        Try
            myNetworkStream.Write(bteCommand, 0, bteCommand.Length)
            myStreamReader = New StreamReader(myNetworkStream)
            AnalyMessage(myStreamReader)
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try


    End Sub

    Private Sub AnalyMessage(ByVal pStreamReader As StreamReader)
        Dim strReadLine As String = ""
        Dim sstrReadLine As String = ""

        Do While (sstrReadLine = Nothing Or sstrReadLine.Length = 0)
            sstrReadLine = pStreamReader.ReadLine
        Loop

        txtMailContent.Text += vbCrLf + "--- Header --" + vbCrLf

        Do While sstrReadLine.Trim.Length <> 0
            sstrReadLine = pStreamReader.ReadLine
            txtMailContent.Text += vbCrLf + sstrReadLine
        Loop

        txtMailContent.Text += vbCrLf + "--- Body --" + vbCrLf

        Do
            sstrReadLine = pStreamReader.ReadLine
            If sstrReadLine.Trim() = "." Then Exit Do
            If sstrReadLine <> Nothing Then txtMailContent.Text += vbCrLf + sstrReadLine
        Loop

    End Sub

    Private Sub btnDelete_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDelete.Click
        Dim strReturnMessage As String
        Dim intDelete As Integer
        intDelete = lstMailList.SelectedIndex + 1
        Try
            strReturnMessage = SendCommand(myNetworkStream, "DELE " + intDelete.ToString)
            txtMailContent.Text = strReturnMessage
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
        blnDelete = True
        lstMailList.Items.RemoveAt(intDelete - 1)
        blnDelete = False
    End Sub

    Private Sub btnQUIT_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnQUIT.Click
        Dim strReturnMessage As String
        Try
            strReturnMessage = SendCommand(myNetworkStream, "QUIT")
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try


    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    End Sub
End Class








22.23.Smtp Email
22.23.1.Send Email by SmtpMail
22.23.2.Socket based SMTP clientSocket based SMTP client
22.23.3.SMTP based on TcpClientSMTP based on TcpClient
22.23.4.Pop3 Email ClientPop3 Email Client