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 Public Class clsWorker Private Shared Logger As Logger 'Private _email As clsEmail Private ReadOnly _emailIMAP As clsEmailIMAP 'Private _Database As clsDatabase Private ReadOnly _Database As MSSQLServer Private ReadOnly _USE_WM As Boolean = False Private ReadOnly _windream As clsWindream_allgemein Private ReadOnly _windream_index As clsWindream_Index Private ReadOnly _workmail As clsWorkEmail Private ReadOnly _wrapper As clsEncryption Private ReadOnly _POLL_PROFILEID As Integer = 0 Private ReadOnly Eml_Limitation_Sender As String = "" Sub New(EML_LIMITATION As String, pLogConfig As LogConfig, ConStr As String, WMConStr As String, POLL_PROFILEID As Integer, FB_DATASOURCE As String, FB_DATABASE As String, FB_USER As String, FB_PW As String, USE_WM As Boolean, EmailAccountID As Integer, EmlProfPraefix As String, Optional plocaleml As String = "") Logger = pLogConfig.GetLogger _emailIMAP = New clsEmailIMAP(pLogConfig) _Database = New MSSQLServer(pLogConfig, ConStr) _USE_WM = USE_WM Eml_Limitation_Sender = EML_LIMITATION If _USE_WM Then _windream = New clsWindream_allgemein(pLogConfig) _windream_index = New clsWindream_Index(pLogConfig) End If _workmail = New clsWorkEmail(pLogConfig, ConStr, WMConStr, FB_DATASOURCE, FB_DATABASE, FB_USER, FB_PW, USE_WM, EmailAccountID, EmlProfPraefix) _wrapper = New clsEncryption("!35452didalog=", pLogConfig) _POLL_PROFILEID = POLL_PROFILEID 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 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 TEMP_FILES.Clear() If _Database.DBInitialized = True Then Logger.Debug("now windream_init... ") If _USE_WM Then If _windream.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 _POLL_PROFILEID = 0 Then osql &= " WHERE ACTIVE = 1 order by SEQUENCE" Else osql &= " WHERE GUID = " & _POLL_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 = _wrapper.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 pollresult As Boolean = False If LocalEmail = True Then pollresult = True Else Select Case CURRENT_POLL_TYPE Case "POP" 'pollresult = _email.POP3_COLLECT() Case "IMAP" pollresult = _emailIMAP.FetchIMAPMessagesLimilab(MAIL_SERVER, MAIL_PORT, MAIL_USER, MAIL_USER_PW, MAIL_AUTHTYPE) 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) _workmail.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 Eml_Limitation_Sender.Contains("@") Then LIMIT_EMAIL_FROM = True Logger.Info("####################################") Logger.Info($"LIMIT_EMAIL_FROM is ACTIVE - EMAIL_FROM = [{Eml_Limitation_Sender}]") Logger.Info("####################################") Logger.Debug("####################################") Logger.Debug($"LIMIT_EMAIL_FROM is ACTIVE - EMAIL_FROM = [{Eml_Limitation_Sender}]") Logger.Debug("####################################") End If For Each oUID In CURRENT_WORKMAIL_UID_LIST Dim oEml = CURRENT_ImapObject.GetMessageByUID(oUID) Dim oEmail As IMail = New MailBuilder().CreateFromEml(oEml) 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 <> Eml_Limitation_Sender Then Logger.Debug($"Skipping email {oEmailFrom} ...Subject [{oEmail.Subject}]") Continue For End If End If If _workmail.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(CURRENT_ImapObject) Then CURRENT_ImapObject.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 Private Function EMAIL_DELETE() If DeleteMail = True And MessageError = False Then If Not IsNothing(CURRENT_ImapObject) Then CURRENT_ImapObject.DeleteMessageByUID(CURRENT_MAIL_UID) Else Logger.Warn("EMAIL_DELETE - CURRENT_ImapObject is nothing") End If Else If MessageError = True Then Logger.Warn($"Did not delete Message with UID [{CURRENT_MAIL_UID}] as there was an MessageError!") End If End If End Function End Class