/
AstroJohn
/
MailRobot
Обзор
Документация
Войти
/
AstroJohn
/
MailRobot
Код
Запросы
0
Задачи
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
Checker/EmailChecker.vb
1 179 строк
47 KB
AstroJohn
GetOblast GetTeam
11 апр 2026, 17:23
11 апр 2026, 17:23
8cd6106
Код
Авторство
О чём код?
Imports System.Collections.Generic Imports System.IO Imports System.Reflection Imports Quiksoft.EasyMail Imports System.Text Imports Common Imports DbContext.Models Imports LogProcessingGate Imports LogProcessingModels.Configuration Imports LogProcessingModels.Parsing Imports LogProcessingModels.PrefixResolving Imports LogProcessingModels.Scoring Imports LogScoring Imports ResolvePrefix Public Class EmailChecker Private Class Attachment Public Stream As MemoryStream Public Name As String End Class ' ReSharper disable InconsistentNaming Private Const DEFAULT_ATTACHMENT_NAME As String = "unknown.att" Private Const ENCODING_CP_1251 As Integer = 1251 Private Const MAIL_ROBOT_EMAIL As String = "mailrobot@alrs.info" Public Enum RESULTS_TYPE CLAIMED = 1 CONFIRMED = 2 End Enum ' ReSharper restore InconsistentNaming Public Property LogScoringGate As LogScoringGate Private Property PrefixResolver As IPrefixResolver Private ReadOnly _messageIDs As New Collection Private _parser As IParser Private _secondaryParser As IParser Private _pop As POP3.POP3 Private ReadOnly _mailRobotService As ServiceProcess.ServiceBase Private ReadOnly _txtBox As Windows.Forms.TextBox Public ReadOnly Parameters As clsChecker_Parameters Public Property FtpAutoSave As Boolean Get Return Parameters.FTP_Parameters.AutoSave End Get Set Parameters.FTP_Parameters.AutoSave = value End Set End Property Public Function GetParser(Optional getSecondary As Boolean = False) As IParser Dim logParsingGate As New LogParsingGate(Parameters) GetParser = logParsingGate.GetParser(Parameters, PrefixResolver, Parameters.MsSqlConnectionString, getSecondary) End Function Public Sub New(checkerParameters As clsChecker_Parameters, Optional textBox As Windows.Forms.TextBox = Nothing, Optional checkingService As ServiceProcess.ServiceBase = Nothing) POP3.License.Key = "2082557972/872580F1FB37DE4B4A45C" SMTP.License.Key = "2082557972/872580F1FB37DE4B4A45C" Parse.License.Key = "2082557972/872580F1FB37DE4B4A45C" SSL.License.Key = "2082557972/872580F1FB37DE4B4A45C" Parameters = checkerParameters _mailRobotService = checkingService _txtBox = textBox Dim startupPath as string = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) Dim ctyDatFileName As String = Convert.ToString(IIf(String.IsNullOrWhiteSpace(checkerParameters.ParserParameters.CtyDatFileName), "cty.dat", checkerParameters.ParserParameters.CtyDatFileName)) Dim ctyDatPath As String = Path.Combine(startupPath, ctyDatFileName) If Not File.Exists(ctyDatPath) Then throw new Exception($"Critical error: {ctyDatPath} not exists.") End If Dim oblDatPath as string = Path.Combine(startupPath, "obl.dat") If Not File.Exists(oblDatPath) Then Throw New Exception($"Critical error: {oblDatPath} not exists.") End If Dim teamDatPath As String = Path.Combine(startupPath, "team.dat") PrefixResolver = New PrefixResolver(ctyDatPath, oblDatPath, teamDatPath) With Parameters _parser = GetParser() _secondaryParser = GetParser(True) .MessageIDsList_FileName = .MessageIDsList_FileName CreatePath(.GetReceivedLogsPath) CreatePath(.GetBadAnswersPath) CreatePath(Path.Combine(.GetReceivedLogsPath, "BAK")) RecollectMessageIDs() End With LogScoringGate = New LogScoringGate(checkerParameters, PrefixResolver, Parameters.MsSqlConnectionString, AddressOf WriteLog) End Sub #Region "Private methods" Private Function CheckOneMessage(popMsg As POP3.MessageID) As Integer 'Возврат числа корректных логов Dim logMsg As String Dim memoryStream As New MemoryStream Dim attStream As MemoryStream Dim subject As String Dim body As String = String.Empty Dim bodyRus As String = String.Empty Dim recipients As New SMTP.RecipientCollection 'Dim AttachmentName() As String 'Dim AttachmentStream() As MemoryStream Dim attachments As New Collection Dim errorMessage As String = String.Empty Dim recipientsAdmin As SMTP.RecipientCollection Dim fileName As String Dim path As String Dim parsedLog As ParsedLog = Nothing Dim ermakLogFound As Boolean Dim flag As Boolean Dim i As Integer Dim bodySingle As String Dim bodySingleRus As String Dim correctLogs As Integer = 0 Dim callsigns As New Specialized.NameValueCollection() memoryStream.SetLength(0) _pop.DownloadMessage(popMsg.OrdinalPosition, memoryStream) memoryStream.Position = 0 Dim msg As New Parse.EmailMessage(memoryStream) If InStr(msg.Subject, "mail delivery failed", CompareMethod.Text) > 0 _ OrElse ( msg.From.Count > 0 _ AndAlso ( _ InStr(msg.From.Item(0).EmailAddress, "mailer-daemon", CompareMethod.Text) > 0 _ OrElse InStr(msg.From.Item(0).Name, "mail delivery", CompareMethod.Text) > 0 _ OrElse InStr(msg.From.Item(0).EmailAddress, "[emailgener]", CompareMethod.Text) > 0 _ OrElse InStr(msg.From.Item(0).EmailAddress, Parameters.SMTP_Parameters.From_Address_EMail, CompareMethod.Text) > 0 _ ) ) Then _pop.DeleteMessage(popMsg.OrdinalPosition) logMsg = "ID = " + popMsg.UniqueID + " from " + msg.From(0).EmailAddress + " is delivery failure notification or spam." WriteLog(logMsg) Else Try If msg.From.Count > 0 Then logMsg = "ID = " + popMsg.UniqueID + " from " + msg.From(0).EmailAddress Else logMsg = "ID = " + popMsg.UniqueID + " from unknown sender" End If WriteLog(logMsg) For Each att As Parse.Attachment In msg.Attachments attStream = New MemoryStream Dim attach As New Attachment att.Save(attStream) attach.Stream = New MemoryStream attStream.WriteTo(attach.Stream) attach.Name = att.GetValidFileName attachments.Add(attach) bodySingle = String.Empty bodySingleRus = String.Empty Dim checkOk As Boolean = CheckOneAttachment(msg, popMsg.UniqueID, parsedLog, attStream, att.Filename, bodySingle, bodySingleRus) If checkOk Then correctLogs = correctLogs + 1 ermakLogFound = True callsigns.Add(parsedLog.Callsign, parsedLog.Category) End If If body = String.Empty Then body = "===== Attached file found: " + att.Filename + vbCrLf + bodySingle bodyRus = "===== Найден вложенный файл: " + att.Filename + vbCrLf + bodySingleRus Else body = body + vbCrLf + vbCrLf + "===== Attached file found: " + att.Filename + vbCrLf + bodySingle bodyRus = bodyRus + vbCrLf + vbCrLf + "===== Найден вложенный файл: " + att.Filename + vbCrLf + bodySingleRus End If Next If msg.Attachments.Count = 0 Then ' Обманка от лени. Подсовываем пустой поток вместо отчета и получаем в ответ ругань, которую переправляем юзеру. With _parser .LogStream = Nothing .ParseLog() parsedLog = .ParsedLog body = ParsedLog.ParseResult.MessageEn bodyRus = ParsedLog.ParseResult.MessageRu End With End If If msg.Attachments.Count > 1 _ And ermakLogFound Then body = $"Attention! Your message contains several attachments ({msg.Attachments.Count}).{Environment.NewLine}{body}" bodyRus = $"Внимание! Ваше сообщение содержит несколько вложений ({msg.Attachments.Count}).{Environment.NewLine}{bodyRus}" End If If msg.Attachments.Count = 0 _ Or Not ermakLogFound Then logMsg = "Log in " + Parameters.LogFormat.ToString + " format not found." body = logMsg + vbCrLf + body logMsg = "Отчет в формате " + Parameters.LogFormat.ToString + " не найден." bodyRus = logMsg + vbCrLf + bodyRus WriteLog(logMsg) End If body = "Please check the comments in English below!" + vbCrLf + vbCrLf + bodyRus + vbCrLf + vbCrLf + body subject = "RE: " + msg.Subject If Parameters.SendConfirmation Then If msg.ReplyTo.Count = 0 Then For Each rec As Parse.Address In msg.From If rec.EmailAddress.ToLower() <> MAIL_ROBOT_EMAIL Then recipients.Add(rec.EmailAddress, rec.Name) End If Next Else For Each rec As Parse.Address In msg.ReplyTo If rec.EmailAddress.ToLower() <> MAIL_ROBOT_EMAIL Then recipients.Add(rec.EmailAddress, rec.Name) End If Next End If Dim hamEmail As String = parsedLog?.EMail If hamEmail.IsEmail() And hamEmail <> Parameters.AdminEMail And hamEmail <> MAIL_ROBOT_EMAIL Then recipients.Add(hamEmail) End If If recipients.Count = 0 OrElse recipients.Item(0).Email <> Parameters.AdminEMail Then If recipients.Count = 0 Then recipients.Add(Parameters.AdminEMail) End If flag = False i = 0 While flag = False _ And i <1 i += 1 flag= SendEmail(subject, body, recipients, errorMessage) End While End If End If If Not ermakLogFound Then path = msg.From(0).EmailAddress + "_" + popMsg.UniqueID For Each c As Char In IO.Path.GetInvalidPathChars() path = path.Replace(c, "").Trim Next path = Parameters.GetBadAnswersPath + "\" + path CreatePath(path) fileName = path + "\answer.txt" SaveBackup(fileName) WriteTextFile(fileName, bodyRus) End If If Parameters.AdminEMail <> String.Empty Then ' AndAlso Not Parameters.AdminEMail.Contains(Recipients.Item(0).Email) Then Dim emails() As String = Split(Parameters.AdminEMail, ";") recipientsAdmin = New SMTP.RecipientCollection If ermakLogFound Then For Each email As String In emails recipientsAdmin.Add(email, "MailRobot Administrator") Next subject = "Logs exchange: " For Each item As String In callsigns.Keys subject = subject + $"{item} ({callsigns(item)}) " Next Else recipientsAdmin.Add(emails(0)) subject = "Re: " + msg.Subject End If Else recipientsAdmin = Nothing End If If Not recipientsAdmin Is Nothing _ And Parameters.SendConfirmation _ And ermakLogFound Then flag = False i = 0 While flag = False _ And i < 5 i += 1 flag = SendEmail(subject, body, recipientsAdmin, errorMessage, attachments) End While End If Catch ex As Exception WriteLog("ОШИБКА ПРИ ОБРАБОТКЕ СООБЩЕНИЯ UniqueID = " + popMsg.UniqueID + ": " + ex.GetLoggingTrace()) Finally RememberMessageId(popMsg.UniqueID) _messageIDs.Add(popMsg.UniqueID, popMsg.UniqueID) End Try End If memoryStream.Close() Return correctLogs End Function Private Function CheckOneAttachment(msg As Parse.EmailMessage, msgUniqueId As String, ByRef parsedLog As ParsedLog, attStream As MemoryStream, attFileName As String, ByRef body As String, ByRef bodyRus As String) As Boolean Dim fileName As String Dim fStream As FileStream Dim path As String Dim ermakLogFound As Boolean Dim logMsg As String Dim emailDate As DateTime = msg.Date.Date Dim timeZoneOffset As Integer If Integer.TryParse(msg.Date.TimeZoneBias, timeZoneOffset) Then emailDate = emailDate.AddHours(-timeZoneOffset) End If Dim emailAddress As String = Nothing If msg.From.Count > 0 Then emailAddress = msg.From(0).EmailAddress End If parsedLog = ParseLogInternal(attStream, emailDate, attFileName, emailAddress) If parsedLog.EMail Is Nothing _ OrElse parsedLog.EMail.IndexOf("@"c) = -1 Then parsedLog.EMail = emailAddress End If body = ParsedLog.ParseResult.MessageEn bodyRus = ParsedLog.ParseResult.MessageRu Select Case parsedLog.ParseResult.Type Case LOG_PARSE_ERROR_TYPE.ERRORS_FOUND, LOG_PARSE_ERROR_TYPE.OTHER_CONTEST If msg.From.Count > 0 Then logMsg = "LOG from " + msg.From.Item(0).EmailAddress + " is not accepted." else logMsg = "LOG from unknown address is not accepted." End If WriteLog(logMsg) body = "ATTENTION! Errors were found in your LOG. YOUR LOG IS NOT ACCEPTED." _ + vbCrLf + "Please correct errors and resubmit the LOG." + vbCrLf + body bodyRus = "ВНИМАНИЕ! В присланном Вами отчете найдены ошибки. ОТЧЕТ НЕ ПРИНЯТ." _ + vbCrLf + "Исправьте ошибки и отправьте отчет еще раз." + vbCrLf + bodyRus ermakLogFound = True Case LOG_PARSE_ERROR_TYPE.FORMATTED_LOG_NOT_FOUND ermakLogFound = False Case Else logMsg = parsedLog.Callsign + " " + parsedLog.Category + ": LOG is accepted!" WriteLog(logMsg) If parsedLog.ParseResult.Type = LOG_PARSE_ERROR_TYPE.WARNING Then body = "YOUR LOG IS ACCEPTED with warnings." + vbCrLf _ + "If you are sure that the warnings aren't significant, no action is required." _ + vbCrLf + body bodyRus = "Спасибо! ВАШ ОТЧЕТ ПРИНЯТ с замечаниями." + vbCrLf _ + "Если Вы уверены, что замечания являются несущественными, то ничего предпринимать не следует, спасибо за отчет!" _ + vbCrLf + bodyRus Else body = "Thank you! YOUR LOG IS ACCEPTED." _ + vbCrLf + body bodyRus = "Спасибо! ВАШ ОТЧЕТ ПРИНЯТ." _ + vbCrLf + bodyRus End If ermakLogFound = True End Select Dim parsedFileName As String = parsedLog.FileName If parsedLog.ParseResult.Type = LOG_PARSE_ERROR_TYPE.NONE _ Or parsedLog.ParseResult.Type = LOG_PARSE_ERROR_TYPE.WARNING Then fileName = Parameters.GetBadAnswersPath + "\" + parsedFileName + ".log" SaveBackup(fileName) If parsedLog.CategoryIndicator = String.Empty Then fileName = Parameters.GetBadAnswersPath + "\" + parsedFileName + ".LB.log" SaveBackup(fileName) fileName = Parameters.GetReceivedLogsPath + "\" + parsedFileName + ".LB.log" SaveBackup(fileName) fileName = Parameters.GetBadAnswersPath + "\" + parsedFileName + ".HB.log" SaveBackup(fileName) fileName = Parameters.GetReceivedLogsPath + "\" + parsedFileName + ".HB.log" SaveBackup(fileName) Else If parsedLog.Band = String.Empty Then fileName = Parameters.GetBadAnswersPath + "\" + parsedFileName + ".log" SaveBackup(fileName) fileName = Parameters.GetReceivedLogsPath + "\" + parsedFileName + ".log" SaveBackup(fileName) End If End If fileName = Parameters.GetReceivedLogsPath + "\" + parsedFileName + ".log" Else If parsedLog.Callsign <> String.Empty Then fileName = Parameters.GetBadAnswersPath + "\" + parsedFileName + ".log" Else path = Parameters.GetBadAnswersPath + "\" + msg.From(0).EmailAddress + "_" + msgUniqueId CreatePath(path) fileName = path + "\" + IIf(attFileName = "", "attachment.file", attFileName).ToString End If End If SaveBackup(fileName) Dim attStreamArr() As Byte = attStream.ToArray fStream = New FileStream(fileName, FileMode.CreateNew) fStream.Write(attStreamArr, 0, attStreamArr.Length) fStream.Close() Dim scores As List(Of LogFilesBandResults) = Nothing If parsedLog.ParseResult.Type = LOG_PARSE_ERROR_TYPE.NONE _ Or parsedLog.ParseResult.Type = LOG_PARSE_ERROR_TYPE.WARNING Then If Parameters.MSSQL_Parameters.LoadToDB Then Try Dim fileInfo As New FileInfo(fileName) Dim log As Log = LogScoringGate.ConvertLog(parsedLog, fileName, Convert.ToInt32(fileInfo.Length), fileInfo.LastAccessTime) scores = LogScoringGate.GetScore(log, True, ResultsType.Claimed).ToList() parsedLog.ClaimedResultsText = LogScoringGate.GetTextScore(log, scores) If Not String.IsNullOrEmpty(parsedLog.ClaimedResultsText) Then body += vbNewLine + vbNewLine + parsedLog.ClaimedResultsText End If Dim errorMessage As String = String.Empty Dim isSavedSuccesfully As Boolean = LogScoringGate.SaveLog(log, parsedLog.Category, parsedLog.Band, parsedLog.ContestDate, errorMessage) If Not isSavedSuccesfully Then WriteLog("Не удалось загрузить отчет в БД: " + errorMessage) End If Catch ex As Exception WriteLog("Не удалось загрузить отчет в БД: " + ex.GetLoggingTrace()) End Try End If Dim eMail As String If msg.From.Count > 0 Then eMail = msg.From.Item(0).EmailAddress Else eMail = String.Empty End If WriteAcceptedLogs(parsedLog.Callsign, parsedLog.Category, eMail, parsedLog.QsoCount, msgUniqueId) If Parameters.MySQL_Parameters.InsertToTable _ And Not scores Is Nothing Then Dim score As LogFilesBandResults = scores.FirstOrDefault(Function(y) If(y.BandId, 0) = 0 And If(y.ModeId, 0) = 0) SaveLogsReceivedEntry(parsedLog.Callsign, parsedLog.Category, msgUniqueId, msg.From.Item(0).EmailAddress, parsedLog.Location, score) End If End If Return ermakLogFound End Function Private Sub WriteLog(message As String) Dim fileName As String Dim file As FileStream = Nothing Dim writer As StreamWriter = Nothing Try fileName = Parameters.GetWorkingDirectoryPath + "\" + Parameters.MailRobot_Log_FileName file = New FileStream(fileName, FileMode.Append) writer = New StreamWriter(file, Encoding.GetEncoding(ENCODING_CP_1251)) message = Now.ToString("dd.MM.yyyy HH:mm:ss") + ": " + message writer.WriteLine(message) If Not _txtBox Is Nothing Then With _txtBox If .Text = String.Empty Then .AppendText(message) Else .AppendText(vbCrLf + message) End If End With End If Catch ex As Exception If Not _mailRobotService Is Nothing Then _mailRobotService.EventLog.WriteEntry("Ошибка в службе """ + _mailRobotService.ServiceName + """: " + message, EventLogEntryType.Information) End If Finally If Not writer Is Nothing Then writer.Close() End If If Not file Is Nothing Then file.Close() End If End Try End Sub Private Sub SaveLogsReceivedEntry _ ( _ callsign As string, _ category As string, _ uniqueId As string, _ eMail As string, _ location As String, _ score As LogFilesBandResults _ ) Dim mult1 As Integer = If(score.Mults.FirstOrDefault(Function(x) x.Type = 1)?.Mult, 0) Dim mult2 As Integer = If(score.Mults.FirstOrDefault(Function(x) x.Type = 2)?.Mult, 0) Dim mult3 As Integer = If(score.Mults.FirstOrDefault(Function(x) x.Type = 3)?.Mult, 0) Dim ds As New LogsReceivedSaving(Parameters.MySQL_Parameters.DBTable, Parameters.MySqlConnection) ds.Delete(Callsign, Category) ds.Insert(Callsign, Now(), eMail, score.Qsos, uniqueId, category, score.Points, mult1, mult2, mult3, score.Score, location) End Sub Private Sub WriteAcceptedLogs(callsign As String, category As String, eMail As String, qsoCount As Integer, uniqueId As String) Dim fileName As String Dim file As FileStream = Nothing Dim writer As StreamWriter = Nothing Dim message As String If Parameters.AcceptedLogs_FileName = String.Empty Then Exit Sub End If Try fileName = Parameters.GetWorkingDirectoryPath + "\" + Parameters.AcceptedLogs_FileName file = New FileStream(fileName, FileMode.Append) writer = New StreamWriter(file, Encoding.GetEncoding(ENCODING_CP_1251)) message = Now.ToString("dd.MM.yyyy HH:mm:ss") + ";" + callsign + ";" + Replace(category, ";", ",") + ";" + eMail + ";" + qsoCount.ToString + ";" + uniqueId writer.WriteLine(message) Catch ex As Exception WriteLog("Ошибка записи в журнал принятых отчетов: " + ex.GetLoggingTrace()) Finally If Not writer Is Nothing Then writer.Close() End If If Not file Is Nothing Then file.Close() End If End Try End Sub Private Sub WriteTextFile(fileName As String, text As String) Dim file As FileStream = Nothing Dim writer As StreamWriter = Nothing Try file = New FileStream(fileName, FileMode.Append) writer = New StreamWriter(file, Encoding.GetEncoding(ENCODING_CP_1251)) writer.WriteLine(text) Catch ex As Exception WriteLog("Ошибка записи в текстовый файл: " + ex.GetLoggingTrace()) Finally If Not writer Is Nothing Then writer.Close() End If If Not file Is Nothing Then file.Close() End If End Try End Sub Private Sub RememberMessageId(messageId As String) Dim fileName As String Dim file As FileStream = Nothing Dim writer As StreamWriter = Nothing Try fileName = Parameters.GetWorkingDirectoryPath + "\" + Parameters.MessageIDsList_FileName file = New FileStream(fileName, FileMode.Append) writer = New StreamWriter(file) writer.WriteLine(messageId) Catch ex As Exception WriteLog(ex.Message) Finally If Not writer Is Nothing Then writer.Close() End If If Not file Is Nothing Then file.Close() End If End Try End Sub Private Sub RecollectMessageIDs() Dim fileName As String Dim file As FileStream = Nothing Dim reader As StreamReader = Nothing Dim messageId As String Try fileName = Parameters.GetWorkingDirectoryPath + "\" + Parameters.MessageIDsList_FileName Dim fileInfo As New FileInfo(fileName) If fileInfo.Exists Then file = New FileStream(fileName, FileMode.Open) reader = New StreamReader(file) Do messageId = reader.ReadLine If Not messageId Is Nothing Then If Not _messageIDs.Contains(messageId) Then _messageIDs.Add(messageId, messageId) End If End If Loop Until messageId Is Nothing End If Catch ex As Exception WriteLog(ex.Message) Finally If Not reader Is Nothing Then reader.Close() End If If Not file Is Nothing Then file.Close() End If End Try End Sub Private Sub SaveBackup(fileName As String, Optional ByVal useSubFolder As Boolean = True) Dim firstFileInfo As New FileInfo(fileName) If firstFileInfo.Exists Then Dim bakFileName As String If useSubFolder Then Dim path As String = IO.Path.GetDirectoryName(fileName) + "\BAK" CreatePath(path) bakFileName = path + "\" + IO.Path.GetFileName(fileName) + ".bak" Else bakFileName = fileName + ".bak" End If Dim secondFileInfo As New FileInfo(bakFileName) If secondFileInfo.Exists Then If Path.GetFileName(bakFileName).Length <= 200 Then SaveBackup(bakFileName, False) End If secondFileInfo.Delete() End If Try firstFileInfo.MoveTo(bakFileName) Catch ex As Exception 'Throw ex WriteLog("Не удалось сохранить резервную копию файла " + bakFileName + ":" + vbNewLine + ex.GetLoggingTrace()) End Try End If End Sub Private Sub CreatePath(path As String) Dim pathInfo As New DirectoryInfo(path) With pathInfo If Not .Exists Then .Create() End If End With End Sub Private Function GetStreamAsByteArray(stream As Stream) As Byte() Dim streamLength As Integer = Convert.ToInt32(stream.Length) Dim fileData As Byte() = New Byte(streamLength) {} stream.Read(fileData, 0, streamLength) stream.Flush() stream.Close() Return fileData End Function #End Region #Region "Public methods" Public Function CheckMessages() As Integer Dim correctLogs As Integer = 0 _pop = New POP3.POP3 Dim logMsg As String Dim popMessages As POP3.MessageIDCollection Dim popNewMessages As New Collection With _pop If Not Parameters.POP3_Parameters.Log_FileName Is Nothing _ AndAlso Parameters.POP3_Parameters.Log_FileName <> String.Empty Then .LogFile = Parameters.GetWorkingDirectoryPath + "\" + Parameters.POP3_Parameters.Log_FileName End If Try If Parameters.POP3_Parameters.TLS Then Dim objSsl As New SSL.SSL() objSsl.SecureProtocol = SSL.SecureProtocol.TLS1 .Connect(Parameters.POP3_Parameters.Server, Parameters.POP3_Parameters.Port, objSsl.GetInterface) Else .Connect(Parameters.POP3_Parameters.Server, Parameters.POP3_Parameters.Port) End If .Login(Parameters.POP3_Parameters.Login, Parameters.POP3_Parameters.Password, Parameters.POP3_Parameters.AuthMode) Catch ex As Exception logMsg = ex.Message While Not ex.InnerException Is Nothing ex = ex.InnerException logMsg += " " + ex.Message End While WriteLog(logMsg) Return 0 End Try End With popMessages = _pop.GetMessageIDCollection() Dim n As Integer = 0 For Each popMsg As POP3.MessageID In popMessages If popMsg.OrdinalPosition > 0 Then If Not _messageIDs.Contains(popMsg.UniqueID) Then popNewMessages.Add(popMsg) n = n + 1 End If End If Next If n > 0 Then logMsg = "Обнаружены новые письма: " + n.ToString + " шт." WriteLog(logMsg) End If For Each popMsg As POP3.MessageID In popNewMessages 'Dim msgSize As Integer = pop.GetMessageSize(popMsg.OrdinalPosition) 'If msgSize > 1048576 Then 'Метр ' pop.DeleteMessage(popMsg.OrdinalPosition) 'Else Try correctLogs = correctLogs + CheckOneMessage(popMsg) Windows.Forms.Application.DoEvents() Catch ex As Exception logMsg = "Не удалось загрузить сообщение с ID = " + popMsg.OrdinalPosition.ToString + ", UniqueID = " + popMsg.UniqueID + "." + vbNewLine + ex.Message WriteLog(logMsg) End Try 'End If Next popMsg _pop.Disconnect() Return correctLogs End Function 'Public Function RecalcResults() As Boolean ' Try ' Dim DS_QSOs As New DS_QSOsTableAdapters.QueriesTableAdapter ' ' DS_QSOs.Connection = Parameters.MsSqlConnection ' ' DS_QSOs.ChangeTimeout(900) ' ' Dim StopWatch As New Stopwatch ' ' StopWatch.Start() ' DS_QSOs.RUN_ALL() ' StopWatch.Stop() ' Dim Elapsed As Integer = CInt(StopWatch.ElapsedMilliseconds / 1000) ' ' WriteLog($"Произведена перекрестная проверка за {Elapsed} сек.") ' ' If Parameters.FTP_Parameters.AutoSave Then ' SaveResults() ' UploadResults() ' End If ' ' Return True ' ' Catch ex As Exception ' WriteLog("Ошибка при перекрестной проверке: " + ex.GetLoggingTrace()) ' Return False ' End Try 'End Function Public Function SaveResults _ ( Optional progressBar As Windows.Forms.ToolStripProgressBar = Nothing, _ Optional resultsOnly As Boolean = false ) As Boolean Try Dim stopWatch As New Stopwatch stopWatch.Start() Dim saver As New UbnSavingGate(Parameters) saver.Save(Parameters, progressBar, resultsOnly) 'SaveUBNs.Save(Parameters, ProgressBar) stopWatch.Stop() Dim elapsed As Integer = CInt(stopWatch.ElapsedMilliseconds / 1000) WriteLog($"Выгружены UBN-файлы за {elapsed} сек.") Return True Catch ex As Exception WriteLog("Ошибка при выгрузке проверенных отчетов: " + ex.GetLoggingTrace()) Return False End Try End Function Public Function UploadResults _ ( resultsOnly As Boolean, _ Optional progressBar As Windows.Forms.ToolStripProgressBar = Nothing, _ Optional labelStatus As Windows.Forms.ToolStripItem = Nothing ) As Boolean Try Dim stopWatch As New Stopwatch stopWatch.Start() Dim saver As New UbnSavingGate(Parameters) saver.Upload(Parameters, resultsOnly, progressBar, labelStatus) 'SaveUBNs.Upload(Parameters, ProgressBar, LabelStatus) stopWatch.Stop() Dim elapsed As Integer = CInt(stopWatch.ElapsedMilliseconds / 1000) WriteLog($"Закачаны UBN-файлы за {elapsed} сек.") Return True Catch ex As Exception WriteLog("Ошибка при закачке проверенных отчетов: " + ex.GetLoggingTrace()) Return False End Try End Function Public Function SendEmail( subject As String, body As String, recipients As SMTP.RecipientCollection, ByRef errorMessage As String, Optional ByVal attachments As Collection = Nothing, Optional ByVal body2 As String = "", Optional ByVal fromAdmin As Boolean = False) As Boolean Dim res As Boolean Dim msgObj As New SMTP.EmailMessage Dim smtpObj As New SMTP.SMTP msgObj.Subject = subject msgObj.Recipients = recipients If fromAdmin Then If Parameters.AdminEMail <> String.Empty Then Dim emails() As String = Split(Parameters.AdminEMail, ";") msgObj.From = New SMTP.Address(emails.First, "Log Uploader Administrator") End If Else msgObj.From = New SMTP.Address(Parameters.SMTP_Parameters.From_Address_EMail, Parameters.SMTP_Parameters.From_Address_Name) End If msgObj.BodyParts.Add(body, SMTP.BodyPartFormat.Plain) If body2 <> String.Empty Then msgObj.BodyParts.Add(body2, SMTP.BodyPartFormat.Plain) End If If Not attachments Is Nothing Then For Each att As Attachment In attachments If att.Name = String.Empty Then att.Name = DEFAULT_ATTACHMENT_NAME End If msgObj.Attachments.Add(att.Stream, att.Name) Next End If If Not Parameters.SMTP_Parameters.Log_FileName Is Nothing _ AndAlso Parameters.SMTP_Parameters.Log_FileName <> String.Empty Then smtpObj.LogFile = Parameters.GetWorkingDirectoryPath + "\" + Parameters.SMTP_Parameters.Log_FileName End If smtpObj.SMTPServers.Add _ ( Parameters.SMTP_Parameters.Server, Parameters.SMTP_Parameters.Port, 10, Parameters.SMTP_Parameters.AuthMode, Parameters.SMTP_Parameters.Login, Parameters.SMTP_Parameters.Password ) Try smtpObj.Send(msgObj) res = True Catch licenseExcep As SMTP.LicenseException errorMessage = "License key error: " + licenseExcep.Message + Environment.NewLine + licenseExcep.GetLoggingTrace() Exit Function Catch fileIoExcep As SMTP.FileIOException errorMessage = "File IO error: " + fileIoExcep.Message + Environment.NewLine + fileIoExcep.GetLoggingTrace() Exit Function Catch smtpAuthExcep As SMTP.SMTPAuthenticationException errorMessage = "SMTP Authentication error: " + smtpAuthExcep.Message + Environment.NewLine + smtpAuthExcep.GetLoggingTrace() Exit Function Catch smtpConnectExcep As SMTP.SMTPConnectionException errorMessage = "SMTP connection error: " + smtpConnectExcep.Message + " Message to " + recipients.Item(0).Email + " was not sent." + Environment.NewLine + smtpConnectExcep.GetLoggingTrace() Exit Function Catch smtpProtocolExcep As SMTP.SMTPProtocolException errorMessage = "SMTP protocol error: " + smtpProtocolExcep.Message + " Message to " + recipients.Item(0).Email + " was not sent." + Environment.NewLine + smtpProtocolExcep.GetLoggingTrace() Exit Function Finally If errorMessage <> String.Empty Then errorMessage = Replace(errorMessage, vbCrLf, String.Empty) WriteLog(errorMessage) End If End Try Return res End Function Public Function SendLog(subject As String, body As String, fileNames() As String, fileBytresArrays As Byte()(), Optional ByRef errorMessage As String = "") As Boolean Dim recipients As New SMTP.RecipientCollection recipients.Add(Parameters.SMTP_Parameters.From_Address_EMail, Parameters.SMTP_Parameters.From_Address_Name) Dim attachments As New Collection Dim length As Integer = fileNames.Length Dim i As Integer For i = 0 To length - 1 Dim stream As New MemoryStream(fileBytresArrays(i)) Dim attachment As New Attachment attachment.Name = fileNames(i) attachment.Stream = stream attachments.Add(attachment) Next body += Environment.NewLine + "Sent from " + Net.Dns.GetHostName + " at " + Date.UtcNow.ToString("dd.MM.yyyy HH:mm:ss") + " UTC" Return SendEmail(subject, body, recipients, errorMessage, attachments, fromAdmin:=True) End Function Public Overloads Function ParseLog(fileName As String, checkerParams As clsChecker_Parameters, ByRef parsedLog As ParsedLog, Optional ByVal loadToDb As Boolean = False) As Boolean Dim fileInfo As New FileInfo(fileName) Dim fileStream As New FileStream(fileName, FileMode.Open) Dim logFileBytesArray As Byte() = GetStreamAsByteArray(fileStream) Dim result As Boolean result = ParseLog(fileName, fileInfo.Length, fileInfo.LastWriteTime, logFileBytesArray, checkerParams, parsedLog, loadToDb) Return result End Function Private Function ParseLogInternal(fStream As Stream, Optional emailDate As Date? = Nothing, Optional fileName As String = Nothing, Optional emailAddress As String = Nothing) As ParsedLog _parser = GetParser() _secondaryParser = GetParser(True) If Not fileName Is Nothing Then _parser.FileName = fileName If Not _secondaryParser Is Nothing Then _secondaryParser.FileName = fileName End If End If If Not emailDate Is Nothing Then _parser.EmailDate = emailDate If Not _secondaryParser Is Nothing Then _secondaryParser.EmailDate = emailDate End If End If If Not emailAddress Is Nothing Then _parser.EmailAddress = emailAddress If Not _secondaryParser Is Nothing Then _secondaryParser.EmailAddress = emailAddress End If End If _parser.LogStream = fStream _parser.ParseLog() Dim parsedLog As ParsedLog = _parser.ParsedLog If (parsedLog.ParseResult.Type = LOG_PARSE_ERROR_TYPE.FORMATTED_LOG_NOT_FOUND _ OrElse parsedLog.ParseResult.Type = LOG_PARSE_ERROR_TYPE.ERRORS_FOUND) _ AndAlso Not _secondaryParser Is Nothing Then fStream.Position = 0 _secondaryParser.LogStream = fStream _secondaryParser.ParseLog() If (_secondaryParser.ParsedLog.ParseResult.Type <> LOG_PARSE_ERROR_TYPE.FORMATTED_LOG_NOT_FOUND _ AndAlso _secondaryParser.ParsedLog.ParseResult.Type <> LOG_PARSE_ERROR_TYPE.ERRORS_FOUND) _ OrElse (String.IsNullOrWhiteSpace(parsedLog.Callsign) _ AndAlso String.IsNullOrWhiteSpace(parsedLog.Band)) Then parsedLog = _secondaryParser.ParsedLog End If End If Return parsedLog End Function Public Overloads Function ParseLog(logFileName As String, logFileSize As Long, logFileLastWriteTime As Date, logFileBytesArray As Byte(), checkerParams As clsChecker_Parameters, ByRef parsedLog As ParsedLog, Optional ByVal loadToDb As Boolean = False) As Boolean Dim result As Boolean = True Dim fStream As Stream = New MemoryStream(logFileBytesArray) ' _parser = GetParser() ' _secondaryParser = GetParser(True) ' ' _parser.LogStream = fStream ' _parser.ParseLog() ' parsedLog = _parser.ParsedLog ' ' If parsedLog.ParseResult.Type = LOG_PARSE_ERROR_TYPE.FORMATTED_LOG_NOT_FOUND _ ' OrElse parsedLog.ParseResult.Type = LOG_PARSE_ERROR_TYPE.ERRORS_FOUND _ ' AndAlso Not _secondaryParser Is Nothing Then ' fStream = New MemoryStream(logFileBytesArray) ' _secondaryParser.LogStream = fStream ' _secondaryParser.ParseLog() ' If (_secondaryParser.ParsedLog.ParseResult.Type <> LOG_PARSE_ERROR_TYPE.FORMATTED_LOG_NOT_FOUND _ ' AndAlso _secondaryParser.ParsedLog.ParseResult.Type <> LOG_PARSE_ERROR_TYPE.ERRORS_FOUND) _ ' OrElse ' (String.IsNullOrWhiteSpace(parsedLog.Callsign) _ ' AndAlso String.IsNullOrWhiteSpace(parsedLog.Band)) Then ' parsedLog = _secondaryParser.ParsedLog ' End If ' End If parsedLog = ParseLogInternal(fStream) Dim log As Log = LogScoringGate.ConvertLog(parsedLog, logFileName, logFileSize, logFileLastWriteTime) Dim scores As IEnumerable(Of LogFilesBandResults) = LogScoringGate.GetScore(log, True, ResultsType.Claimed).ToList() ParsedLog.ClaimedResultsText = LogScoringGate.GetTextScore(log, scores) If parsedLog.ParseResult.Type = LOG_PARSE_ERROR_TYPE.NONE _ Or parsedLog.ParseResult.Type = LOG_PARSE_ERROR_TYPE.WARNING _ Or parsedLog.Category = "MODEL" Then If loadToDb Then Dim errorMessage As String = String.Empty Dim isSavedSuccesfully As Boolean = LogScoringGate.SaveLog(log, parsedLog.Category, parsedLog.Band, parsedLog.ContestDate, errorMessage) If Not isSavedSuccesfully Then parsedLog.ParseResult.AddError($"Error saving log to database: {errorMessage}", 0) parsedLog.ParseResult.AddErrorRu($"Не удалось сохранить отчет в БД: {errorMessage}", 0) End If If Parameters.MySQL_Parameters.InsertToTable _ And Not scores Is Nothing Then Dim score As LogFilesBandResults = scores.FirstOrDefault(Function(y) If(y.BandId, 0) = 0 And If(y.ModeId, 0) = 0) SaveLogsReceivedEntry(parsedLog.Callsign, parsedLog.Category, String.Empty, String.Empty, parsedLog.Location, score) End If End If End If parsedLog.ParseResult.AddInfo("Encoding: " + parsedLog.Encoding.EncodingName) parsedLog.ParseResult.AddInfoRu("Кодировка: " + parsedLog.Encoding.EncodingName) Select Case parsedLog.ParseResult.Type Case LOG_PARSE_ERROR_TYPE.NONE parsedLog.ParseResult.AddSuccessRu("Отчет корректен и не содержит ошибок.", priority:=0) parsedLog.ParseResult.AddSuccess("The log is correct and has no mistakes.", priority:=0) Case LOG_PARSE_ERROR_TYPE.FORMATTED_LOG_NOT_FOUND If (checkerParams.LogFormat = LOG_FORMAT.EDI) Then parsedLog.ParseResult.AddErrorRu("Отчет в формате EDI(RU) не найден.", priority:=0) parsedLog.ParseResult.AddError("The log in EDI(REG1TEST) format not found.", priority:=0) ElseIf (checkerParams.LogFormat = LOG_FORMAT.ERMAK) Then parsedLog.ParseResult.AddErrorRu("Отчет в формате ЕРМАК не найден.", priority:=0) parsedLog.ParseResult.AddError("The log in Cabrillo format not found.", priority:=0) End If Case LOG_PARSE_ERROR_TYPE.ERRORS_FOUND parsedLog.ParseResult.AddErrorRu("ОТЧЕТ НЕ ПРИНЯТ! Найдены ошибки.", priority:=0) parsedLog.ParseResult.AddError("YOUR LOG IS NOT ACCEPTED. There was mistakes found.", priority:=0) Case LOG_PARSE_ERROR_TYPE.OTHER_CONTEST parsedLog.ParseResult.AddErrorRu("Вы пытаетесь загрузить отчет за другие соревнования.", priority:=0) parsedLog.ParseResult.AddError("You are trying to upload a log for another contest.", priority:=0) Case LOG_PARSE_ERROR_TYPE.WARNING parsedLog.ParseResult.AddWarningRu("Отчет принят с замечаниями. Если Вы считаете замечания несущественными, ничего предпринимать не следует, спасибо за отчет!", priority:=0) parsedLog.ParseResult.AddWarning("There was warnings found. If you are sure the warnings aren't significant, nothing should be done, thanks for the log!", priority:=0) End Select Select Case parsedLog.ParseResult.Type Case LOG_PARSE_ERROR_TYPE.NONE, LOG_PARSE_ERROR_TYPE.WARNING result = result Case Else result = result And False End Select Return result End Function #End Region End Class