(MVC) MVC (2018)

MailKit/MimeKit - best eMail client.

In the past there was many good eMailClient - MailSystem.NET

, imapx, S22, aenetmail, but in my now opinion there are only one best eMail client - MailKit/MimeKit, https://www.nuget.org/packages/MailKit/. This is common documentation of this library http://www.mimekit.net/docs/html/Introduction.htm.

And below you can see mycode template to work with this library.


IMAP client, to receive eMail by IMAP.



This is a special client to receive two type of eMail: first type - with attachment (line 34-47), second type - simple mail (line 50-51).


   1:  Imports MailKit
   2:  Imports MailKit.Net.Imap
   3:  Imports MailKit.Net.Smtp
   4:  Imports MimeKit
   5:   
   6:  Public Delegate Sub ShowProcess(ProgressTXT As String)
   7:   
   8:  Public Class MyMailClient
   9:      Property Server As String
  10:      Property Port As Integer
  11:      Property Login As String
  12:      Property Password As String
  13:   
  14:      Public Sub New(Server1 As String, Port1 As Integer, Login1 As String, Password1 As String)
  15:          Server = Server1
  16:          Port = Port1
  17:          Login = Login1
  18:          Password = Password1
  19:      End Sub
  20:   
  21:      Public Sub SaveMessageFromInbox(Directory As String, FromDate As Date, ShowProcess As ShowProcess, DeleteAfterReaded As Boolean)
  22:          ShowProcess.Invoke("Start: " & Server)
  23:          Try
  24:              Using client = New ImapClient()
  25:                  client.ServerCertificateValidationCallback = Function(s, c, h, e) True
  26:                  client.Connect(Server, Port, True)
  27:                  client.Authenticate(Login, Password)
  28:                  Dim Inbox = client.Inbox
  29:                  Inbox.Open(FolderAccess.ReadWrite)
  30:                  For i As Integer = 0 To Inbox.Count - 1
  31:                      Dim Message = Inbox.GetMessage(i)
  32:                      If Message.Date >= FromDate Then
  33:                          If Message.Subject.Contains("Docket Alert:") Then
  34:                              ShowProcess.Invoke(Left(Message.Subject, 50))
  35:                              If Message.Attachments.Count > 0 Then
  36:                                  For Each Attachment As MimeEntity In Message.Attachments
  37:                                      Dim fileName = System.IO.Path.Combine(Directory, "Westlaw." & Attachment.ContentId & ".csv")
  38:                                      Using Stream = System.IO.File.Create(fileName)
  39:                                          If TypeOf Attachment Is MessagePart Then
  40:                                              Dim rfc822 = CType(Attachment, MessagePart)
  41:                                              rfc822.Message.WriteTo(Stream)
  42:                                          Else
  43:                                              Dim part = CType(Attachment, MimePart)
  44:                                              part.Content.DecodeTo(Stream)
  45:                                          End If
  46:                                      End Using
  47:                                  Next
  48:                              End If
  49:                          ElseIf Message.Subject.Contains("UniCourt Data Delivery") Then
  50:                              ShowProcess.Invoke(Left(Message.Subject, 50))
  51:                              My.Computer.FileSystem.WriteAllText(System.IO.Path.Combine(Directory, "UniCourt." & Message.MessageId & ".txt"), Message.TextBody, False)
  52:                          End If
  53:                      End If
  54:                      If DeleteAfterReaded Then
  55:                          Inbox.AddFlags(i, MessageFlags.Deleted, True)
  56:                      End If
  57:                  Next
  58:                  If DeleteAfterReaded Then
  59:                      client.Inbox.Expunge()
  60:                  End If
  61:                  client.Disconnect(True)
  62:                  ShowProcess.Invoke("Done: " & Server)
  63:              End Using
  64:          Catch ex As Exception
  65:              MsgBox(Server & vbCrLf & ex.Message)
  66:          End Try
  67:      End Sub

This is a way to execute this code. Another way to process email in many mailbox, please, see in page - BackgroundWorkerQueue. And pay attention. this is simple way without subscribing to mailbox changing.


 139:      Dim WithEvents BGW1 As BackgroundWorker
 140:      Dim BGW1_Prm As New Object
 141:      Dim WithEvents BGW2 As BackgroundWorker
 142:      Dim BGW2_Prm As New Object
 143:   
 144:      Private Sub ReadEmailButton_Click(sender As Object, e As EventArgs) Handles ReadEmailButton.Click
 145:          BGW1 = New BackgroundWorker
 146:          BGW1_Prm = New With {.Server = ServerTextBox1.Text, .Port = PortNumericUpDown1.Value, .Login = LoginTextBox1.Text, .Pass = PasswordTextBox1.Text, .DeleteAfterReaded = DeleteMailCheckBox.Checked}
 147:          BGW1.RunWorkerAsync(BGW1_Prm)
 148:      End Sub
 149:   
 150:      Private Sub BGW1_DoWork(sender As Object, e As DoWorkEventArgs) Handles BGW1.DoWork
 151:          Dim Box1 As New MyMailClient(e.Argument.Server, e.Argument.Port, e.Argument.Login, e.Argument.Pass)
 152:          Box1.SaveMessageFromInbox(SelectedTempPath, DateTimePickerBox1.Value, AddressOf UpdateLabel, e.Argument.DeleteAfterReaded)
 153:      End Sub
 154:   
 155:      Private Sub BGW1_RunWorkerCompleted(sender As Object, e As RunWorkerCompletedEventArgs) Handles BGW1.RunWorkerCompleted
 156:          BGW2 = New BackgroundWorker
 157:          BGW2_Prm = New With {.Server = ServerTextBox2.Text, .Port = PortNumericUpDown2.Value, .Login = LoginTextBox2.Text, .Pass = PasswordTextBox2.Text, .DeleteAfterReaded = DeleteMailCheckBox.Checked}
 158:          BGW2.RunWorkerAsync(BGW2_Prm)
 159:      End Sub
 160:   
 161:      Private Sub BGW2_DoWork(sender As Object, e As DoWorkEventArgs) Handles BGW2.DoWork
 162:          Dim Box1 As New MyMailClient(e.Argument.Server, e.Argument.Port, e.Argument.Login, e.Argument.Pass)
 163:          Box1.SaveMessageFromInbox(SelectedTempPath, DateTimePickerBox2.Value, AddressOf UpdateLabel, e.Argument.DeleteAfterReaded)
 164:      End Sub
 165:   
 166:      Private Sub BGW2_RunWorkerCompleted(sender As Object, e As RunWorkerCompletedEventArgs) Handles BGW2.RunWorkerCompleted
 ...:   

And this is a result of working this code.



Code template to send eMail by SMPT.



Commented lines is a alternative way to include attachment to mail body.


  70:      Public Sub SendMail(SendTo As String, Subject As String, Body As String, Optional AttachmentFileName As String = "")
  71:          Try
  72:              Using client = New SmtpClient()
  73:                  client.ServerCertificateValidationCallback = Function(s, c, h, e) True
  74:                  client.Connect(Server, Port, True)
  75:                  client.Authenticate(Login, Password)
  76:                  '
  77:                  Dim Message = New MimeMessage()
  78:                  Message.From.Add(New MailboxAddress(Login))
  79:                  Message.To.Add(New MailboxAddress(SendTo))
  80:                  Message.Subject = Subject
  81:                  Dim builder = New BodyBuilder()
  82:                  builder.TextBody = Body
  83:                  builder.Attachments.Add(AttachmentFileName)
  84:                  Message.Body = builder.ToMessageBody()
  85:                  '
  86:                  'Dim TxtBody = New TextPart(Body)
  87:                  'Dim Attachment = New MimePart("application/vnd.ms-excel")
  88:                  'Attachment.Content = New MimeContent(System.IO.File.OpenRead(AttachmentFileName))
  89:                  'Attachment.ContentDisposition = New ContentDisposition(ContentDisposition.Attachment)
  90:                  'Attachment.ContentTransferEncoding = ContentEncoding.Base64
  91:                  'Attachment.FileName = System.IO.Path.GetFileName(AttachmentFileName)
  92:                  'Dim Multipart = New Multipart("mixed")
  93:                  'Multipart.Add(TxtBody)
  94:                  'Multipart.Add(Attachment)
  95:                  'Message.Body = Multipart
  96:   
  97:                  client.Send(Message)
  98:                  client.Disconnect(True)
  99:              End Using
 100:          Catch ex As Exception
 101:              MsgBox(Server & vbCrLf & ex.Message)
 102:          End Try
 103:   
 104:      End Sub
 105:   
 106:  End Class

Execution is doing in the same way.


 554:      Dim WithEvents BGW4 As BackgroundWorker
 555:      Dim BGW4_Prm As New Object
 556:      Dim UnicourtAttachmentFileName As String
 557:      Private Sub SendResultButton_Click(sender As Object, e As EventArgs) Handles SendResultButton.Click
 558:          BGW4 = New BackgroundWorker
 559:          BGW4_Prm = New With {.Server = ServerTextBox3.Text, .Port = PortNumericUpDown3.Value, .Login = LoginTextBox3.Text, .Pass = PasswordTextBox3.Text, .SendTo = SendResultToTextBox.Text, .AttachmentFileName = UnicourtAttachmentFileName, .Subject = ResultSubjectTextBox.Text}
 560:          BGW4.RunWorkerAsync(BGW4_Prm)
 561:      End Sub
 562:   
 563:      Private Sub BGW4_DoWork(sender As Object, e As DoWorkEventArgs) Handles BGW4.DoWork
 564:          Dim Box1 As New MyMailClient(e.Argument.Server, e.Argument.Port, e.Argument.Login, e.Argument.Pass)
 565:          Box1.SendMail(e.Argument.SendTo, e.Argument.Subject, "", e.Argument.AttachmentFileName)
 566:      End Sub
 567:   
 568:      Private Sub BGW4_RunWorkerCompleted(sender As Object, e As RunWorkerCompletedEventArgs) Handles BGW4.RunWorkerCompleted



Comments ( )
Link to this page: //www.vb-net.com/eMailClient/index.htm
< THANKS ME>