Imports DigitalData.EMLProfiler.ClassCurrent Imports DigitalData.Modules.Logging Imports DigitalData.Modules.Messaging Imports Limilabs.Mail Imports Limilabs.Mail.MIME Imports Limilabs.Mail.Headers Imports DigitalData.Modules.Database Imports DigitalData.Modules.Messaging.Mail Public Class clsWorker Private ReadOnly Logger As Logger Private ReadOnly Fetcher As MailFetcher Private ReadOnly Database As MSSQLServer Private ReadOnly UseWindream As Boolean = False Private ReadOnly ClassWindreamAllgemein As clsWindream_allgemein Private ReadOnly ClassWindreamIndex As clsWindream_Index Private ReadOnly ClassWorkMail As clsWorkEmail Private ReadOnly Encryption As clsEncryption Private ReadOnly ProfileId As Integer = 0D Private ReadOnly EmailLimitationSender As String = "" Sub New(pLogConfig As LogConfig, pConnectionString As String, pWindreamConnectionString As String, pPollProfileId As Integer, pUseWindream As Boolean, pEmailAccountID As Integer, pEmailPrefix As String, pEmailLimitationSender As String, Optional pLocalEML As String = "") Logger = pLogConfig.GetLogger 'ClassEmailImap = New clsEmailIMAP(pLogConfig) Fetcher = New MailFetcher(pLogConfig) Database = New MSSQLServer(pLogConfig, pConnectionString) UseWindream = pUseWindream EmailLimitationSender = pEmailLimitationSender If UseWindream Then ClassWindreamAllgemein = New clsWindream_allgemein(pLogConfig) ClassWindreamIndex = New clsWindream_Index(pLogConfig) End If ClassWorkMail = New clsWorkEmail(pLogConfig, pConnectionString, pWindreamConnectionString, pUseWindream, pEmailAccountID, pEmailPrefix) Encryption = New clsEncryption("!35452didalog=", pLogConfig) ProfileId = pPollProfileId CURRENT_DEBUG_LOCAL_EMAIL = pLocalEML End Sub Private Sub DeleteTempFiles() For Each _file In TEMP_FILES Logger.Debug("Trying to delete temp file: [{0}]", _file) If IO.File.Exists(_file) Then Try IO.File.Delete(_file) Catch ex As Exception Logger.Error(ex) Logger.Warn("Could not delete the tempfile from TEMP_FILES: [{0}]", _file) End Try End If Next TEMP_FILES.Clear() End Sub Public Sub Start_WorkingProfiles(Optional LocalEmail As Boolean = False) Try DeleteTempFiles() If Database.DBInitialized = True Then Logger.Debug("now windream_init... ") If UseWindream Then If ClassWindreamAllgemein.Init = False Then Logger.Info("windream could not be initialized!!") Exit Sub Else Logger.Debug("windream_initialized!") End If End If Dim osql As String = "SELECT * FROM TBEMLP_POLL_PROFILES" If ProfileId = 0 Then osql &= " WHERE ACTIVE = 1 order by SEQUENCE" Else osql &= " WHERE GUID = " & ProfileId End If Dim DT_TBDD_EMAIL As DataTable = Database.GetDatatable("SELECT * FROM TBDD_EMAIL_ACCOUNT WHERE ACTIVE = 1") Dim DT_PROFILES = Database.GetDatatable(osql) If Not IsNothing(DT_PROFILES) Then If DT_PROFILES.Rows.Count > 0 Then Logger.Debug("count of active profiles: " & DT_PROFILES.Rows.Count.ToString) For Each oDR_Profile As DataRow In DT_PROFILES.Rows CURRENT_PROFILE_GUID = oDR_Profile.Item("GUID") DT_POLL_PROCESS = Nothing Dim sql = String.Format("SELECT * FROM TBEMLP_POLL_PROCESS WHERE PROFILE_ID = {0} AND ACTIVE = 1", CURRENT_PROFILE_GUID) DT_POLL_PROCESS = Database.GetDatatable(sql) If Not IsNothing(DT_POLL_PROCESS) Then If DT_POLL_PROCESS.Rows.Count = 0 Then Logger.Info("No processes configured for this Email-Profile - " & sql) Continue For Else DT_STEPS = Nothing DT_STEPS = Database.GetDatatable(String.Format("SELECT T.* FROM TBEMLP_POLL_STEPS T,TBEMLP_POLL_PROCESS T1 WHERE T.PROCESS_ID = T1.GUID AND T1.PROFILE_ID = {0} AND T1.ACTIVE = 1", CURRENT_PROFILE_GUID)) End If Else Logger.Warn("DT_POLL_PROCESS is nothing") Continue For End If CURRENT_EMAIL_GUID = 0 CURRENT_POLL_TYPE = oDR_Profile.Item("POLL_TYPE") Logger.Debug(String.Format("Working on profile: ({0}-{1}-{2}) ", oDR_Profile.Item("GUID"), oDR_Profile.Item("PROFILE_NAME"), CURRENT_POLL_TYPE)) CURRENT_EMAIL_GUID = oDR_Profile.Item("EMAIL_CONF_ID") Dim EMAIL_PROF_TABLE As DataTable = DT_TBDD_EMAIL 'Presuming the DataTable has a column named Date. Dim expression As String expression = "GUID = " & CURRENT_EMAIL_GUID Logger.Debug("Expression Filter email: " & expression) Logger.Debug("DT_TBDD_EMAIL.rowCount: " & DT_TBDD_EMAIL.Rows.Count) 'Filter the rows using Select() method of DataTable Dim FilteredRows As List(Of DataRow) = EMAIL_PROF_TABLE.Select(expression).ToList() If FilteredRows.Count = 1 Then Dim oRow = FilteredRows(0) Dim MAIL_FROM = oRow("EMAIL_FROM") Dim MAIL_SERVER = oRow("EMAIL_SMTP") Dim MAIL_USER = oRow("EMAIL_USER") Dim MAIL_USER_PW = oRow("EMAIL_PW") Dim MAIL_PORT = oRow("PORT_IN") Dim MAIL_INBOX_NAME = "Inbox" Dim MAIL_ARCHIVE_FOLDER = oRow("ARCHIVE_FOLDER") Dim MAIL_AUTHTYPE = oRow("AUTH_TYPE") Logger.Debug(String.Format("{0}-{1}", MAIL_FROM, MAIL_SERVER)) Dim PWPlain = Encryption.DecryptData(MAIL_USER_PW) If Not IsNothing(PWPlain) Then If PWPlain <> "" Then MAIL_USER_PW = PWPlain Else Logger.Warn("PWPlain is string.empty - Could not decrypt passwort") End If Else Logger.Warn("PWPlain is nothing - Could not decrypt passwort") End If CURRENT_WORKMAIL_UID_LIST.Clear() If MAIL_SERVER <> "" Then Dim oPollResult As Boolean = False If LocalEmail = True Then oPollResult = True Else Select Case CURRENT_POLL_TYPE Case "IMAP" ' We are using 'Archive Folder' as an additional field to save the Tenant-ID for O365-OAuth2 oPollResult = FetchMessages(MAIL_SERVER, MAIL_PORT, MAIL_USER, MAIL_USER_PW, MAIL_AUTHTYPE, MAIL_ARCHIVE_FOLDER) Case Else Logger.Error("Poll Type [{0}] is not supported!", CURRENT_POLL_TYPE) oPollResult = False End Select End If If CURRENT_WORKMAIL_UID_LIST.Count() > 0 Or LocalEmail = True Then If LocalEmail Then Logger.Info("Working with local Mail") Dim oEmail As IMail = New MailBuilder().CreateFromEmlFile(CURRENT_DEBUG_LOCAL_EMAIL) ClassWorkMail.WorkEmailMessage(oEmail, 123456789) 'CURRENT_MAIL_MESSAGE = Nothing Else Try Logger.Info(String.Format("Pulled: [{0}] E-Mails", CURRENT_WORKMAIL_UID_LIST.Count())) Dim LIMIT_EMAIL_FROM As Boolean = False If EmailLimitationSender.Contains("@") Then LIMIT_EMAIL_FROM = True Logger.Info("####################################") Logger.Info($"LIMIT_EMAIL_FROM is ACTIVE - EMAIL_FROM = [{EmailLimitationSender}]") Logger.Info("####################################") Logger.Debug("####################################") Logger.Debug($"LIMIT_EMAIL_FROM is ACTIVE - EMAIL_FROM = [{EmailLimitationSender}]") Logger.Debug("####################################") End If For Each oUID In CURRENT_WORKMAIL_UID_LIST Dim oEmail As IMail = Fetcher.FetchMail(oUID) If Not IsNothing(oEmail) Then If LIMIT_EMAIL_FROM Then Dim oEmailFrom As String = "" For Each m As MailBox In oEmail.From oEmailFrom = m.Address Next If oEmailFrom <> EmailLimitationSender Then Logger.Debug($"Skipping email {oEmailFrom} ...Subject [{oEmail.Subject}]") Continue For End If End If If ClassWorkMail.WorkEmailMessage(oEmail, oUID) = True Then If CURRENT_DEBUG_LOCAL_EMAIL = "" Then EMAIL_DELETE() End If End If Else Logger.Info("### oEmail was nothing ###") End If 'CURRENT_MAIL_MESSAGE = Nothing Next If CURRENT_POLL_TYPE = "IMAP" And CURRENT_WORKMAIL_UID_LIST.Count > 0 Then If Not IsNothing(Fetcher.Client) Then Fetcher.Client.Close() End If End If Catch ex As Exception Logger.Error(ex) Logger.Warn($"Unexpected Error working CURRENT_WORKMAIL_UID_LIST: {ex.Message} ") End Try End If Else Logger.Debug(String.Format("No emails for profile!")) End If Else Logger.Warn("For the Email-Profile ID " & CURRENT_EMAIL_GUID & " no record could be found!") End If Database.ExecuteNonQuery("UPDATE TBEMLP_POLL_PROFILES SET LAST_TICK = GETDATE() WHERE GUID = " & oDR_Profile.Item("GUID").ToString) Else Logger.Warn("For the Email-Profile ID " & CURRENT_EMAIL_GUID & " no record could be found! Check wether Email-Profile is active!") End If Next DeleteTempFiles() Else Logger.Info("No active profiles") End If End If Database.ExecuteNonQuery("UPDATE TBEMLP_CONFIG SET LAST_TICK = GETDATE() WHERE GUID = 1") End If Catch ex As Exception Logger.Error(ex) End Try End Sub Public Function FetchMessages(pServer As String, pPort As Integer, pUsername As String, pPassword As String, pAuthType As String, pArchiveFolder As String) As Boolean Try Dim oSession As MailSession.SessionInfo If pAuthType = MailSession.AUTH_OAUTH2 Then Dim oClientId As String = pServer Dim oClientSecret As String = pPassword Dim oTenantId As String = pArchiveFolder oSession = Fetcher.ConnectToO365(pUsername, oClientId, oTenantId, oClientSecret) Else oSession = Fetcher.Connect(pServer, pPort, pUsername, pPassword, pAuthType) End If If oSession.Connected = False AndAlso oSession.Error IsNot Nothing Then Logger.Warn("Connection to Mail Server failed!") Logger.Error(oSession.Error) Return False ElseIf oSession.Connected = False Then Logger.Warn("Connection to Mail Server failed!") Return False End If CURRENT_ImapObject = Fetcher.Client Dim oMailIds As List(Of Long) = Fetcher.ListAllMails() If oMailIds Is Nothing Then Logger.Warn("List of UIDs was Nothing. Exiting.") Return False End If If oMailIds.Count = 0 Then Logger.Debug("No Emails found.") Return True End If CURRENT_WORKMAIL_UID_LIST = oMailIds Return True Catch ex As Exception Logger.Error(ex) Return False End Try End Function Private Sub EMAIL_DELETE() Try If DeleteMail = True And MessageError = False Then If IsNothing(Fetcher.Client) Then Logger.Warn("EMAIL_DELETE - CURRENT_ImapObject is nothing") End If Fetcher.Client.DeleteMessageByUID(CURRENT_MAIL_UID) Logger.Info("Email with Id [{0}] was deleted.", CURRENT_MAIL_UID) Else If MessageError = True Then Logger.Warn("Did not delete Message with UID [{0}] as there was an MessageError!", CURRENT_MAIL_UID) End If End If Catch ex As Exception Logger.Error(ex) End Try End Sub End Class