Ngôn ngữ lập trình: VB .NET (Console)
Tác giả: Sưu tầm
Chức năng: Nhận mail từ tất cả các cổng như IMAp, POP3,...
- Imports System.Net.Sockets
- Imports System.Text
- Public Module MailTest
- Public Sub Main()
- Dim Server, Name, Password As String
- 'Mặc định là POP3
- Console.Write("Input POP3 Server: ")
- Server = Console.ReadLine()
- Console.Write("Input Mail name: ")
- Name = Console.ReadLine()
- Console.Write("Password: ")
- Password = Console.ReadLine()
- Console.WriteLine()
- Dim POP3 As New Pop3Client
- POP3.Connect(Server, Name, Password)
- Dim Messages() As MessageHeader = POP3.GetMessageList()
- Console.WriteLine(Messages.Length().ToString() & " messages.")
- Dim Message As MessageHeader
- For Each Message In Messages
- Console.WriteLine(New String("-"c, 60))
- Console.WriteLine("Message Number: " & Message.Number.ToString())
- Console.WriteLine("Size: " & Message.Size.ToString())
- Console.WriteLine()
- Console.WriteLine(POP3.GetMessageContent(Message.Number))
- Console.WriteLine(New String("-"c, 60))
- Console.WriteLine()
- Next
- Console.WriteLine("Press Enter to disconnect.")
- Console.ReadLine()
- POP3.Disconnect()
- End Sub
- End Module
- Public Class Pop3Client
- Inherits System.ComponentModel.Component
- Private Client As New TcpClient
- Private Stream As NetworkStream
- Private _Connected As Boolean = False
- Public ReadOnly Property Connected() As Boolean
- Get
- Return _Connected
- End Get
- End Property
- Private Class Commands
- Public Const List As String = "LIST" & vbNewLine
- Public Const User As String = "USER "
- Public Const Password As String = "PASS "
- Public Const Delete As String = "DELE "
- Public Const GetMessage As String = "RETR "
- Public Const Quit As String = "QUIT" & vbNewLine
- Public Const ServerConfirm As String = "+OK"
- Public Const ServerNoMoreData As String = "."
- End Class
- Public Sub Connect(ByVal serverName As String, ByVal userName As String, ByVal password As String)
- If Connected Then Me.Disconnect()
- Client.Connect(serverName, 110) 'POP3 port
- 'Các port mail
- 'POP3 - port 110
- 'IMAP - port 143
- 'SMTP - port 25
- 'HTTP - port 80
- 'Secure SMTP (SSMTP) - port 465
- 'Secure IMAP (IMAP4-SSL) - port 585
- 'IMAP4 over SSL (IMAPS) - port 993
- 'Secure POP3 (SSL-POP) - port 995
- Stream = Client.GetStream()
- CheckResponse(GetResponse())
- Send(Commands.User & userName & vbNewLine)
- CheckResponse(GetResponse())
- Send(Commands.Password & password & vbNewLine)
- CheckResponse(GetResponse())
- _Connected = True
- End Sub
- Public Sub Disconnect()
- If Connected Then
- Send(Commands.Quit)
- CheckResponse(GetResponse())
- _Connected = False
- End If
- End Sub
- Public Function GetMessageList() As MessageHeader()
- If Not Connected Then Throw New InvalidOperationException("Not connected.")
- Send(Commands.List)
- CheckResponse(GetResponse())
- Dim Messages As New ArrayList
- Do
- Dim Response As String = GetResponse()
- If Response = Commands.ServerNoMoreData Then
- Return CType(Messages.ToArray(GetType(MessageHeader)), MessageHeader())
- Else
- Dim Values() As String = Response.Split()
- Dim Message As New MessageHeader(Int32.Parse(Values(0)), Int32.Parse(Values(1)))
- Messages.Add(Message)
- End If
- Loop
- End Function
- Public Function GetMessageContent(ByVal messageNumber As Integer) As String
- If Not Connected Then Throw New InvalidOperationException("Not connected.")
- Send(Commands.GetMessage & messageNumber.ToString() & vbNewLine)
- CheckResponse(GetResponse)
- Dim Line, Content As String
- Do
- Line = GetResponse()
- If Line = Commands.ServerNoMoreData Then
- Return Content
- Else
- Content &= Line & vbNewLine
- End If
- Loop
- End Function
- Public Sub DeleteMessage(ByVal messageNumber As Integer)
- If Not Connected Then Throw New InvalidOperationException("Not connected.")
- Send(Commands.Delete & messageNumber.ToString() & vbNewLine)
- CheckResponse(GetResponse())
- End Sub
- Private Sub Send(ByVal message As String)
- Dim MessageBytes() As Byte = Encoding.ASCII.GetBytes(message)
- Stream.Write(MessageBytes, 0, MessageBytes.Length)
- Debug.WriteLine(message)
- End Sub
- Private Function GetResponse() As String
- Dim Character, Response As String
- Do
- Character = Chr(Stream.ReadByte()).ToString()
- Response &= Character
- Loop Until Character = Chr(13)
- Response = Response.Trim(New Char() {Chr(13), Chr(10)})
- Debug.WriteLine(Response)
- Return Response
- End Function
- Private Sub CheckResponse(ByVal response As String)
- If Not (response.Substring(0, 3) = Commands.ServerConfirm) Then
- Client.Close()
- _Connected = False
- Throw New ApplicationException("Response " & response & " not expected.")
- End If
- End Sub
- Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
- If disposing Then Disconnect()
- MyBase.Dispose(disposing)
- End Sub
- End Class
- Public Class MessageHeader
- Private _Number As Integer
- Private _Size As Integer
- Public ReadOnly Property Number() As Integer
- Get
- Return _Number
- End Get
- End Property
- Public ReadOnly Property Size() As Integer
- Get
- Return _Size
- End Get
- End Property
- Public Sub New(ByVal number As Integer, ByVal size As Integer)
- Me._Number = number
- Me._Size = size
- End Sub
- End Class