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 Public Sub Start_WorkingProfiles(Optional LocalEmail As Boolean = False) Try 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($"TempFileDelete - Could not delete the tempfile from TEMP_FILES: {ex.Message}") End Try End If Next TEMP_FILES.Clear() 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 MAIL_FROM = "" MAIL_SERVER = "" MAIL_USER = "" MAIL_USER_PW = "" 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 DataRow() = EMAIL_PROF_TABLE.Select(expression) If FilteredRows.Length = 1 Then For Each row As DataRow In FilteredRows MAIL_FROM = row("EMAIL_FROM") MAIL_SERVER = row("EMAIL_SMTP") MAIL_USER = row("EMAIL_USER") MAIL_USER_PW = row("EMAIL_PW") MAIL_PORT = row("PORT_IN") MAIL_INBOX_NAME = "Inbox" MAIL_ARCHIVE_FOLDER = row("ARCHIVE_FOLDER") MAIL_AUTHTYPE = row("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 Next 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" oPollResult = FetchMessages(MAIL_SERVER, MAIL_PORT, MAIL_USER, MAIL_USER_PW, MAIL_AUTHTYPE) 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 Try 'Delete all Tempfiles For Each _file In TEMP_FILES Logger.Debug("Trying to delete temp file: [{0}]", _file) If System.IO.File.Exists(_file) Then Try System.IO.File.Delete(_file) Catch ex As Exception Logger.Error(ex) Logger.Warn($"TempFileDelete - Could not delete the tempfile from TEMP_FILES: {ex.Message}") End Try End If Next Catch ex As Exception Logger.Warn($"TempFileDelete(X) - Could not delete the tempfile from TEMP_FILES: {ex.Message}") End Try 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(Server As String, Port As Integer, Username As String, Password As String, AuthType As String) As Boolean Try Dim oSession = Fetcher.Connect(Server, Port, Username, Password, AuthType) 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