EmailProfiler.Common: Logik zur Vermeidung von doppelten EMail MessageIDs überarbeitet

This commit is contained in:
2026-05-15 13:24:28 +02:00
parent d48b7765e9
commit deafdd90c8
4 changed files with 195 additions and 30 deletions

View File

@@ -106,19 +106,28 @@ Public Class clsWorkEmail
CURRENT_MAIL_FROM = m.Address
Next
'TODO: Move all of these CURRENT_MAIL vars into a business object of type mail container
_CurrentMail = New MailContainer(pMailMessage, poUID)
'ab hier, darf/sollte pMailMessage nicht mehr verwendet werden.
_Logger.Info($"Working on email from: [{_CurrentMail.SenderAddress}] ... Subject: [{_CurrentMail.SubjectOriginal}] ... MessageID: [{_CurrentMail.MessageId}]")
'TODO: Move all of these CURRENT_MAIL vars into a business object of type mail container
CURRENT_MAIL_BODY_ALL = ""
CURRENT_MAIL_BODY_ANSWER1 = ""
CURRENT_MAIL_BODY_Substr2 = ""
CURRENT_MAIL_SUBJECT = ""
' Dieser Eintrag wird weiter unten wieder überschrieben. Wenn Subject IS NULL --> Exception
'CURRENT_MAIL_SUBJECT = pMailMessage.Subject.ToUpper.EscapeForSQL()
Dim oUniqueMessageID = GetUniqueMessagID()
If String.IsNullOrEmpty(oUniqueMessageID) = True Then
' Im Fall, dass wir keine eindeutige MessageID haben, schicken wir uns eine E-Mail
_Logger.Error($"Could not process email [{_CurrentMail.SubjectOriginal}], no unique messageID found!")
SendDuplicateWarningMail()
Return False
Else
_CurrentMail.SetMessageID(oUniqueMessageID)
_Logger.Debug($"Unique messageID found [{oUniqueMessageID}] and in use [{_CurrentMail.MessageId}]")
End If
CURRENT_MAIL_UID = poUID
_Logger.Info($"Working on email [{poUID}] from: [{_CurrentMail.SenderAddress}] ... Subject: [{_CurrentMail.SubjectOriginal}] ... MessageID: [{_CurrentMail.MessageId}]")
If String.IsNullOrEmpty(_CurrentMail.SubjectOriginal) Then
CURRENT_MAIL_SUBJECT = String.Empty
@@ -128,24 +137,6 @@ Public Class clsWorkEmail
_Logger.Debug("Fixed Subject: [{0}]", CURRENT_MAIL_SUBJECT)
End If
' Checking the messageID - could be a duplicate
_Logger.Debug($"messageID: '{_CurrentMail.MessageId}' - messageID2: '{_CurrentMail.MessageId2}'")
Dim oSql = $"Select COALESCE(MAX(GUID),0) FROM TBEMLP_HISTORY WHERE EMAIL_MSGID = '{_CurrentMail.MessageId}'"
Dim oHistoryID = _DB_MSSQL.GetScalarValue(oSql)
If oHistoryID > 0 And IS_LOCAL_TEST = False Then
_Logger.Warn("Found a MessageID already in use! Try MessageID2")
oSql = $"Select COALESCE(MAX(GUID),0) FROM TBEMLP_HISTORY WHERE EMAIL_MSGID = '{_CurrentMail.MessageId2}'"
oHistoryID = _DB_MSSQL.GetScalarValue(oSql)
If oHistoryID > 0 And IS_LOCAL_TEST = False Then
_Logger.Error("Found a MessageID2 already in use! Could not process email!")
Return False
End If
End If
Dim oTempMailExists As Boolean = Save2TempDirectory(_CurrentMail)
'Checking wether Mail can be opened
@@ -269,6 +260,138 @@ Public Class clsWorkEmail
End Try
End Function
''' <summary>
''' Gibt die erste eindeutige messageID zurück, die generiert wurde.
'''
''' Wenn kein eindeutiger Schlüssel erzeugt werden konnte, gibt die
''' Funktion Nothing / NULL zurück
''' </summary>
''' <returns>eindeutige messageID, oder nothing im Fehlerfall</returns>
Private Function GetUniqueMessagID() As String
_Logger.Debug("GetUniqueMessagID() Start")
If IS_LOCAL_TEST = True Then
' Keine Prüfung im Test-Fall
Return _CurrentMail.MessageId
End If
Try
Dim oSql = $"SELECT COALESCE(MAX(GUID),0) FROM TBEMLP_HISTORY WHERE EMAIL_MSGID = '"
Dim oTestSQL = oSql + _CurrentMail.MessageId + "';"
Dim oHistoryID = _DB_MSSQL.GetScalarValue(oTestSQL)
If oHistoryID = 0 Then
_Logger.Info($"GetUniqueMessagID() unique messageID found from original messageID [{_CurrentMail.MessageId}]")
Return _CurrentMail.MessageId
Else
' Wenn ein Duplikat vorliegt, müssen wir weiter suchen
_Logger.Info($"GetUniqueMessagID() Activate Deep Search for unique messageID!")
_CurrentMail.InitializeHashsetOfMessageIDs()
For Each oMessageIDItem In _CurrentMail.MessageIDHashSet
oTestSQL = oSql + oMessageIDItem + "';"
oHistoryID = _DB_MSSQL.GetScalarValue(oTestSQL)
If oHistoryID = 0 Then
_Logger.Info($"GetUniqueMessagID() unique messageID found [{oMessageIDItem}]")
Return oMessageIDItem
Else
_Logger.Warn($"GetUniqueMessagID() messageID [{oMessageIDItem}] already in use")
End If
Next
End If
' Wenn wir bis hier her kommen, konnten wir keine eindeutige messageID finden
_Logger.Error($"GetUniqueMessagID() could not find unique messageID! ")
Return Nothing
Catch ex As Exception
_Logger.Error(ex)
Return Nothing
End Try
End Function
Private Function SendDuplicateWarningMail() As Boolean
Try
' Gab es die Mail schon in den letzten 6 Stunden?
Dim oCheckSQL = $"SELECT COALESCE(MAX(GUID), 0) FROM DD_ECM.dbo.TBEMLP_EMAIL_OUT WHERE REFERENCE_STRING = '{_CurrentMail.MessageId}' AND COMMENT = '{EmailStrings.DUPLICATE_MESSAGEID_CODE}' AND DATEDIFF(hour, ADDED_WHEN, getdate()) < 6;"
Dim oOutHistoryID As Integer = _DB_MSSQL.GetScalarValue(oCheckSQL)
If oOutHistoryID > 0 Then
_Logger.Warn($"Warning Mail already sent")
' EMail ging bereits raus
Return True
End If
Catch ex As Exception
_Logger.Error(ex)
Return False
End Try
Try
Dim oReference = _CurrentMail.MessageId
Dim oAdressSQL = "SELECT TOP 1 COALESCE([CAT_STRING], '') FROM [IDB].[dbo].[TBIDB_CATALOG] WHERE CAT_TITLE = 'DD_SUPPORT_EMAIL';"
Dim configString = _DB_MSSQL.GetScalarValue(oAdressSQL)
Dim oEmailTo As String = "support-flow@digitaldata.works"
If String.IsNullOrEmpty(configString) = False Then
oEmailTo = configString
End If
Dim oSubject = $"{SUBJECT_PRAFIX} - {EmailStrings.EMAIL_SUBJECT_DUPLICATE_MESSAGEID}"
Dim oCreatedWho = "DDEmailProfiler"
Dim oMaskedBodyText = String.Format(EmailStrings.EMAIL_BODY_TEXT_DUPLICATE_MESSAGEID, _CurrentMail.MessageId, _CurrentMail.EMailDate)
Dim oSubjectBodyText = String.Format(EmailStrings.EMAIL_SUBJECT_TEXT, _CurrentMail.Subject)
Dim oCompleteBodyText = oMaskedBodyText + " - " + oSubjectBodyText
Dim oFinalBodyText = String.Format(EmailStrings.EMAIL_WRAPPING_TEXT_DUPLICATE_MESSAGEID, oCompleteBodyText)
_Logger.Debug("Trying to generate Email:")
_Logger.Debug("To: {0}", oEmailTo)
_Logger.Debug("Subject: {0}", oSubject)
_Logger.Debug("Body {0}", oFinalBodyText)
Dim osql = $"Select COALESCE(MAX(GUID), 0) FROM TBEMLP_HISTORY WHERE EMAIL_MSGID = '{_CurrentMail.MessageId}'"
Dim oHistoryID As Integer = _DB_MSSQL.GetScalarValue(osql)
Dim oInsert = $"INSERT INTO [dbo].[TBEMLP_EMAIL_OUT] (
[REMINDER_TYPE_ID]
,[SENDING_PROFILE]
,[REFERENCE_ID]
,[REFERENCE_STRING]
,[WF_ID]
,[EMAIL_ADRESS]
,[EMAIL_SUBJ]
,[EMAIL_BODY]
,[COMMENT]
,[ADDED_WHO])
VALUES
(77
,{_EmailAccountID}
,{oHistoryID}
,'{_CurrentMail.MessageId}'
,77
,'{oEmailTo}'
,'{oSubject}'
,'{oFinalBodyText}'
,'{EmailStrings.DUPLICATE_MESSAGEID_CODE}'
,'{oCreatedWho}')"
Return _DB_MSSQL.ExecuteNonQuery(oInsert)
Catch ex As Exception
_Logger.Error(ex)
Return False
End Try
Return True
End Function
''' <summary>
''' Wenn beim Herauslösen der Attachments festgestellt wurde,
''' das ein Teil der _normalen_ Attachments fehlerhaft war, wird der Absender hier