From c91a7b82c785ab24cbd9d1f533d4c49847d3b6fe Mon Sep 17 00:00:00 2001 From: pitzm Date: Wed, 25 Sep 2024 16:08:51 +0200 Subject: [PATCH] EMailProfiler.Common: Neue Extract Attachments-Logik & InfoMail Logik --- App/EmailProfiler.Common/ClassCurrent.vb | 1 + .../Data/EmailAttachment.vb | 27 ++ .../EmailProfiler.Common.vbproj | 3 +- .../{ => Enum}/ErrorCode.vb | 1 + App/EmailProfiler.Common/clsWorkEmail.vb | 349 ++++++++++++++++-- App/wisag_check_Att/Form1.Designer.vb | 94 +++-- App/wisag_check_Att/Form1.resx | 34 +- App/wisag_check_Att/Form1.vb | 116 +++++- App/wisag_check_Att/wisag_check_Att.vbproj | 3 + 9 files changed, 548 insertions(+), 80 deletions(-) create mode 100644 App/EmailProfiler.Common/Data/EmailAttachment.vb rename App/EmailProfiler.Common/{ => Enum}/ErrorCode.vb (80%) diff --git a/App/EmailProfiler.Common/ClassCurrent.vb b/App/EmailProfiler.Common/ClassCurrent.vb index de94c92..ff4883d 100644 --- a/App/EmailProfiler.Common/ClassCurrent.vb +++ b/App/EmailProfiler.Common/ClassCurrent.vb @@ -53,4 +53,5 @@ Public Class ClassCurrent Public Shared Property TEMP_WORK_FILES As List(Of String) = New List(Of String) Public Shared Property GDPictureLicense As String = "None" + Public Shared Property EmailAttachments As List(Of EmailAttachment) = New List(Of EmailAttachment) End Class diff --git a/App/EmailProfiler.Common/Data/EmailAttachment.vb b/App/EmailProfiler.Common/Data/EmailAttachment.vb new file mode 100644 index 0000000..e6b64f6 --- /dev/null +++ b/App/EmailProfiler.Common/Data/EmailAttachment.vb @@ -0,0 +1,27 @@ +Imports System.IO +Imports GdPicture14 + +Public Class EmailAttachment + Public OrgFileName As String = "" + Public DestFileName As String = "" + Public DestFilePath As String = "" + + Public FileStatus As GdPictureStatus = GdPictureStatus.OK + + Public IsValidExtension As Boolean = True + Public SendInfoMailNecessary As Boolean = False + Public ErrorCodeValue As ErrorCode = ErrorCode.Unknown + + Public EmbeddedFiles As List(Of EmailAttachment) = New List(Of EmailAttachment) + + Public ReadOnly Property Extension As String + Get + If String.IsNullOrEmpty(OrgFileName) = False Then + Return Path.GetExtension(OrgFileName) + Else + Return String.Empty + End If + End Get + End Property + +End Class diff --git a/App/EmailProfiler.Common/EmailProfiler.Common.vbproj b/App/EmailProfiler.Common/EmailProfiler.Common.vbproj index 22446cc..0e84716 100644 --- a/App/EmailProfiler.Common/EmailProfiler.Common.vbproj +++ b/App/EmailProfiler.Common/EmailProfiler.Common.vbproj @@ -115,13 +115,14 @@ + - + diff --git a/App/EmailProfiler.Common/ErrorCode.vb b/App/EmailProfiler.Common/Enum/ErrorCode.vb similarity index 80% rename from App/EmailProfiler.Common/ErrorCode.vb rename to App/EmailProfiler.Common/Enum/ErrorCode.vb index c8bdb26..50409a3 100644 --- a/App/EmailProfiler.Common/ErrorCode.vb +++ b/App/EmailProfiler.Common/Enum/ErrorCode.vb @@ -3,4 +3,5 @@ NoAttachments = 10001 SenderValidationFailed = 10002 PDFStructureCorrupt = 10003 + FileExtensionNotValid = 10004 End Enum diff --git a/App/EmailProfiler.Common/clsWorkEmail.vb b/App/EmailProfiler.Common/clsWorkEmail.vb index 9e8d04e..3ec86b8 100644 --- a/App/EmailProfiler.Common/clsWorkEmail.vb +++ b/App/EmailProfiler.Common/clsWorkEmail.vb @@ -14,6 +14,7 @@ Imports DigitalData.Modules.Patterns Imports System.Data.SqlClient Imports GdPicture14 Imports Limilabs.Client.IMAP +Imports System.Net.NetworkInformation Public Class clsWorkEmail Private Const SUBJECT_MAX_LENGTH = 25 @@ -46,6 +47,12 @@ Public Class clsWorkEmail Private ReadOnly _RejectionTemplateId As Integer = 0 Private ReadOnly _InfoTemplateId As Integer = 0 + Private ReadOnly _LicenseManager As New LicenseManager + + Private ReadOnly _ValidExtensions As List(Of String) + Private ReadOnly _GraphicExtensions As List(Of String) + + Private _worked_email As Boolean = False Sub New(LogConf As LogConfig, ConStr As String, WmConStr As String, pUseWindream As Boolean, EmailAccountID As Integer, EmlProfPraefix As String, pRejectionTemplateId As Integer, pInfoTemplateId As Integer) @@ -60,6 +67,8 @@ Public Class clsWorkEmail _InfoTemplateId = pInfoTemplateId _Logger.Debug($"_RejectionTemplateId: {_RejectionTemplateId}") + _ValidExtensions = New List(Of String) From {"pdf", "xls", "xlsx", "doc", "docx", "ppt", "pptx"} + _GraphicExtensions = New List(Of String) From {"jpg", "bmp", "jpeg", "gif", "png", "xml"} If pUseWindream Then _windream = New clsWindream_allgemein(LogConf) @@ -67,6 +76,8 @@ Public Class clsWorkEmail _windreamConnectionString = WmConStr End If + _LicenseManager.RegisterKEY(GDPictureLicense) + _EmailAccountID = EmailAccountID SUBJECT_PRAFIX = EmlProfPraefix Catch ex As Exception @@ -214,9 +225,11 @@ Public Class clsWorkEmail If IS_LOCAL_TEST = False Then InsertHistoryEntry(CurrentMail) End If - End If - Return True + ' Jetzt werden die ggf gefundenen Attachment-Fehler überprüft und verarbeitet + SendMailToSenderIfAttachmentsAreNotValid() + Return True + End If End If @@ -226,6 +239,85 @@ Public Class clsWorkEmail End Try End Function + ''' + ''' Wenn beim Herauslösen der Attachments festgestellt wurde, + ''' das ein Teil der Attachments fehlerhaft war, wird der Absender hier + ''' darüber informiert. + ''' + Private Sub SendMailToSenderIfAttachmentsAreNotValid() + + Dim oHtmlFilenameList As String = GetHtmlFilenameList() + + If oHtmlFilenameList.IsNotNullOrEmpty() Then + + AddToEmailQueueMSSQL(CurrentMail.MessageId, "", "Attachment invalid", _EmailAccountID, _InfoTemplateId, ErrorCode.PDFStructureCorrupt, oHtmlFilenameList, "") + + End If + End Sub + + ''' + ''' Stellt die Dateinamen der Dateien zusammen, die nicht valide sind. + ''' Die Ausgabe erfolgt als HTML-Liste + ''' + Private Function GetHtmlFilenameList() As String + Dim filenameHtmlString As String = String.Empty + Dim oComment As String = String.Empty + + For Each attachmentItem In EmailAttachments + + If attachmentItem.SendInfoMailNecessary = True Then + + oComment = GetErrorCodeComment(attachmentItem.ErrorCodeValue) + AddTrackingStatusMSSQL(CurrentMail.MessageId, attachmentItem.OrgFileName, "FILE CONSISTENCY NOT OK", oComment, "EMail Profiler") + + filenameHtmlString += "
  • " + attachmentItem.OrgFileName + "
  • " + End If + + ' prüfe evtl. eingebettete Anhänge + Dim embeddedFilenamesHtmlString As String = String.Empty + If attachmentItem.EmbeddedFiles.Count > 0 Then + + For Each embeddedItem In attachmentItem.EmbeddedFiles + If embeddedItem.SendInfoMailNecessary = True Then + + oComment = GetErrorCodeComment(embeddedItem.ErrorCodeValue) + AddTrackingStatusMSSQL(CurrentMail.MessageId, embeddedItem.OrgFileName, "EMBEDDED FILE CONSISTENCY NOT OK", oComment, "EMail Profiler") + + embeddedFilenamesHtmlString += "
  • " + embeddedItem.OrgFileName + "
  • " + End If + Next + + If embeddedFilenamesHtmlString.IsNotNullOrEmpty() Then + embeddedFilenamesHtmlString = "
      " + embeddedFilenamesHtmlString + "
    " + End If + End If + + If embeddedFilenamesHtmlString.IsNotNullOrEmpty() Then + filenameHtmlString += embeddedFilenamesHtmlString + End If + + Next + + If filenameHtmlString.IsNotNullOrEmpty() Then + filenameHtmlString = "
      " + filenameHtmlString + "
    " + End If + + Return filenameHtmlString + End Function + + Private Function GetErrorCodeComment(errorCodeValue As ErrorCode) As String + + Dim retValue As String = String.Empty + + If errorCodeValue = ErrorCode.FileExtensionNotValid Then + retValue = "File Extension not valid" + ElseIf errorCodeValue = ErrorCode.PDFStructureCorrupt Then + retValue = "PDF Structure corrupt" + End If + + Return retValue + End Function + ''' ''' Method to decide wether we use the old or the new ''' Rejection E-mail method. @@ -567,8 +659,8 @@ Public Class clsWorkEmail If COPY2HDD(pCurrentMail, oRow("COPY_2_HDD"), oRow("PATH_ORIGINAL"), oRow("PATH_EMAIL_ERRORS"), True) = True Then - If EXTRACT_ATTACHMENTS(pCurrentMail, oExtractMainPath, oRow("PATH_EMAIL_ERRORS")) = True Then - + 'If EXTRACT_ATTACHMENTS(pCurrentMail, oExtractMainPath, oRow("PATH_EMAIL_ERRORS")) = True Then + If ExtractAttachments(pCurrentMail, oExtractMainPath) = True Then Return True Else _Logger.Warn("!##Returning false from EXTRACT_ATTACHMENTS!##") @@ -577,11 +669,8 @@ Public Class clsWorkEmail Else Return False End If - - Next - Return True Catch ex As Exception _Logger.Error(ex) @@ -802,6 +891,222 @@ Public Class clsWorkEmail Return False End Try End Function + + Private Function ExtractAttachments(pCurrentMail As MailContainer, pExtractPath As String) As Boolean + _Logger.Debug("In ExtractAttachments - pExtractPath = [{0}]", pExtractPath) + + CURRENT_ATTMT_COUNT = 0 + TEMP_WORK_FILES.Clear() + EmailAttachments.Clear() + + If String.IsNullOrEmpty(CurrentTempMailPath) Then + _Logger.Warn("ExtractAttachments() CurrentTempMailPath is NOTHING") + Return True + End If + + If File.Exists(CurrentTempMailPath) = False Then + _Logger.Warn($"ExtractAttachments() {CurrentTempMailPath} not existing") + Return True + End If + + Dim oExtractTempPath As String = GetExtractTempPath(pExtractPath) + If String.IsNullOrEmpty(oExtractTempPath) Then + _Logger.Warn("ExtractAttachments() oExtractTempPath is NOTHING") + Return True + End If + + Dim oAttachmentCount As Integer = 0 + + For Each oAttachment As MimeData In pCurrentMail.Mail.Attachments + _Logger.Info("Working on Attachment [{0}]", oAttachment.SafeFileName) + + Dim oEmailAttachment As EmailAttachment = New EmailAttachment() With + { + .OrgFileName = oAttachment.SafeFileName + } + EmailAttachments.Add(oEmailAttachment) + + If ValidateFileExtension(oEmailAttachment) = False Then + Continue For + End If + + oEmailAttachment.DestFileName = $"{pCurrentMail.MessageId}~Attm{oAttachmentCount}{oEmailAttachment.Extension}" + _Logger.Debug("Final Filename for Attachment: [{0}]", oEmailAttachment.DestFileName) + + oEmailAttachment.DestFilePath = Path.Combine(oExtractTempPath, oEmailAttachment.DestFileName) + _Logger.Debug("Final Path for Attachment: [{0}]", oEmailAttachment.DestFilePath) + + If CleanUpFilePath(oEmailAttachment.DestFilePath) = False Then + _Logger.Warn("ExtractAttachments() Could not clean up filepath!") + MESSAGE_ERROR = True + Continue For + End If + + ' Sichere Datei auf Platte + If SaveFileToDisk(oAttachment, oEmailAttachment.DestFilePath) = True Then + _Logger.Info(String.Format("Attachment saved to [{0}]", oEmailAttachment.DestFilePath)) + + ' Schreibe Satz nach EMLP_HISTORY + If (InsertAttachmentHistoryEntry(pCurrentMail, oEmailAttachment.OrgFileName, oEmailAttachment.DestFileName)) = True Then + oAttachmentCount += 1 + End If + Else + _Logger.Warn($"Error while saving AttachmentName: {oEmailAttachment.DestFilePath}") + MESSAGE_ERROR = True + Continue For + End If + + ' Verarbeite PDF Files + If oEmailAttachment.Extension.Equals(".pdf", StringComparison.InvariantCultureIgnoreCase) = True Then + + Dim oGdPicturePDF As New GdPicturePDF() + Dim oStatus As GdPictureStatus = oGdPicturePDF.LoadFromFile(oEmailAttachment.DestFilePath, True) + If oStatus = GdPictureStatus.OK Then + ' Verarbeite Embedded Attachments + WorkEmbeddedAttachments(oEmailAttachment, oGdPicturePDF) + + Else + oAttachmentCount -= 1 + CleanUpFilePath(oEmailAttachment.DestFilePath) + oEmailAttachment.FileStatus = oStatus + oEmailAttachment.ErrorCodeValue = ErrorCode.PDFStructureCorrupt + oEmailAttachment.SendInfoMailNecessary = True + + MESSAGE_ERROR = True + Continue For + End If + + End If + + + TEMP_WORK_FILES.Add(oEmailAttachment.DestFilePath) + Next + + CURRENT_ATTMT_COUNT = oAttachmentCount + + If MESSAGE_ERROR = True Then + WorkTempFiles("delete") + Return False + End If + + WorkTempFiles("move") + Return True + + End Function + + Private Sub WorkEmbeddedAttachments(pEmailAttachment As EmailAttachment, pGDPicturePDF As GdPicturePDF) + + Dim embeddedFileCount As Integer = pGDPicturePDF.GetEmbeddedFileCount() + If embeddedFileCount <= 0 Then + ' nothing to do + Return + End If + + For i As Integer = 0 To embeddedFileCount - 1 + Dim oEmbAttName As String = pGDPicturePDF.GetEmbeddedFileName(i) + + Dim oEmbeddedFile As EmailAttachment = New EmailAttachment() With + { + .OrgFileName = oEmbAttName + } + pEmailAttachment.EmbeddedFiles.Add(oEmbeddedFile) + + oEmbeddedFile.FileStatus = pGDPicturePDF.GetStat() + If oEmbeddedFile.FileStatus = GdPictureStatus.OK Then + If ValidateFileExtension(oEmbeddedFile) = False Then + Continue For + End If + + Dim FileSize As Integer = pGDPicturePDF.GetEmbeddedFileSize(i) + If pGDPicturePDF.GetStat() = GdPictureStatus.OK Then + Dim FileData As Byte() = New Byte(FileSize) {} + Dim status As GdPictureStatus = pGDPicturePDF.ExtractEmbeddedFile(0, FileData) + + oEmbeddedFile.FileStatus = status + If status <> GdPictureStatus.OK Or FileSize = 0 Then + oEmbeddedFile.ErrorCodeValue = ErrorCode.PDFStructureCorrupt + oEmbeddedFile.SendInfoMailNecessary = True + Continue For + End If + End If + End If + Next + + End Sub + + Private Function SaveFileToDisk(pAttachment As MimeData, pAttachmentFilePath As String) As Boolean + + Try + _Logger.Debug(String.Format("Trying to save attachment [{0}]", pAttachmentFilePath)) + pAttachment.Save(pAttachmentFilePath) + + Dim oFileInfo As New FileInfo(pAttachmentFilePath) + Dim oFileLength As Long = oFileInfo.Length + If oFileLength <= 2 Then + _Logger.Warn($"##!! oFileLength for AttachmentObjects is <=2 !!##") + CleanUpFilePath(pAttachmentFilePath) + Return False + End If + + Return True + + Catch ex As Exception + _Logger.Error(ex) + Return False + End Try + End Function + + Private Function CleanUpFilePath(pFilePath As String) As Boolean + Try + If File.Exists(pFilePath) Then + _Logger.Info("File [{0}] will be deleted!", pFilePath) + File.Delete(pFilePath) + End If + + Return True + + Catch ex As Exception + _Logger.Error(ex) + Return False + End Try + End Function + + Private Function GetExtractTempPath(pExtractPath As String) As String + Try + Dim oExtractTempPath = Path.Combine(pExtractPath, "Temp") + If Directory.Exists(oExtractTempPath) = False Then + Directory.CreateDirectory(oExtractTempPath) + End If + + Return oExtractTempPath + + Catch ex As Exception + _Logger.Error(ex) + Return String.Empty + End Try + End Function + + Private Function ValidateFileExtension(pAttachmentData As EmailAttachment) As Boolean + _Logger.Debug("Validate extension of [{0}]", pAttachmentData.OrgFileName) + + Dim lowerFilename = pAttachmentData.OrgFileName.ToLower + Dim oIsValidExtension = _ValidExtensions.Any(Function(ext) lowerFilename.EndsWith(ext)) + Dim oIsGraphicExtension = _GraphicExtensions.Any(Function(ext) lowerFilename.EndsWith(ext)) + + If oIsValidExtension = False Then + pAttachmentData.IsValidExtension = False + If oIsGraphicExtension = False Then + _Logger.Warn("File has no valid extension, and it has no graphic extension. In this case we have to inform the sender!") + pAttachmentData.SendInfoMailNecessary = True + pAttachmentData.ErrorCodeValue = ErrorCode.FileExtensionNotValid + End If + + Return False + End If + + Return True + End Function + Private Function EXTRACT_ATTACHMENTS(pCurrentMail As MailContainer, pExtractPath As String, pErrorPath As String) _Logger.Debug("In EXTRACT_ATTACHMENTS...") @@ -981,24 +1286,26 @@ Public Class clsWorkEmail Return False End Try End Function - Private Sub WorkTempFiles(pACT As String) - For Each _file In TEMP_WORK_FILES - _Logger.Debug("Working ({0}) on temp work file: [{1}]", pACT, _file) - If File.Exists(_file) Then - If pACT = "Delete" Then - Try + Private Sub WorkTempFiles(pAction As String) + For Each _file In TEMP_WORK_FILES + _Logger.Debug("Working ({0}) on temp work file: [{1}]", pAction, _file) + Try + If File.Exists(_file) Then + If pAction = "Delete" Then File.Delete(_file) - Catch ex As Exception - _Logger.Error(ex) - _Logger.Warn("Could not delete the tempworkfile : [{0}]", _file) - End Try - ElseIf pACT = "move" Then - File.Move(_file, _file.Replace("\Temp", "")) - End If + ElseIf pAction = "move" Then + File.Move(_file, _file.Replace("\Temp", "")) + End If - End If + End If + Catch ex As Exception + _Logger.Error(ex) + _Logger.Warn("Could not delete/move the tempworkfile : [{0}]", _file) + MESSAGE_ERROR = True + End Try Next + TEMP_WORK_FILES.Clear() End Sub diff --git a/App/wisag_check_Att/Form1.Designer.vb b/App/wisag_check_Att/Form1.Designer.vb index d743915..7dcbabe 100644 --- a/App/wisag_check_Att/Form1.Designer.vb +++ b/App/wisag_check_Att/Form1.Designer.vb @@ -24,53 +24,34 @@ Partial Class Form1 Private Sub InitializeComponent() Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(Form1)) Me.RibbonControl1 = New DevExpress.XtraBars.Ribbon.RibbonControl() - Me.RibbonPage1 = New DevExpress.XtraBars.Ribbon.RibbonPage() - Me.RibbonPageGroup1 = New DevExpress.XtraBars.Ribbon.RibbonPageGroup() - Me.RibbonStatusBar1 = New DevExpress.XtraBars.Ribbon.RibbonStatusBar() Me.BarButtonItem1 = New DevExpress.XtraBars.BarButtonItem() - Me.FolderBrowserDialog1 = New System.Windows.Forms.FolderBrowserDialog() Me.bsifolderbrowser = New DevExpress.XtraBars.BarStaticItem() Me.BarButtonItem2 = New DevExpress.XtraBars.BarButtonItem() Me.BarButtonItem3 = New DevExpress.XtraBars.BarButtonItem() + Me.bsitemppath = New DevExpress.XtraBars.BarStaticItem() + Me.RibbonPage1 = New DevExpress.XtraBars.Ribbon.RibbonPage() + Me.RibbonPageGroup1 = New DevExpress.XtraBars.Ribbon.RibbonPageGroup() Me.RibbonPageGroup2 = New DevExpress.XtraBars.Ribbon.RibbonPageGroup() + Me.RibbonStatusBar1 = New DevExpress.XtraBars.Ribbon.RibbonStatusBar() + Me.FolderBrowserDialog1 = New System.Windows.Forms.FolderBrowserDialog() Me.ListBox1 = New System.Windows.Forms.ListBox() - Me.bsitemppath = New DevExpress.XtraBars.BarStaticItem() + Me.RibbonPageGroup3 = New DevExpress.XtraBars.Ribbon.RibbonPageGroup() + Me.BarButtonItem4 = New DevExpress.XtraBars.BarButtonItem() + Me.OpenFileDialog1 = New System.Windows.Forms.OpenFileDialog() CType(Me.RibbonControl1, System.ComponentModel.ISupportInitialize).BeginInit() Me.SuspendLayout() ' 'RibbonControl1 ' Me.RibbonControl1.ExpandCollapseItem.Id = 0 - Me.RibbonControl1.Items.AddRange(New DevExpress.XtraBars.BarItem() {Me.RibbonControl1.SearchEditItem, Me.RibbonControl1.ExpandCollapseItem, Me.BarButtonItem1, Me.bsifolderbrowser, Me.BarButtonItem2, Me.BarButtonItem3, Me.bsitemppath}) + Me.RibbonControl1.Items.AddRange(New DevExpress.XtraBars.BarItem() {Me.RibbonControl1.ExpandCollapseItem, Me.RibbonControl1.SearchEditItem, Me.BarButtonItem1, Me.bsifolderbrowser, Me.BarButtonItem2, Me.BarButtonItem3, Me.bsitemppath, Me.BarButtonItem4}) Me.RibbonControl1.Location = New System.Drawing.Point(0, 0) - Me.RibbonControl1.MaxItemId = 6 + Me.RibbonControl1.MaxItemId = 7 Me.RibbonControl1.Name = "RibbonControl1" Me.RibbonControl1.Pages.AddRange(New DevExpress.XtraBars.Ribbon.RibbonPage() {Me.RibbonPage1}) Me.RibbonControl1.Size = New System.Drawing.Size(800, 150) Me.RibbonControl1.StatusBar = Me.RibbonStatusBar1 ' - 'RibbonPage1 - ' - Me.RibbonPage1.Groups.AddRange(New DevExpress.XtraBars.Ribbon.RibbonPageGroup() {Me.RibbonPageGroup1, Me.RibbonPageGroup2}) - Me.RibbonPage1.Name = "RibbonPage1" - Me.RibbonPage1.Text = "RibbonPage1" - ' - 'RibbonPageGroup1 - ' - Me.RibbonPageGroup1.ItemLinks.Add(Me.BarButtonItem1) - Me.RibbonPageGroup1.ItemLinks.Add(Me.BarButtonItem3) - Me.RibbonPageGroup1.Name = "RibbonPageGroup1" - Me.RibbonPageGroup1.Text = "Konfig" - ' - 'RibbonStatusBar1 - ' - Me.RibbonStatusBar1.ItemLinks.Add(Me.bsifolderbrowser) - Me.RibbonStatusBar1.ItemLinks.Add(Me.bsitemppath) - Me.RibbonStatusBar1.Location = New System.Drawing.Point(0, 423) - Me.RibbonStatusBar1.Name = "RibbonStatusBar1" - Me.RibbonStatusBar1.Ribbon = Me.RibbonControl1 - Me.RibbonStatusBar1.Size = New System.Drawing.Size(800, 27) - ' 'BarButtonItem1 ' Me.BarButtonItem1.Caption = "choose directory" @@ -100,12 +81,42 @@ Partial Class Form1 Me.BarButtonItem3.ImageOptions.SvgImage = CType(resources.GetObject("BarButtonItem3.ImageOptions.SvgImage"), DevExpress.Utils.Svg.SvgImage) Me.BarButtonItem3.Name = "BarButtonItem3" ' + 'bsitemppath + ' + Me.bsitemppath.Caption = "BarStaticItem1" + Me.bsitemppath.Id = 5 + Me.bsitemppath.ImageOptions.SvgImage = CType(resources.GetObject("bsitemppath.ImageOptions.SvgImage"), DevExpress.Utils.Svg.SvgImage) + Me.bsitemppath.Name = "bsitemppath" + Me.bsitemppath.PaintStyle = DevExpress.XtraBars.BarItemPaintStyle.CaptionGlyph + ' + 'RibbonPage1 + ' + Me.RibbonPage1.Groups.AddRange(New DevExpress.XtraBars.Ribbon.RibbonPageGroup() {Me.RibbonPageGroup1, Me.RibbonPageGroup2, Me.RibbonPageGroup3}) + Me.RibbonPage1.Name = "RibbonPage1" + Me.RibbonPage1.Text = "RibbonPage1" + ' + 'RibbonPageGroup1 + ' + Me.RibbonPageGroup1.ItemLinks.Add(Me.BarButtonItem1) + Me.RibbonPageGroup1.ItemLinks.Add(Me.BarButtonItem3) + Me.RibbonPageGroup1.Name = "RibbonPageGroup1" + Me.RibbonPageGroup1.Text = "Konfig" + ' 'RibbonPageGroup2 ' Me.RibbonPageGroup2.ItemLinks.Add(Me.BarButtonItem2) Me.RibbonPageGroup2.Name = "RibbonPageGroup2" Me.RibbonPageGroup2.Text = "Run" ' + 'RibbonStatusBar1 + ' + Me.RibbonStatusBar1.ItemLinks.Add(Me.bsifolderbrowser) + Me.RibbonStatusBar1.ItemLinks.Add(Me.bsitemppath) + Me.RibbonStatusBar1.Location = New System.Drawing.Point(0, 423) + Me.RibbonStatusBar1.Name = "RibbonStatusBar1" + Me.RibbonStatusBar1.Ribbon = Me.RibbonControl1 + Me.RibbonStatusBar1.Size = New System.Drawing.Size(800, 27) + ' 'ListBox1 ' Me.ListBox1.Dock = System.Windows.Forms.DockStyle.Fill @@ -115,13 +126,23 @@ Partial Class Form1 Me.ListBox1.Size = New System.Drawing.Size(800, 273) Me.ListBox1.TabIndex = 2 ' - 'bsitemppath + 'RibbonPageGroup3 ' - Me.bsitemppath.Caption = "BarStaticItem1" - Me.bsitemppath.Id = 5 - Me.bsitemppath.ImageOptions.SvgImage = CType(resources.GetObject("BarStaticItem1.ImageOptions.SvgImage"), DevExpress.Utils.Svg.SvgImage) - Me.bsitemppath.Name = "bsitemppath" - Me.bsitemppath.PaintStyle = DevExpress.XtraBars.BarItemPaintStyle.CaptionGlyph + Me.RibbonPageGroup3.ItemLinks.Add(Me.BarButtonItem4) + Me.RibbonPageGroup3.Name = "RibbonPageGroup3" + Me.RibbonPageGroup3.Text = "PDF Handling" + ' + 'BarButtonItem4 + ' + Me.BarButtonItem4.Caption = "Extract PDF-Attachments" + Me.BarButtonItem4.Id = 6 + Me.BarButtonItem4.ImageOptions.SvgImage = CType(resources.GetObject("BarButtonItem4.ImageOptions.SvgImage"), DevExpress.Utils.Svg.SvgImage) + Me.BarButtonItem4.Name = "BarButtonItem4" + ' + 'OpenFileDialog1 + ' + Me.OpenFileDialog1.Filter = "PDF Files|*.pdf" + Me.OpenFileDialog1.InitialDirectory = "e:\" ' 'Form1 ' @@ -151,4 +172,7 @@ Partial Class Form1 Friend WithEvents RibbonPageGroup2 As DevExpress.XtraBars.Ribbon.RibbonPageGroup Friend WithEvents ListBox1 As ListBox Friend WithEvents bsitemppath As DevExpress.XtraBars.BarStaticItem + Friend WithEvents BarButtonItem4 As DevExpress.XtraBars.BarButtonItem + Friend WithEvents RibbonPageGroup3 As DevExpress.XtraBars.Ribbon.RibbonPageGroup + Friend WithEvents OpenFileDialog1 As OpenFileDialog End Class diff --git a/App/wisag_check_Att/Form1.resx b/App/wisag_check_Att/Form1.resx index f8d231f..47ef8ef 100644 --- a/App/wisag_check_Att/Form1.resx +++ b/App/wisag_check_Att/Form1.resx @@ -120,7 +120,7 @@ - AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjE5LjIsIFZlcnNpb249MTkuMi4z + AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIxLjIsIFZlcnNpb249MjEuMi40 LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAAJQCAAAC77u/ PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi @@ -138,7 +138,7 @@ - AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjE5LjIsIFZlcnNpb249MTkuMi4z + AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIxLjIsIFZlcnNpb249MjEuMi40 LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAAJQCAAAC77u/ PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi @@ -156,7 +156,7 @@ - AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjE5LjIsIFZlcnNpb249MTkuMi4z + AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIxLjIsIFZlcnNpb249MjEuMi40 LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAAAMDAAAC77u/ PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi @@ -176,7 +176,7 @@ - AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjE5LjIsIFZlcnNpb249MTkuMi4z + AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIxLjIsIFZlcnNpb249MjEuMi40 LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAAJQCAAAC77u/ PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi @@ -192,9 +192,9 @@ NC43QzMyLjEsMTQuMywzMS44LDE0LDMxLjMsMTR6IiBjbGFzcz0iWWVsbG93IiAvPg0KPC9zdmc+Cw== - + - AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjE5LjIsIFZlcnNpb249MTkuMi4z + AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIxLjIsIFZlcnNpb249MjEuMi40 LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAAJQCAAAC77u/ PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi @@ -208,9 +208,31 @@ MC40QzIuMSwyNS4zLDIuMiwyNS4zLDIuMiwyNS4yeiIgY2xhc3M9IlllbGxvdyIgLz4NCiAgPC9nPg0K ICA8cGF0aCBkPSJNMzEuMywxNEg5LjZMNCwyNmgyMS44YzAuNSwwLDEuMS0wLjMsMS4zLTAuN0wzMiwx NC43QzMyLjEsMTQuMywzMS44LDE0LDMxLjMsMTR6IiBjbGFzcz0iWWVsbG93IiAvPg0KPC9zdmc+Cw== + + + + + AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIxLjIsIFZlcnNpb249MjEuMi40 + LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl + dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAAMkCAAAC77u/ + PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi + IHZpZXdCb3g9IjAgMCAzMiAzMiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv + MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3Bh + Y2U9InByZXNlcnZlIiBpZD0iTGF5ZXJfMSIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAg + MzIgMzIiPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLlllbGxvd3tmaWxsOiNGRkIxMTU7fQoJ + LlJlZHtmaWxsOiNEMTFDMUM7fQoJLkJsdWV7ZmlsbDojMTE3N0Q3O30KCS5HcmVlbntmaWxsOiMwMzlD + MjM7fQoJLkJsYWNre2ZpbGw6IzcyNzI3Mjt9CgkuV2hpdGV7ZmlsbDojRkZGRkZGO30KCS5zdDB7b3Bh + Y2l0eTowLjc1O30KPC9zdHlsZT4NCiAgPGcgaWQ9IkF0dGFjaG1lbnRzIj4NCiAgICA8cGF0aCBkPSJN + MjIsMTB2MTNjMCwyLjgtMi4yLDUtNSw1cy01LTIuMi01LTVWN2MwLTEuNywxLjMtMywzLTNzMywxLjMs + MywzdjE2YzAsMC42LTAuNCwxLTEsMXMtMS0wLjQtMS0xVjEwaC0ydjEzICAgYzAsMS43LDEuMywzLDMs + M3MzLTEuMywzLTNWN2MwLTIuOC0yLjItNS01LTVzLTUsMi4yLTUsNXYxNmMwLDMuOSwzLjEsNyw3LDdz + Ny0zLjEsNy03VjEwSDIyeiIgY2xhc3M9IkJsYWNrIiAvPg0KICA8L2c+DQo8L3N2Zz4L 17, 17 + + 186, 17 + \ No newline at end of file diff --git a/App/wisag_check_Att/Form1.vb b/App/wisag_check_Att/Form1.vb index 8f7001a..c30e2c7 100644 --- a/App/wisag_check_Att/Form1.vb +++ b/App/wisag_check_Att/Form1.vb @@ -1,17 +1,23 @@ -Imports System.IO +Imports System.ComponentModel +Imports System.IO +Imports System.Net.Mail Imports System.Text.RegularExpressions +Imports DigitalData.Modules Imports DigitalData.Modules.Database Imports DigitalData.Modules.Logging +Imports GdPicture14 Imports Independentsoft.Email.Mime +Imports Attachment = Independentsoft.Email.Mime.Attachment +Imports LicenseManager = GdPicture14.LicenseManager Public Class Form1 - Private Logger As DigitalData.Modules.Logging.Logger + Private _logger As DigitalData.Modules.Logging.Logger Private Shared MyLogger As LogConfig Private _Worklist As List(Of String) Private MyDatabase As MSSQLServer Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load Try MyLogger = New LogConfig(LogConfig.PathType.CustomPath, Path.Combine(My.Application.Info.DirectoryPath, "Log"), Nothing, My.Application.Info.CompanyName, My.Application.Info.ProductName) - Logger = MyLogger.GetLogger() + _logger = MyLogger.GetLogger() MyLogger.Debug = True Dim dbResult As Boolean @@ -108,66 +114,66 @@ Public Class Form1 End If Dim oAttachmentFileString oString = String.Format(" Working on Attachment [{0}]", oAttachment.GetFileName) - Logger.Info(oString) + _logger.Info(oString) ListBox1.Items.Add(oString) Try Dim oFilename = oAttachment.GetFileName oFilename = CleanInput(oFilename) - Logger.Debug($"oFilename [{oFilename}]") + _logger.Debug($"oFilename [{oFilename}]") If oFilename = String.Empty Then oFilename = oAttachment.GetFileName End If Dim oAttFilenameonly = $"{oMSGID}~{oFilename}" oAttachmentFileString = Path.Combine(bsitemppath.Caption, oAttFilenameonly) - Logger.Debug($"oAttachmentFileString [{oAttachmentFileString}]") + _logger.Debug($"oAttachmentFileString [{oAttachmentFileString}]") Dim oSQL = $"SELECT * FROM IDB.DBO.TBIDB_DOC_INFO WHERE FILENAME_EXT = '{oAttFilenameonly}'" Dim oDT As DataTable = MyDatabase.GetDatatable(oSQL) If Not IsNothing(oDT) Then If oDT.Rows.Count = 0 Then oString = " ## Attachment NOT EXISTING ##" - Logger.Info(oString) + _logger.Info(oString) ListBox1.Items.Add(oString) If System.IO.File.Exists(oAttachmentFileString) = False Then - Logger.Debug(String.Format("Trying to save attachment [{0}]", oAttachmentFileString)) + _logger.Debug(String.Format("Trying to save attachment [{0}]", oAttachmentFileString)) Try oAttachment.Save(oAttachmentFileString) Dim oFileInfo As New FileInfo(oAttachmentFileString) Dim oFileLenth As Long = oFileInfo.Length If oFileLenth > 0 Then - Logger.Info(String.Format(" Attachment saved to [{0}]", oAttachmentFileString)) + _logger.Info(String.Format(" Attachment saved to [{0}]", oAttachmentFileString)) Else - Logger.Warn($"##!! oFileLenth for AttachmentObjects is 0 !!##") + _logger.Warn($"##!! oFileLenth for AttachmentObjects is 0 !!##") Try File.Delete(oAttachmentFileString) Catch ex As Exception - Logger.Error(ex) + _logger.Error(ex) End Try End If Catch ex As Exception - Logger.Warn($"Error while saving attachment-name: {ex.Message} - AttachmentName: {oAttachmentFileString}") + _logger.Warn($"Error while saving attachment-name: {ex.Message} - AttachmentName: {oAttachmentFileString}") End Try Else ListBox1.Items.Add("EXATTMNT - Attachment (" & oAttachmentFileString & ") already existing!") - Logger.Info("EXATTMNT - Attachment (" & oAttachmentFileString & ") already existing!", False, "EXTRACT_ATTACHMENTS") + _logger.Info("EXATTMNT - Attachment (" & oAttachmentFileString & ") already existing!", False, "EXTRACT_ATTACHMENTS") End If Else oString = " ALL OK! EXISTING" - Logger.Info(oString) + _logger.Info(oString) ListBox1.Items.Add(oString) End If End If Catch ex As Exception - Logger.Warn($"Error while creating and saving attachment-name: {ex.Message} - AttachmentName: {oAttachmentFileString}") + _logger.Warn($"Error while creating and saving attachment-name: {ex.Message} - AttachmentName: {oAttachmentFileString}") End Try oMessage = Nothing Next Catch ex As Exception - Logger.Error(ex) + _logger.Error(ex) End Try @@ -180,10 +186,86 @@ Public Class Form1 ' If we timeout when replacing invalid characters, ' we should return String.Empty. Catch ex As Exception - Logger.Error(ex) + _logger.Error(ex) Return String.Empty End Try End Function + Private Sub BarButtonItem4_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles BarButtonItem4.ItemClick + ' FileOpen Dialog + Dim fileOpenDlg = OpenFileDialog1 + If fileOpenDlg.ShowDialog() = DialogResult.OK Then + Dim oFilename = fileOpenDlg.FileName + + ' Call Extract Method + ExtractEmbeddedPDFAttachments(oFilename) + + End If + + End Sub + Private Sub ExtractEmbeddedPDFAttachments(pFilename As String) + Try + Dim oSQLGDPicture = "SELECT LICENSE FROM TBDD_3RD_PARTY_MODULES WHERE ACTIVE = 1" + Dim GDPictureLicense As String = "21182889975216572111813147150675976632" + Dim oValidExtensions = New List(Of String) From {"pdf", "xls", "xlsx", "doc", "docx", "ppt", "pptx"} + Dim oGraphicExtensions = New List(Of String) From {"jpg", "bmp", "jpeg", "gif", "png", "xml"} + + Dim oFileInfo As New FileInfo(pFilename) + + If oFileInfo.Extension.ToLower = ".pdf" Then + Dim oPDFConsistent As Boolean = True + Dim oLicenseManager As New LicenseManager + oLicenseManager.RegisterKEY(GDPictureLicense) + + Dim oGdPicturePDF As New GdPicturePDF() + ' Lic + Dim oStatus As GdPictureStatus = oGdPicturePDF.LoadFromFile(pFilename, True) + If oStatus <> GdPictureStatus.OK Then + oPDFConsistent = False + Dim oResult = $"PDF-Consistency of attached file {pFilename} is not ok. ({oStatus.ToString})" + Else + Dim embeddedFileCount As Integer = oGdPicturePDF.GetEmbeddedFileCount() + If embeddedFileCount > 0 Then + For i As Integer = 0 To embeddedFileCount - 1 + Dim oEmbAttName As String = oGdPicturePDF.GetEmbeddedFileName(i) + Dim fileDetail As IO.FileInfo + fileDetail = My.Computer.FileSystem.GetFileInfo(oEmbAttName) + If oGdPicturePDF.GetStat() = GdPictureStatus.OK Then + Dim FileSize As Integer = oGdPicturePDF.GetEmbeddedFileSize(i) + Dim oValidExt = oValidExtensions.Any(Function(ext) oEmbAttName.EndsWith(ext)) + + If oValidExt = False Then + _Logger.Info("Invalid FileExtension of embedded file [{0}]", oEmbAttName) + Dim GraphicExt = oGraphicExtensions.Any(Function(ext) oEmbAttName.EndsWith(ext)) + If GraphicExt = False Then + Dim oInfo = $"Consistency or extension of attached file [{oEmbAttName}] is not ok." + + End If + Continue For + End If + If oGdPicturePDF.GetStat() = GdPictureStatus.OK Then + Dim FileData As Byte() = New Byte(FileSize) {} + Dim status As GdPictureStatus = oGdPicturePDF.ExtractEmbeddedFile(0, FileData) + If status <> GdPictureStatus.OK Or FileSize = 0 Then + oPDFConsistent = False + + Dim oResult = $"Consistency or PDF-State of embedded file [{oEmbAttName}] is not ok." + + Continue For + End If + End If + End If + Next + End If + End If + End If + + + Catch ex As Exception + _logger.Error(ex) + + + End Try + End Sub End Class diff --git a/App/wisag_check_Att/wisag_check_Att.vbproj b/App/wisag_check_Att/wisag_check_Att.vbproj index aef9c59..a6f6281 100644 --- a/App/wisag_check_Att/wisag_check_Att.vbproj +++ b/App/wisag_check_Att/wisag_check_Att.vbproj @@ -60,6 +60,9 @@ ..\..\..\DDModules\Logging\bin\Debug\DigitalData.Modules.Logging.dll + + D:\ProgramFiles\GdPicture.net 14\Redist\GdPicture.NET (.NET Framework 4.5)\GdPicture.NET.14.dll + P:\Projekte DIGITAL DATA\DIGITAL DATA - Entwicklung\DLL_Bibliotheken\Email .NET\Bin\Independentsoft.Email.dll