Imports DigitalData.Modules.Logging
Imports Limilabs.Mail
Imports Limilabs.Client.IMAP
Imports Limilabs.Client
Imports System.Net.Security
Imports System
Imports System.Security.Authentication
Public Class Limilab
Private Initialized As Boolean = False
Private LogConfig As LogConfig
Private Logger As DigitalData.Modules.Logging.Logger
Private IMAPServer As String
Private IMAPPort As Integer
Private User As String
Private Password As String
Private AuthType As String
Private ImapObject As Imap
Public Sub New(LogConfig As LogConfig)
LogConfig = LogConfig
Logger = LogConfig.GetLogger()
Logger.Info("Limilab initialized")
End Sub
Public Sub InitIMAP(oImapServer As String, oPort As Integer, oUser As String, oPassword As String, oAuthType As String, Optional Folder As String = "Inbox")
IMAPServer = oImapServer
IMAPPort = oPort
User = oUser
Password = oPassword
AuthType = oAuthType
Initialized = True
End Sub
'''
''' Tests connection to a given IMAP Server by connecting and doing a simple message query.
'''
''' IP-Address or Domainname of Server
''' IMAP-Port
''' IMAP-Username
''' IMAP-Password
''' The folder to fetch messages from. Defaults to `Inbox`
''' True if connection and query were successful. False otherwise.
Public Function IMAPTestLogin() As Boolean
Logger.Debug("Testing Login to Server {0}:{1} with user {2}", IMAPServer, IMAPPort, User)
If Initialized = False Then
Return False
End If
Try
Logger.Debug("Connecting...")
Dim oReturn As Boolean = ImapConnect()
If oReturn = True Then
ImapObject.Close()
End If
Return oReturn
Catch ex As Exception
Logger.Error(ex)
Return False
End Try
End Function
Private Function ImapConnect() As Boolean
Try
If Initialized = False Then
Return True
End If
Dim oReturnImap As New Imap()
If AuthType.EndsWith("TLS") Then
oReturnImap.SSLConfiguration.EnabledSslProtocols = SslProtocols.Tls12
' we will use custom validation
AddHandler oReturnImap.ServerCertificateValidate, AddressOf Validate
Logger.Debug("Connecting to IMAP-Server without port...")
oReturnImap.Connect(IMAPServer)
ElseIf AuthType = "SSL" Then
' we will use custom validation
AddHandler oReturnImap.ServerCertificateValidate, AddressOf Validate
Logger.Debug($"Connecting to IMAP-Server with port {IMAPPort}...")
oReturnImap.ConnectSSL(IMAPServer, IMAPPort)
ElseIf AuthType = "Simple" Then
End If
Logger.Debug(">> Connected to IMAP-Server!")
Dim oSupportsStartTLS As Boolean = oReturnImap.SupportedExtensions() _
.Contains(ImapExtension.StartTLS)
If oSupportsStartTLS And AuthType.EndsWith("TLS") Then
Logger.Debug("Server supports StartTLS, so starting...")
oReturnImap.StartTLS()
End If
Logger.Debug("Login with User and password...")
oReturnImap.UseBestLogin(User, Password)
Logger.Debug(">> Logged on!")
ImapObject = oReturnImap
Return True
Catch ex As Exception
Logger.Error(ex)
If Not IsNothing(ex.InnerException) Then
Logger.Warn("Inner Exception ImapConnect: " + ex.InnerException.Message)
End If
Return False
End Try
End Function
Private Sub Validate(
ByVal sender As Object,
ByVal e As ServerCertificateValidateEventArgs)
Const ignoredErrors As SslPolicyErrors =
SslPolicyErrors.RemoteCertificateChainErrors Or _ ' self-signed
SslPolicyErrors.RemoteCertificateNameMismatch ' name mismatch
Dim nameOnCertificate As String = e.Certificate.Subject
If (e.SslPolicyErrors And Not ignoredErrors) = SslPolicyErrors.None Then
e.IsValid = True
Return
End If
e.IsValid = False
End Sub
Public Function ImapGetMessageIDs() As List(Of Long)
Dim oListuids As New List(Of Long)
Try
ImapObject.SelectInbox()
oListuids = ImapObject.Search(Flag.Unseen)
Return oListuids
Catch ex As Exception
Logger.Error(ex)
Return oListuids
End Try
End Function
Public Function GetMessageUids(oImapServer As String, oPort As Integer, oUser As String, oPassword As String, oSSL As Boolean)
Try
Catch ex As Exception
End Try
End Function
Public Function DeleteMessageByUID(oUID As String) As Boolean
Try
ImapObject.DeleteMessageByUID(oUID)
Return True
Catch ex As Exception
Logger.Error(ex)
Return False
End Try
End Function
End Class