Zustellbenachrichtigungen aus Outlook importieren
Zustellbenachrichtigungen aus Outlook importieren
Section titled “Zustellbenachrichtigungen aus Outlook importieren”Beschreibung
Section titled “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
Section titled “Voraussetzung”Auftragsverwaltung ab Version 12.1.6
Ablauf des Skripts
Section titled “Ablauf des Skripts”- Nach dem Start der Auftragsverwaltung wir der Skript sofort ausgeführt.
- Prüfen des Ordners Posteingang\UPS in Outlook auf Emails ohne Kennzeichnung.
- Suchen von Paketnummer, Auftragsnummer und Referenznummer 2 in der Email
- Speichern der Email im Dokumentenordner des Auftrags falls ein passender Auftrag gefunden wurde.
- Änderung des Email-Status auf “gelesen” und “abgeschlossen” wenn Auftrag gefunden wurde.
- Änderung des Email-Status auf “zu erledigen” wenn Auftrag nicht gefunden wurde.
- Wiederholung ab Schritt 2 im Hintergrund alle 5 Minuten.
Installation
Section titled “Installation”Der Skript muss sich im Ordner “[Datenpfad]\Skripts\Autostart” befinden.
Skript
Section titled “Skript”Imports Microsoft.VisualBasicImports SystemImports System.Collections.GenericImports System.LinqImports Styletronix.AuftragsverwaltungV2.CommonImports Styletronix.AuftragsverwaltungV2Imports Styletronix.AuftragsverwaltungV2.IPCImports StyletronixImports Styletronix.Threading.Thread_ManagerNamespace LagerstandAbfragePublic Class DynamicCodeImplements IPC.IPluginDetailsImplements IPC.ICommonPlugIn#Region "Deklarationen"Private Timer1 As Timers.TimerPrivate _Host As ObjectPrivate bgTask As BGThread#End Region#Region "PluginDetails"Public ReadOnly Property Plugin_Company As String Implements IPC.IPluginDetails.Plugin_CompanyGetReturn "Styletronix.net"End GetEnd PropertyPublic ReadOnly Property Plugin_Description As String Implements IPC.IPluginDetails.Plugin_DescriptionGetReturn "UPS Abliefernachweis aus Outlook importieren"End GetEnd PropertyPublic ReadOnly Property Plugin_Icon As System.Drawing.Image Implements IPC.IPluginDetails.Plugin_IconGetReturn NothingEnd GetEnd PropertyPublic ReadOnly Property Plugin_Name As Object Implements IPC.IPluginDetails.Plugin_NameGetReturn "UPS Abliefernachweis aus Outlook importieren"End GetEnd PropertyPublic ReadOnly Property Plugin_Version As System.Version Implements IPC.IPluginDetails.Plugin_VersionGetReturn New Version(1, 0, 0)End GetEnd Property#End Region#Region "CommonPlugIn"Public Sub Initialize(Host As Object) Implements AuftragsverwaltungV2.IPC.ICommonPlugIn.InitializeMe._Host = HostMe.Timer1 = New Timers.Timer(1000 * 1)Me.Timer1.Start()AddHandler Me.Timer1.Elapsed, AddressOf Timer1_ElapsedEnd SubPublic ReadOnly Property Plugin_HasConfigMenu As Boolean Implements AuftragsverwaltungV2.IPC.ICommonPlugIn.Plugin_HasConfigMenuGetReturn FalseEnd GetEnd PropertyPublic Sub ShowConfigMenu() Implements AuftragsverwaltungV2.IPC.ICommonPlugIn.ShowConfigMenuThrow New NotImplementedExceptionEnd SubPublic Function ShutDown() As Boolean Implements AuftragsverwaltungV2.IPC.ICommonPlugIn.ShutDownMe.Timer1.Stop()If Not Me.bgTask Is Nothing AndAlso Me.bgTask.Thread.IsAlive ThenMe.bgTask.Cancel()End IfReturn TrueEnd FunctionPublic Function ShutDownRequest() As AuftragsverwaltungV2.IPC.ICommonPlugIn.Shutdown_Result Implements AuftragsverwaltungV2.IPC.ICommonPlugIn.ShutDownRequestIf Not Me.bgTask Is Nothing AndAlso Me.bgTask.Thread.IsAlive ThenMe.bgTask.Cancel()End IfReturn New AuftragsverwaltungV2.IPC.ICommonPlugIn.Shutdown_Result With {.Cancel = False}End Function#End RegionPrivate Sub Timer1_Elapsed(sender As Object, e As System.Timers.ElapsedEventArgs)Me.Timer1.Interval = 1000 * 60 * 5If Me.bgTask Is Nothing OrElse Me.bgTask.Thread.IsAlive = False ThenMe.bgTask = New BGThreadStyletronix.Threading.Thread_Manager.Instance.AddThread(Me.bgTask)End IfMe.Timer1.Start()End SubPrivate Class BGThreadImplements 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.DoWorkTryDim Count As Int64 = 0RaiseEvent Thread_Progress_Changed(Me, 0, "Verbinde zu Outlook...")'Verbindung zu Outlook herstellenDim OutlookApp As New Microsoft.Office.Interop.Outlook.Application'Zugriff zu Outlook über Redemption herstellenDim RDOSession = Global.Styletronix.AuftragsverwaltungV2.Common.Redemption.RedemptionLoader.new_RDOSessionRDOSession.MAPIOBJECT = OutlookApp.Session.MAPIOBJECTRaiseEvent 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 endeRaiseEvent Thread_Progress_Changed(Me, 0, "Prüfe Emails...")For Each element As Object In Folder.ItemsCount += 1RaiseEvent 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 handeltDim Mail As Redemption.RDOMail = TryCast(element, Redemption.RDOMail)If Not Mail Is Nothing ThenTry'Betreff und Kennzeichnung der Email prüfenIf Mail.Subject.ToLower.StartsWith("UPS - ".ToLower) AndAlso Mail.FlagStatus = Microsoft.Office.Interop.Outlook.OlFlagStatus.olNoFlag ThenDim txt = Mail.BodyDim Kontrollnummer As String = ""Dim Auftragnummer As String = ""'Nach UPS Kontrollnummer in der Email suchenDim 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 ThenKontrollnummer = ret.Groups(1).ValueEnd If'Nach Auftragsnummer in der Email suchenret = Text.RegularExpressions.Regex.Match(txt, "Auftragsnummer\s*(\w*)\s*", Text.RegularExpressions.RegexOptions.IgnoreCase Or Text.RegularExpressions.RegexOptions.Multiline)If ret.Success ThenAuftragnummer = ret.Groups(1).ValueEnd If'Falls Auftragsnummer nicht angegeben wurde nach der Referneznummer 2 suchenIf String.IsNullOrWhiteSpace(Auftragnummer) Thenret = Text.RegularExpressions.Regex.Match(txt, "Referenznummer 2:\s*(\w*)\s*", Text.RegularExpressions.RegexOptions.IgnoreCase Or Text.RegularExpressions.RegexOptions.Multiline)If ret.Success ThenAuftragnummer = ret.Groups(1).ValueEnd IfEnd IfDim MailOK As Boolean = False'Auftrag mit der Kontrollnummer suchenIf Not String.IsNullOrWhiteSpace(Kontrollnummer) ThenUsing 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 = KontrollnummerFor Each Auftrag As tbl_Auftrag In Aufträge'Dateiname für die Email festlegenDim Datei = Gemeinsam.Aufträge.GetDocumentFolder(Auftrag.ID) & "\" & Mail.Subject & ".msg"Datei = Styletronix.Utils.Files.GetNotUsedFileName(Datei)'Email speichernMail.SaveAs(Datei)MailOK = TrueNextEnd UsingEnd If'Auftrag anhand von Auftragsnummer suchen, falls der Auftrag anhand der Kontrollnummer nicht gefunden wurde.If Not MailOK AndAlso Not String.IsNullOrWhiteSpace(Auftragnummer) ThenDim p = Gemeinsam.ParseNummer(Auftragnummer)If Not p.AuftragID Is Nothing AndAlso p.AuftragID > 0 ThenDim AuftragID As Int64 = p.AuftragIDUsing dc As New DC_AllgemeinDataContext(Einstellungen.SQL_Verbindungszeichenfolge)Dim Auftrag As tbl_Auftrag = (From a In dc.tbl_Auftrag Where a.ID = AuftragID).FirstOrDefaultIf Not Auftrag Is Nothing Then'Dateiname für die Email festlegenDim Datei = Gemeinsam.Aufträge.GetDocumentFolder(Auftrag.ID) & "\" & Mail.Subject & ".msg"Datei = Styletronix.Utils.Files.GetNotUsedFileName(Datei)'Email speichernMail.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) ThenAuftrag.Paketnummer = Kontrollnummerdc.SubmitChanges()End IfEnd IfEnd UsingEnd IfEnd IfIf MailOK Then'Wenn Auftrag gefunden wurde, den Status der Mail auf "Abgeschlossen" setzen und als "gelesen"kennzeichnen.Mail.FlagStatus = Microsoft.Office.Interop.Outlook.OlFlagStatus.olFlagCompleteMail.UnRead = FalseElse'Wenn Auftrag nicht gefunden wurde den Status der Mail auf "Zu Erledigen" setzen.Mail.FlagStatus = Microsoft.Office.Interop.Outlook.OlFlagStatus.olFlagMarkedEnd If'Änderungen an der Email speichern.Mail.Save()End IfCatch 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 TryEnd IfNextende:RaiseEvent Thread_Progress_Changed(Me, 100, "Beenden...")RDOSession = NothingOutlookApp = NothingCatch 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.AllowCancelGetReturn TrueEnd GetEnd PropertyPrivate _BarSubItem As DevExpress.XtraBars.BarSubItemPublic Property BarSubItem As DevExpress.XtraBars.BarSubItem Implements Styletronix.Threading.Thread_Manager.IThread.BarSubItemGetReturn Me._BarSubItemEnd GetSet(value As DevExpress.XtraBars.BarSubItem)Me._BarSubItem = valueEnd SetEnd PropertyPrivate _Cancel As BooleanPublic Sub Cancel() Implements Styletronix.Threading.Thread_Manager.IThread.CancelMe._Cancel = TrueEnd SubPublic ReadOnly Property Caption As String Implements Styletronix.Threading.Thread_Manager.IThread.CaptionGetReturn "UPS Abliefernachweis aus Outlook importieren."End GetEnd PropertyPrivate _Thread As System.Threading.ThreadPublic Property Thread As System.Threading.Thread Implements Styletronix.Threading.Thread_Manager.IThread.ThreadGetReturn Me._ThreadEnd GetSet(value As System.Threading.Thread)value.SetApartmentState(System.Threading.ApartmentState.STA)Me._Thread = valueEnd SetEnd PropertyPublic Event Thread_Completed(sender As Object, Result As Object) Implements Styletronix.Threading.Thread_Manager.IThread.Thread_CompletedPublic 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_NewEntryPublic Event Thread_Progress_Changed(sender As Object, Progress As Integer, StatusText As String) Implements Styletronix.Threading.Thread_Manager.IThread.Thread_Progress_Changed#End RegionEnd ClassEnd ClassEnd NamespaceQuelle
Section titled “Quelle”- Ursprungsdatei: zustellbenachrichtigungen_aus_.htm