2023-07-31 16:30:26 +02:00

269 lines
15 KiB
VB.net

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(pLogConfig As LogConfig, ConStr As String, WMConStr As String, POLL_PROFILEID As Integer, USE_WM As Boolean, EmailAccountID As Integer, EmlProfPraefix As String, EML_LIMITATION 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, 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 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 _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