Zustellbenachrichtigungen aus Outlook importieren

Navigation:  Skripts > Programmerweiterungen > Beispiele >

Zustellbenachrichtigungen aus Outlook importieren

Previous pageReturn to chapter overviewNext page

Beschreibung

Der folgende Skript  prüft alle 5 Minuten den Ordner "Posteingang\UPS" in Outlook und sucht dort nach Zustellbenachrichtigungen.  Wird eine Benachrichtigung gefunden, so wird die Auftragsnummer und Paketnummer mit Aufträgen in der Datenbank verglichen und die Email bei Übereinstimmung in das Dokumentenverzeichnis des entsprechenden Auftrags kopiert. Anschließend wird die Email als "abgeschlossen" und "gelesen" gekennzeichnet. Wird keine Übereinstimmung gefunden, wird die Email als "zu erledigen" gekennzeichnet.

 

 

Voraussetzung

Auftragsverwaltung ab Version 12.1.6

 

 

Ablauf des Skripts

 1. Nach dem Start der Auftragsverwaltung wir der Skript sofort ausgeführt.

 2. Prüfen des Ordners Posteingang\UPS in Outlook auf Emails ohne Kennzeichnung.

 3. Suchen von Paketnummer, Auftragsnummer und Referenznummer 2 in der Email

 4. Speichern der Email im Dokumentenordner des Auftrags falls ein passender Auftrag gefunden wurde.

 5. Änderung des Email-Status auf "gelesen" und "abgeschlossen" wenn Auftrag gefunden wurde.

 6. Änderung des Email-Status auf  "zu erledigen" wenn Auftrag nicht gefunden wurde.

 7. Wiederholung ab Schritt 2 im Hintergrund alle 5 Minuten.

 

 

Installation

Der Skript muss sich im Ordner "[Datenpfad]\Skripts\Autostart"  befinden.

 

 

Skript

Imports Microsoft.VisualBasic

Imports System

Imports System.Collections.Generic

Imports System.Linq

Imports Styletronix.AuftragsverwaltungV2.Common

Imports Styletronix.AuftragsverwaltungV2

Imports Styletronix.AuftragsverwaltungV2.IPC

Imports Styletronix

Imports Styletronix.Threading.Thread_Manager

 

Namespace LagerstandAbfrage

    Public Class DynamicCode

        Implements IPC.IPluginDetails

        Implements IPC.ICommonPlugIn

 

#Region "Deklarationen"

        Private Timer1 As Timers.Timer

        Private _Host As Object

        Private bgTask As BGThread

#End Region

 

#Region "PluginDetails"

        Public ReadOnly Property Plugin_Company As String Implements IPC.IPluginDetails.Plugin_Company

            Get

                Return "Styletronix.net"

            End Get

        End Property

        Public ReadOnly Property Plugin_Description As String Implements IPC.IPluginDetails.Plugin_Description

            Get

                Return "UPS Abliefernachweis aus Outlook importieren"

            End Get

        End Property

        Public ReadOnly Property Plugin_Icon As System.Drawing.Image Implements IPC.IPluginDetails.Plugin_Icon

            Get

                Return Nothing

            End Get

        End Property

        Public ReadOnly Property Plugin_Name As Object Implements IPC.IPluginDetails.Plugin_Name

            Get

                Return "UPS Abliefernachweis aus Outlook importieren"

            End Get

        End Property

        Public ReadOnly Property Plugin_Version As System.Version Implements IPC.IPluginDetails.Plugin_Version

            Get

                Return New Version(1, 0, 0)

            End Get

        End Property

#End Region

 

#Region "CommonPlugIn"

        Public Sub Initialize(Host As Object) Implements AuftragsverwaltungV2.IPC.ICommonPlugIn.Initialize

            Me._Host = Host

            Me.Timer1 = New Timers.Timer(1000 * 1)

            Me.Timer1.Start()

            AddHandler Me.Timer1.Elapsed, AddressOf Timer1_Elapsed

        End Sub

        Public ReadOnly Property Plugin_HasConfigMenu As Boolean Implements AuftragsverwaltungV2.IPC.ICommonPlugIn.Plugin_HasConfigMenu

            Get

                Return False

            End Get

        End Property

        Public Sub ShowConfigMenu() Implements AuftragsverwaltungV2.IPC.ICommonPlugIn.ShowConfigMenu

            Throw New NotImplementedException

        End Sub

        Public Function ShutDown() As Boolean Implements AuftragsverwaltungV2.IPC.ICommonPlugIn.ShutDown

            Me.Timer1.Stop()

            If Not Me.bgTask Is Nothing AndAlso Me.bgTask.Thread.IsAlive Then

                Me.bgTask.Cancel()

            End If

            Return True

        End Function

        Public Function ShutDownRequest() As AuftragsverwaltungV2.IPC.ICommonPlugIn.Shutdown_Result Implements AuftragsverwaltungV2.IPC.ICommonPlugIn.ShutDownRequest

            If Not Me.bgTask Is Nothing AndAlso Me.bgTask.Thread.IsAlive Then

                Me.bgTask.Cancel()

            End If

            Return New AuftragsverwaltungV2.IPC.ICommonPlugIn.Shutdown_Result With {.Cancel = False}

        End Function

#End Region

 

        Private Sub Timer1_Elapsed(sender As Object, e As System.Timers.ElapsedEventArgs)

            Me.Timer1.Interval = 1000 * 60 * 5

            If Me.bgTask Is Nothing OrElse Me.bgTask.Thread.IsAlive = False Then

                Me.bgTask = New BGThread

                Styletronix.Threading.Thread_Manager.Instance.AddThread(Me.bgTask)

            End If

            Me.Timer1.Start()

        End Sub

        Private Class BGThread

            Implements Styletronix.Threading.Thread_Manager.IThread

 

            ''' <summary>

            ''' Hier wird die eigentliche Funktion ausgeführt. Alles andere ist nur zur Initialisierung."

            ''' </summary>

            ''' <remarks></remarks>

            Public Sub DoWork() Implements Styletronix.Threading.Thread_Manager.IThread.DoWork

                Try

                    Dim Count As Int64 = 0

                    RaiseEvent Thread_Progress_Changed(Me, 0, "Verbinde zu Outlook...")

 

                    'Verbindung zu Outlook herstellen

                    Dim OutlookApp As New Microsoft.Office.Interop.Outlook.Application

 

                    'Zugriff zu Outlook über Redemption herstellen

                    Dim RDOSession = Global.Styletronix.AuftragsverwaltungV2.Common.Redemption.RedemptionLoader.new_RDOSession

                    RDOSession.MAPIOBJECT = OutlookApp.Session.MAPIOBJECT

 

                    RaiseEvent Thread_Progress_Changed(Me, 0, "Öffne Ordner in Outlook...")

 

                    'Ordner für Emails auswählen. Die Mails werden dort per Regel in Outlook einsortiert.

                    Dim Folder = RDOSession.GetFolderFromPath("Posteingang\UPS")

                    If Folder Is Nothing Then GoTo ende

 

                    RaiseEvent Thread_Progress_Changed(Me, 0, "Prüfe Emails...")

                    For Each element As Object In Folder.Items

                        Count += 1

                        RaiseEvent Thread_Progress_Changed(Me, 0, String.Format("Prüfe Email {0} ...", Count))

                        If Me._Cancel Then GoTo ende

 

                        'Prüfen, ob es sich um ein Email Element handelt

                        Dim Mail As Redemption.RDOMail = TryCast(element, Redemption.RDOMail)

                        If Not Mail Is Nothing Then

                            Try

                                'Betreff und Kennzeichnung der Email prüfen

                                If Mail.Subject.ToLower.StartsWith("UPS - ".ToLower) AndAlso Mail.FlagStatus = Microsoft.Office.Interop.Outlook.OlFlagStatus.olNoFlag Then

                                    Dim txt = Mail.Body

                                    Dim Kontrollnummer As String = ""

                                    Dim Auftragnummer As String = ""

 

                                    'Nach UPS Kontrollnummer in der Email suchen

                                    Dim ret As Text.RegularExpressions.Match = Text.RegularExpressions.Regex.Match(txt, "Kontrollnummer:\s*(\w*)\s*", Text.RegularExpressions.RegexOptions.IgnoreCase Or Text.RegularExpressions.RegexOptions.Multiline)

                                    If ret.Success Then

                                        Kontrollnummer = ret.Groups(1).Value

                                    End If

 

                                    'Nach Auftragsnummer in der Email suchen

                                    ret = Text.RegularExpressions.Regex.Match(txt, "Auftragsnummer\s*(\w*)\s*", Text.RegularExpressions.RegexOptions.IgnoreCase Or Text.RegularExpressions.RegexOptions.Multiline)

                                    If ret.Success Then

                                        Auftragnummer = ret.Groups(1).Value

                                    End If

 

                                    'Falls Auftragsnummer nicht angegeben wurde nach der Referneznummer 2 suchen

                                    If String.IsNullOrWhiteSpace(Auftragnummer) Then

                                        ret = Text.RegularExpressions.Regex.Match(txt, "Referenznummer 2:\s*(\w*)\s*", Text.RegularExpressions.RegexOptions.IgnoreCase Or Text.RegularExpressions.RegexOptions.Multiline)

                                        If ret.Success Then

                                            Auftragnummer = ret.Groups(1).Value

                                        End If

                                    End If

 

                                    Dim MailOK As Boolean = False

                                    'Auftrag mit der Kontrollnummer suchen

                                    If Not String.IsNullOrWhiteSpace(Kontrollnummer) Then

                                        Using dc As New DC_AllgemeinDataContext(Einstellungen.SQL_Verbindungszeichenfolge)

                                            Dim Aufträge As System.Linq.IQueryable(Of tbl_Auftrag) = From a In dc.tbl_Auftrag Where a.Paketnummer = Kontrollnummer

                                            For Each Auftrag As tbl_Auftrag In Aufträge

                                                'Dateiname für die Email festlegen

                                                Dim Datei = Gemeinsam.Aufträge.GetDocumentFolder(Auftrag.ID) & "\" & Mail.Subject & ".msg"

                                                Datei = Styletronix.Utils.Files.GetNotUsedFileName(Datei)

                                                'Email speichern

                                                Mail.SaveAs(Datei)

                                                MailOK = True

                                            Next

                                        End Using

                                    End If

 

                                    'Auftrag anhand von Auftragsnummer suchen, falls der Auftrag anhand der Kontrollnummer nicht gefunden wurde.

                                    If Not MailOK AndAlso Not String.IsNullOrWhiteSpace(Auftragnummer) Then

                                        Dim p = Gemeinsam.ParseNummer(Auftragnummer)

                                        If Not p.AuftragID Is Nothing AndAlso p.AuftragID > 0 Then

                                            Dim AuftragID As Int64 = p.AuftragID

                                            Using dc As New DC_AllgemeinDataContext(Einstellungen.SQL_Verbindungszeichenfolge)

                                                Dim Auftrag As tbl_Auftrag = (From a In dc.tbl_Auftrag Where a.ID = AuftragID).FirstOrDefault

                                                If Not Auftrag Is Nothing Then

                                                    'Dateiname für die Email festlegen

                                                    Dim Datei = Gemeinsam.Aufträge.GetDocumentFolder(Auftrag.ID) & "\" & Mail.Subject & ".msg"

                                                    Datei = Styletronix.Utils.Files.GetNotUsedFileName(Datei)

                                                    'Email speichern

                                                    Mail.SaveAs(Datei)

                                                    MailOK = True

                                                    'Falls dem Auftrag keine Paketnummer zugewiesen wurde, wird die UPS Kontrollnummer eingesetzt.

                                                    If Not String.IsNullOrWhiteSpace(Kontrollnummer) AndAlso String.IsNullOrWhiteSpace(Auftrag.Paketnummer) Then

                                                        Auftrag.Paketnummer = Kontrollnummer

                                                        dc.SubmitChanges()

                                                    End If

                                                End If

                                            End Using

                                        End If

                                    End If

 

                                    If MailOK Then

                                        'Wenn Auftrag gefunden wurde, den Status der Mail auf "Abgeschlossen" setzen und als "gelesen"kennzeichnen.

                                        Mail.FlagStatus = Microsoft.Office.Interop.Outlook.OlFlagStatus.olFlagComplete

                                        Mail.UnRead = False

                                    Else

                                        'Wenn Auftrag nicht gefunden wurde den Status der Mail auf "Zu Erledigen" setzen.

                                        Mail.FlagStatus = Microsoft.Office.Interop.Outlook.OlFlagStatus.olFlagMarked

                                    End If

                                    'Änderungen an der Email speichern.

                                    Mail.Save()

                                End If

 

                            Catch ex As Exception

                                'Bei Fehler einen Eintrag im Log durchführen.

                                RaiseEvent Thread_Log_NewEntry(Me, "Fehler", String.Format("Fehler bei Prüfung der Mail {0}", Mail.Subject), ex, System.Diagnostics.EventLogEntryType.Warning)

                            End Try

                        End If

                    Next

 

ende:

                    RaiseEvent Thread_Progress_Changed(Me, 100, "Beenden...")

                    RDOSession = Nothing

                    OutlookApp = Nothing

 

                Catch ex As Exception

                    'Bei Fehler einen Eintrag im Log durchführen.

                    RaiseEvent Thread_Log_NewEntry(Me, "Fehler", ex.Message, ex, System.Diagnostics.EventLogEntryType.Error)

                End Try

 

                'Nach dem Abschluss MUSS "Thread_Completed" aufgerufen werden, um die Statusanzeige in der Auftragsverwaltung zu bereinigen."

                RaiseEvent Thread_Completed(Me, Nothing)

            End Sub

 

#Region "IThread implementierung"

            Public ReadOnly Property AllowCancel As Boolean Implements Styletronix.Threading.Thread_Manager.IThread.AllowCancel

                Get

                    Return True

                End Get

            End Property

 

            Private _BarSubItem As DevExpress.XtraBars.BarSubItem

            Public Property BarSubItem As DevExpress.XtraBars.BarSubItem Implements Styletronix.Threading.Thread_Manager.IThread.BarSubItem

                Get

                    Return Me._BarSubItem

                End Get

                Set(value As DevExpress.XtraBars.BarSubItem)

                    Me._BarSubItem = value

                End Set

            End Property

 

            Private _Cancel As Boolean

            Public Sub Cancel() Implements Styletronix.Threading.Thread_Manager.IThread.Cancel

                Me._Cancel = True

            End Sub

 

            Public ReadOnly Property Caption As String Implements Styletronix.Threading.Thread_Manager.IThread.Caption

                Get

                    Return "UPS Abliefernachweis aus Outlook importieren."

                End Get

            End Property

 

            Private _Thread As System.Threading.Thread

            Public Property Thread As System.Threading.Thread Implements Styletronix.Threading.Thread_Manager.IThread.Thread

                Get

                    Return Me._Thread

                End Get

                Set(value As System.Threading.Thread)

                    value.SetApartmentState(System.Threading.ApartmentState.STA)

                    Me._Thread = value

                End Set

            End Property

 

            Public Event Thread_Completed(sender As Object, Result As Object) Implements Styletronix.Threading.Thread_Manager.IThread.Thread_Completed

 

            Public Event Thread_Log_NewEntry(sender As Object, Caption As String, Message As String, Exception As Object, Status As System.Diagnostics.EventLogEntryType) Implements Styletronix.Threading.Thread_Manager.IThread.Thread_Log_NewEntry

 

            Public Event Thread_Progress_Changed(sender As Object, Progress As Integer, StatusText As String) Implements Styletronix.Threading.Thread_Manager.IThread.Thread_Progress_Changed

#End Region

        End Class

    End Class

End Namespace