Imports DigitalData.Modules.Logging Imports Limilabs.Mail Imports Limilabs.Client.IMAP Imports Limilabs.Client.SMTP Imports Limilabs.Client Imports System.Net.Security Imports System Imports System.Security.Authentication Imports Limilabs.Mail.Headers Imports Limilabs.Mail.MIME 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 ErrorMessage As String Public Sub New(LogConfig As LogConfig) LogConfig = LogConfig Logger = LogConfig.GetLogger() Logger.Info("Limilab initialized") End Sub ''' ''' Initializes the module. ''' ''' IP-Address or Domainname of Server ''' IMAP-Port ''' IMAP-Username ''' IMAP-Password ''' Auth-Type ''' The folder to fetch messages from. Defaults to `Inbox` 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. ''' ''' 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) ErrorMessage = ex.Message 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() AddHandler oReturnImap.ServerCertificateValidate, AddressOf Validate Logger.Debug($"AUTH_TYPE [{AuthType}]") If AuthType = "SSL/TLS" Then If IMAPPort <> "993" Then Logger.Debug($"Connecting with explizit port [{IMAPPort}]") oReturnImap.Connect(IMAPServer, IMAPPort) Else Logger.Debug("Connecting to IMAP-Server without port...") oReturnImap.ConnectSSL(IMAPServer) End If Logger.Debug($"Connect to [{IMAPServer}] successful!") 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() Else Logger.Info("Server supports no StartTLS") oReturnImap.SSLConfiguration.EnabledSslProtocols = SslProtocols.Tls12 End If ElseIf AuthType = "SSL" Then If IMAPPort <> "993" Then Logger.Debug($"Connecting with explizit port [{IMAPPort}]") oReturnImap.Connect(IMAPServer, IMAPPort) Else Logger.Debug("Connecting to IMAP-Server without port...") oReturnImap.ConnectSSL(IMAPServer) End If ElseIf AuthType = "Simple" Then End If Logger.Debug(">> Connected to IMAP-Server!") 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) ErrorMessage = ex.Message 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) ErrorMessage = ex.Message Return oListuids 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) ErrorMessage = ex.Message Return False End Try End Function ''' ''' Creates a MailObject and sends Mail via smtp. ''' ''' True if Message was send. False otherwise. Public Function NewSMTPEmail(mailto As String, mailSubject As String, mailBody As String, mailfrom As String, mailsmtp As String, mailport As Integer, mailUser As String, mailPW As String, AUTH_TYPE As String, SENDER_INSTANCE As String, ADDED_DATETIME As String, Optional attachmentString As String = "", Optional Test As Boolean = False) Try Dim oError As Boolean = False Dim oReceipiants As String() If mailto.Contains(";") Then oReceipiants = mailto.Split(";") Else ReDim Preserve oReceipiants(0) oReceipiants(0) = mailto End If For Each oMailReceipiant As String In oReceipiants Logger.Debug($"oMailReceipiant [{oMailReceipiant}]") Logger.Debug($"mailsmtp [{mailsmtp}]") Logger.Debug($"mailport [{mailport}]") Logger.Debug($"mailSubject [{mailSubject}]") Dim oMailBuilder As New MailBuilder() oMailBuilder.From.Add(New MailBox(mailfrom)) oMailBuilder.[To].Add(New MailBox(oMailReceipiant)) oMailBuilder.Subject = mailSubject If ADDED_DATETIME <> "" Then mailBody &= "

Creation-time: " & ADDED_DATETIME End If If Test = True Then oMailBuilder.Html = $"This is a Testmail!

The body-text will be replaced within profile!

mailsmtp: {mailsmtp}
mailport: {mailport}
mailUser: {mailUser}
mailPW: XXXX
AUTH_TYPE: {AUTH_TYPE}" Else oMailBuilder.Html = mailBody End If Logger.Debug($"mailBody [{oMailBuilder.Html.ToString}]") If attachmentString <> "" Then ' Read attachment from disk, add it to Attachments collection If System.IO.File.Exists(attachmentString) Then Dim oAttachment As MimeData = oMailBuilder.AddAttachment(attachmentString) End If End If Dim email As IMail = oMailBuilder.Create() ' Send the message Using oSmtp As New Smtp() AddHandler oSmtp.ServerCertificateValidate, AddressOf Validate Logger.Debug($"AUTH_TYPE [{AUTH_TYPE}]") If AUTH_TYPE = "SSL" Then Try If mailport <> "465" Then Logger.Debug($"Connecting with explizit port [{mailport}]") oSmtp.Connect(mailsmtp, mailport) Logger.Debug($"Connect to [{mailsmtp}] successful!") Else oSmtp.ConnectSSL(mailsmtp) End If Catch ex As Exception Logger.Error(ex) End Try ElseIf AUTH_TYPE = "SSL/TLS" Then '########################################################################################## 'Tested with ExchangeServer SWB 22.10.2021 '########################################################################################## If mailport <> "587" Then Logger.Debug($"Connecting with explizit port [{mailport}]") oSmtp.Connect(mailsmtp, mailport) Else oSmtp.Connect(mailsmtp) End If Logger.Debug($"Connect to [{mailsmtp}] successful!") Dim supportsStartTLS As Boolean = oSmtp.SupportedExtensions().Contains(SmtpExtension.StartTLS) If supportsStartTLS = True Then oSmtp.StartTLS() Logger.Debug($"TLS started!") Else Logger.Info("Server supports no StartTLS") oSmtp.SSLConfiguration.EnabledSslProtocols = SslProtocols.Tls12 End If Else oSmtp.Connect(mailsmtp) End If Logger.Debug($"mailUser [{mailUser}]") oSmtp.UseBestLogin(mailUser, mailPW) ' remove if not needed oSmtp.SendMessage(email) Logger.Info("Message to " & oMailReceipiant & " has been send.") oSmtp.Close() End Using Next Return True Catch ex As Exception Logger.Error(ex) ErrorMessage = ex.Message Return False End Try End Function End Class