sabado84
Goto Top

Automatisches Bearbeiten und Weiterleiten in Outlook

Hallo zusammen,

wir haben in unserer Firma eine Outlook-Regel erstellt, die alle High-Priority-Tickets an den jeweiligen Mitarbeiter per SMS weiterleitet (E-Mail an SMS-Server).
Leider unterstützt dieser SMS-Server nur 160 Zeichen, die Meldung an sich hat mit Leerzeichen etc. ca. 500.
Ich würde gerne ein Skript implementieren, welches Informationen wie Name, Department,Description etc. auf SMS-Größe zusammenfasst und weiterleitet.

Mit Outlook Regeln komme ich hier leider nicht weiter.
Falls ihr noch andere Möglichkeiten kennt, bin ich denen gegenüber natürlich offen.

Vielen Dank für eure Hilfe

Content-Key: 86627

Url: https://administrator.de/contentid/86627

Printed on: April 19, 2024 at 06:04 o'clock

Member: colinardo
colinardo Apr 29, 2008 at 09:45:10 (UTC)
Goto Top
Du kannst die eintreffende Nachricht per Outlook-Regel weiter bearbeiten in dem du in den Optionen für die Regel folgende Aktion auswählst:
" Was soll mit dieser Nachricht passieren?"
x Ein Script ausführen

Um dort aber einen Eintrag den du auswählen kannst vorzufinden , musst du zuerst folgendes machen:

In Outlook den VBA-Editor starten ALT-F11, dann im Modul "ThisOutlookSession" eine neue Subroutine anlegen:

Public Sub MessageScript(oMail As Outlook.mailItem)
   'hier kommt die Behandlung der Mail rein      
   ' z.b. öffnet folgender Eintrag eine Messagebox beim eintreffen der Nachricht  
   MsgBox oMail.Subject
End Sub

In der Routine kannst du dir mit den VBA String Methoden deinen persönlichen SMS-Text zurecht schneidern, in dem du z.B. den Body der Nachricht auf eine bestimmte Anzahl von Zeichen zurecht stutzt:

Public Sub MessageScript(oMail As Outlook.mailItem)
    Dim msgBody, smsBody
    Dim newSMSMail As Outlook.mailItem
    Set newSMSMail = Application.CreateItem(olMailItem)
    msgBody = oMail.Body
    smsBody = Left(msgBody, 160)
    With newSMSMail
        .To = "hier@empfänger.de"  
        .Subject = oMail.Subject
        .Body = smsBody
        .Display
        '.send  
    End With
End Sub

Dieser Code stutzt den Body auf 160 Zeichen, erstellt eine neue Mail und zeigt diese auf dem Bildschirm an (nur zur Demo damit du experimentieren kannst). Mit der Send Methode im "With" Block kannst du die Nachricht dann verschicken.

Hoffe das hilft dir weiter ...face-wink

greets Uwe
Member: sabado84
sabado84 Apr 29, 2008 at 10:44:39 (UTC)
Goto Top
Hey Uwe,

vielen Dank, das war schon ein Schritt in die richtige Richtung face-wink
Du kannst dir eine ankommende E-Mail so vorstellen:

Short Description : XXXXXXXX - Ich komme nicht auf Laufwerk "c"
Customer : Maxime Musterdau
Department : ABC
Telephone no. : +49 (12345) 6789
Room : Dauroom
Priority : High
Affected Users : all
Status : Assigned
Assigned Group : Dau-consultants

Ich möchte zum Beispiel die Short Description, den Customer sowie die Priority in der SMS anzeigen lassen. Kann ich diese Infos rausfiltern?

Vielen dank!

[Edit Biber: hier das Wesentliche nochmal als < Code > formatiert:]
Short Description  : XXXXXXXX - Ich komme nicht auf Laufwerk "c"  
Customer           : Maxime Musterdau
Department         : ABC
Telephone no.      : +49 (12345) 6789
Room               : Dauroom 
Priority           : High
Affected Users     : all
Status             : Assigned
Assigned Group     : Dau-consultants
[/Edit]
Member: colinardo
colinardo Apr 29, 2008 at 12:07:36 (UTC)
Goto Top
Habe mal die obige Prozedur an deinen Text angepasst der nun die Textstellen rausfiltert:
Zu beachten ist aber das die Reihenfolge der Kategorien (Short Description,Customer,....) in der Mail eingehalten wird , sonst musst du die stellen im Code anpassen.

Public Sub MessageScript(oMail As Outlook.mailItem)
    Dim msgBody
    Dim newSMSMail As Outlook.mailItem
    Set newSMSMail = Application.CreateItem(olMailItem)
    msgBody = oMail.Body
    Dim strDescription, strCustomer, strPrio, posDescription, posCustomer, posPrio
    posDescription = InStr(1, msgBody, "Description") + 11  
    posCustomer = InStr(1, msgBody, "Customer") + 8  
    posPrio = InStr(1, msgBody, "Priority") + 8  
    strDescription = Mid(msgBody, posDescription, InStr(posDescription, msgBody, "Customer") - posDescription)  
    strCustomer = Mid(msgBody, posCustomer, InStr(posCustomer, msgBody, "Department") - posCustomer)  
    strPrio = Mid(msgBody, posPrio, InStr(posPrio, msgBody, "Affected Users") - posPrio)  
    strDescription = Trim(Replace(strDescription, vbCrLf, ""))  
    strCustomer = Trim(Replace(strCustomer, vbCrLf, ""))  
    strPrio = Trim(Replace(strPrio, vbCrLf, ""))  
    With newSMSMail
        .To = "hier@empfänger.de"  
        .Subject = "+49xxxxxxxx"  
        .Body = "Description: " & vbCrLf & strDescription & vbCrLf & _  
                "Customer: " & vbCrLf & strCustomer & vbCrLf & _  
                "Priority: " & vbCrLf & strPrio  
        .Display
    End With

End Sub

ÄNDERUNG

Oh, habe gerade gesehen das du den Code umformatiert hast, mit nem Doppelpunkt .
Dafür geht folgende Routine die alles was hinter dem Doppelpunkt steht extrahiert:

Public Sub MessageScript(oMail as Outlook.mailitem)
    Dim msgBody
    Dim newSMSMail As Outlook.mailItem
    Set newSMSMail = Application.CreateItem(olMailItem)
    msgBody = oMail.Body
    Dim strDescription, strCustomer, strPrio, posDescription, posCustomer, posPrio
    posDescription = InStr(1, msgBody, "Description") + 11  
    posCustomer = InStr(1, msgBody, "Customer") + 8  
    posPrio = InStr(1, msgBody, "Priority") + 8  
    strDescription = Mid(msgBody, (InStr(posDescription, msgBody, ":") + 1), InStr(posDescription, msgBody, "Customer") - (InStr(posDescription, msgBody, ":") + 1))  
    strCustomer = Mid(msgBody, (InStr(posCustomer, msgBody, ":") + 1), InStr(posCustomer, msgBody, "Department") - (InStr(posCustomer, msgBody, ":") + 1))  
    strPrio = Mid(msgBody, (InStr(posPrio, msgBody, ":") + 1), InStr(posPrio, msgBody, "Affected Users") - (InStr(posPrio, msgBody, ":") + 1))  
    strDescription = Trim(Replace(strDescription, vbCrLf, ""))  
    strCustomer = Trim(Replace(strCustomer, vbCrLf, ""))  
    strPrio = Trim(Replace(strPrio, vbCrLf, ""))  
    With newSMSMail
        .To = "hier@empfänger.de"  
        .Subject = "+49xxxxxxxx"  
        .Body = "Description: " & vbCrLf & strDescription & vbCrLf & _  
                "Customer: " & vbCrLf & strCustomer & vbCrLf & _  
                "Priority: " & vbCrLf & strPrio  
        .Display
    End With

End Sub
Member: sabado84
sabado84 May 09, 2008 at 11:08:06 (UTC)
Goto Top
Hallo Uwe,

ich war heute das erste Mal wieder in der Firma und konnte daher jetzt erst deine Nachricht lesen.
Vielen, vielen Dank, das ist genau das, was ich brauche. Habs gerade ausprobiert, klappt einwandfrei. Kannst du mir bitte noch sagen, wie ich die Telefonnummer des Kunden in die SMS reinbekomme? Ist wahrscheinlich nur eine Zeile Script, oder?

Nochmals vielen Dank für deine Hilfe!
Member: colinardo
colinardo May 09, 2008 at 15:20:18 (UTC)
Goto Top
Hier die Änderung für die Telefonnummer:

schau dir mal die Funktionen InStr() / mid() etc in der Visual Basic Hilfe an dann wirst du auch den folgenden Code verstehen, es geht hier in erster Linie darum die Positionen der Hilfsbezeichner wi e z.b. "Telephone no." zu suchen um dann von dieser Position aus den jeweiligen Wert zu extrahieren indem man als Begrenzung einmal den Doppelpunkt + 1 Zeichen referenziert und dann den nächsten Bezeichner hier "Room" als Begrenzer für den zu extrahierenden Wert nimmt. Wenn man weis welche maximale Länge ein String haben darf kann man stattdessen auch diesen festlegen, wie z.b bei einer Postleitzahl.
Das klingt jetzt vielleicht ein bisschen kompliziert ist aber wenn man mal dahinter gestiegen ist gar nicht so schwer.

Wünsche weiterhin viel Erfolg bei deinem Projekt...

face-wink Uwe

Public Sub MessageScript(oMail as Outlook.mailitem)
    Dim msgBody
    Dim newSMSMail As Outlook.mailItem
    Set newSMSMail = Application.CreateItem(olMailItem)
    msgBody = oMail.Body
    Dim strDescription, strCustomer, strPrio, strTel, posDescription, posCustomer, posPrio, posTel
    posDescription = InStr(1, msgBody, "Description") + 11  
    posCustomer = InStr(1, msgBody, "Customer") + 8  
    posPrio = InStr(1, msgBody, "Priority") + 8  
    posTel = InStr(1,msgBody,"Telephone")+ 13  
    strDescription = Mid(msgBody, (InStr(posDescription, msgBody, ":") + 1), InStr(posDescription, msgBody, "Customer") - (InStr(posDescription, msgBody, ":") + 1))  
    strCustomer = Mid(msgBody, (InStr(posCustomer, msgBody, ":") + 1), InStr(posCustomer, msgBody, "Department") - (InStr(posCustomer, msgBody, ":") + 1))  
    strPrio = Mid(msgBody, (InStr(posPrio, msgBody, ":") + 1), InStr(posPrio, msgBody, "Affected Users") - (InStr(posPrio, msgBody, ":") + 1))  
   strTel = Mid(msgBody, (InStr(posTel, msgBody, ":") + 1), InStr(posTel, msgBody, "Room") - (InStr(posTel, msgBody, ":") + 1))  
  
   strDescription = Trim(Replace(strDescription, vbCrLf, ""))  
    strCustomer = Trim(Replace(strCustomer, vbCrLf, ""))  
    strPrio = Trim(Replace(strPrio, vbCrLf, ""))  
    strTel = Trim(Replace(strTel, vbCrlLf,""))  
    With newSMSMail
        .To = "hier@empfänger.de"  
        .Subject = "+49xxxxxxxx"  
        .Body = "Description: " & vbCrLf & strDescription & vbCrLf & _  
                "Customer: " & vbCrLf & strCustomer & vbCrLf & _  
                "Priority: " & vbCrLf & strPrio & vbCrLf & _  
                "Tel.: " & strTel  
        .Display
    End With

End Sub
Member: Biber
Biber May 09, 2008 at 18:18:26 (UTC)
Goto Top
[alles OT]
@softmeister
Oh, habe gerade gesehen das du den Code umformatiert hast, mit nem Doppelpunkt .
Dafür geht folgende Routine die alles was hinter dem Doppelpunkt steht extrahiert:

sabado84 hat exakt dasselbe gepostet wie ich dann nochmal in -Tags drunterkopiert habe.
Diese Seqenz {ein paar Leerzeichen + Doppelpunkt + ein Leerzeichen +Text} wird offensichtlich von unserer Forensoftware so (fehl-)interpretiert, dass das oben zu sehende Ergebnis rauskommt.
[/alles OT]

Ansonsten: schöne klare Lösungsskizze.

Grüße
Biber
Member: sabado84
sabado84 May 14, 2008 at 05:47:15 (UTC)
Goto Top
Hey Uwe,

dein Script funktioniert einwandfrei, genau wie ich mir das vorgestellt habe. VIELEN DANK!!!
Outlook erlaubt es mir, die Regel nur lokal (Clientseitig, im laufenden Outlookbetrieb) auszuführen.
Kennst du eine Möglichkeit, wie ich das auch Exchange-seitig handeln kann. Sonst müsste ich den Rechner das ganze WE durchlaufen lassen.

Viele Grüße

Sabado
Member: colinardo
colinardo May 14, 2008 at 06:10:23 (UTC)
Goto Top
Wie das übernehmen der Regeln auf den Exchange funktioniert weis ich im Moment auch nicht, ich habe aber folgende Software der Firma MAPILab gefunden die das komfortabel ermöglicht: http://openpr.de/news/105135/Regeln-fuer-Exchange-Server.html
und hier:
http://www.mapilab.com/de/exchange/rules

Da mich das Thema auch interessiert werde ich mich mal auf Recherche begeben um solch ein Script ohne zusätzliche Software zu implementieren...

grüße Uwe
Member: sabado84
sabado84 May 14, 2008 at 07:11:25 (UTC)
Goto Top
Ich habe bereits das Programm "Mapilap - Advanced Security for Outlook" (http://www.mapilab.com/outlook/security/), mit dem die Zugriffsbestätigung unterbunden werden kann installiert. Vielleicht ist es auch garnicht möglich, VB-Scripte für einzelne Clients auf dem Server auszuführen?!
Member: colinardo
colinardo May 14, 2008 at 07:14:19 (UTC)
Goto Top
Mit dem Eventservice von Exchange und mit der Hilfe von Outlook lassen sich Serverregeln erstellen:

http://www.msexchangefaq.de/code/eventservice.htm ....

schreibe nachher noch mehr ..
Member: colinardo
colinardo May 14, 2008 at 13:07:29 (UTC)
Goto Top
Folge den Anweisungen auf dieser Seite:
http://www.msexchangefaq.de/code/eventservice.htm

wichtig ist sind die Zugriffsrechte auf den "Events Root"\EventConfig_<Rechnername>". Dort muss jeder Benutzer Autoren-Rechte besitzen der Regeln erstellen will.

Der Exchange Dienst "MSExchangeES" der sogenannte "Exchange Event Service" oder auf Deutsch "Microsoft Exchange-Ereignis"-Dienst musst du auf automatischen Start setzten.

dann erstellst du eine Regel im Posteingang oder dem Ordner in denen die Tickets landen, auf dem Reiter "Agenten" der "Eigenschaften" dieses Ordners mit folgendem Script s.u. :

dabei musst du die Empfänger-eMail-Adresse an deine Umgebung anpassen, ( dort wo "Administrator@sbs2003.local" steht.
Wenn nun alles richtig funktioniert hat sollte der Exchange alle in diesem Ordner neu erstellten Nachrichten an deine Adresse weiterleiten. Beachte das die Bearbeitung bis zu 60 Sekunden benötigen kann. Falls was nicht richtig funktioniert kannst du auf dem Reiter "Agenten" mit dem Button "Protokolle" in die Logs schauen ....

Konnte das alles erfolgreich in einer virtuellen SBS2003 Domäne testen...

face-wink Uwe

<SCRIPT RunAt=Server Language=VBScript>

'------------------------------------------------------------------------------  
'  
' NAME: Forward  
'  
' FILE DESCRIPTION: Automatically forwards all incomming messages to SMS Server  
'  
'  
'------------------------------------------------------------------------------  

'Option Explicit  

'------------------------------------------------------------------------------  
'	Global Variables  
'------------------------------------------------------------------------------  

Dim g_bstrDebug							' Debug String  

'------------------------------------------------------------------------------  
'	CONSTANTS  
'------------------------------------------------------------------------------  

' MAPI property tags used in this script  
Const CdoPR_ACTION = &H10800003
Const CdoPR_ACTION_FLAG = &H10810003
Const CdoPR_ACTION_DATE = &H10820040
Const CdoPR_AUTO_FORWARDED = &H0005000B
Const CdoPR_SENT_REPRESENTING_ADDRTYPE = &H0064001E
Const CdoPR_TRANSPORT_MESSAGE_HEADERS = &H007D001E
Const CdoPR_RTF_COMPRESSED = &H10090102

Const ACTION_REPLY = 261
Const ACTION_FORWARD = 262
Const ACTION_REPLY_SENDER = 102
Const ACTION_REPLY_ALL = 103
Const ACTION_FORWARD_FORWARD = 104

' Forward address type and e-mail address  
Const g_Const_ForwardAddress_Type = "SMTP"  

'hier musst du die empfänger-email eintragen  
Const g_Const_ForwardAddress = "Administrator@sbs2003.local"  

'------------------------------------------------------------------------------  
'	EVENT HANDLERS  
'------------------------------------------------------------------------------  

' DESCRIPTION: This event is fired when a new message is added to the folder  
Public Sub Folder_OnMessageCreated

	' Declare variables  
	Dim objSession						' Session  
	Dim objFolder						' Outbox folder  
	Dim objCurrentMsg					' Current message  
	Dim objForwardMsg					' Current message  
	Dim objFields						' Message fields  
	Dim objField						' Message field  
	Dim objRecipient					' Recipient  

	' Initialize variables  
	Set objSession = Nothing
	Set objFolder = Nothing
	Set objCurrentMsg = Nothing
	Set objForwardMsg = Nothing
	Set objFields = Nothing
	Set objField = Nothing
	Set objRecipient = Nothing

	' Clear error buffer  
	Err.Clear

	' Get session informationen  
	On Error Resume Next
	Set objSession = EventDetails.Session

	' No errors detected ?  
	If Err.Number = 0 Then

		' Write some logging  
		Call DebugAppend(objSession.CurrentUser & " AutoForward - Proccessing startet", False)  

		' Get outbox folder  
		Err.Clear
		On Error Resume Next
		Set objFolder = objSession.Outbox

		' No errors detected ?  
		If Err.Number = 0 Then

			' Get current message  
			Err.Clear
			On Error Resume Next
			Set objCurrentMsg = objSession.GetMessage(EventDetails.MessageID,Null)

			' Error detected ?  
			If Err.Number <> 0 Then

				' Error reading current message  
				Call DebugAppend("Error - Could not read current message", True)  
			Else

				' Remember subject of current message  
				Call DebugAppend("New message with subject: <" & objCurrentMsg.Subject & "> arrived", False)  

				 'Create forward message, write logging  
				Call DebugAppend("Create forward message", False)  

				' Forward message using Message.Forward()  
				On Error Resume Next
				Set objForwardMsg = objCurrentMsg.Forward()

				' Check if we've got a copy of the message  
				If Not objForwardMsg Is Nothing Then
					
					' Check if current message subject does not contain  
					' forward prefix  
					If Left(UCase(objCurrentMsg.Subject), 3) <> "FW:" Then  

						' Set forward subject with forward prefix  
						objForwardMsg.Subject = "FW: " & objCurrentMsg.Subject  
					Else

						' Set forward subject without forward prefix  
						objForwardMsg.Subject = objCurrentMsg.Subject
					End If

					Dim msgBody, strDescription, strCustomer, strPrio, strTel, posDescription, posCustomer, posPrio, posTel
					On Error Resume Next
					msgBody = objCurrentMsg.Text
   					posDescription = InStr(1, msgBody, "Description") + 11  
    					posCustomer = InStr(1, msgBody, "Customer") + 8  
    					posPrio = InStr(1, msgBody, "Priority") + 8  
					posTel = InStr(1,msgBody,"Telephone")+ 13  
					strDescription = Mid(msgBody, (InStr(posDescription, msgBody, ":") + 1), InStr(posDescription, msgBody, "Customer") - (InStr(posDescription, msgBody, ":") + 1))  
    					strCustomer = Mid(msgBody, (InStr(posCustomer, msgBody, ":") + 1), InStr(posCustomer, msgBody, "Department") - (InStr(posCustomer, msgBody, ":") + 1))  
    					strPrio = Mid(msgBody, (InStr(posPrio, msgBody, ":") + 1), InStr(posPrio, msgBody, "Affected Users") - (InStr(posPrio, msgBody, ":") + 1))  
   					strTel = Mid(msgBody, (InStr(posTel, msgBody, ":") + 1), InStr(posTel, msgBody, "Room") - (InStr(posTel, msgBody, ":") + 1))  
  
   					strDescription = Trim(Replace(strDescription, vbCrLf, ""))  
    					strCustomer = Trim(Replace(strCustomer, vbCrLf, ""))  
    					strPrio = Trim(Replace(strPrio, vbCrLf, ""))  
    					strTel = Trim(Replace(strTel, vbCrlLf,""))  
					If err.Number <> 0 then
						Call DebugAppend("Error - Could not format strings for body" , True)  
					End if
					strNewBody = "Description: " & vbCrLf & strDescription & vbCrLf & "Customer: " & vbCrLf & strCustomer & vbCrLf & "Priority: " & vbCrLf & strPrio & vbCrLf & "Tel.: " & strTel  

					' Set plain text message body  
					objForwardMsg.Text = strNewBody



					' Set recipient to forward message  
					On Error Resume Next
					Set objRecipient = objForwardMsg.Recipients.Add

					' Check if recipient added successful  
					If Not objRecipient Is Nothing Then
						objRecipient.Name = g_Const_ForwardAddress
						objRecipient.Address = g_Const_ForwardAddress
					End If

						' Resolve recipient  
						On Error Resume Next
						objRecipient.Resolve


						' Update and send message  
						Err.Clear
						On Error Resume Next
						objForwardMsg.Update
						objForwardMsg.Send

						' Errors detected ?  
						If Err.Number <> 0 then

							' Could not sent forward message, write logging  
							Call DebugAppend("Error - Could not send forward message", True)  
						Else

							' Forward message successfully sent  
							Call DebugAppend("Success - Forward message send successfully", False)  

							

							' Mark current message as read  
							objCurrentMsg.Unread = False
						
						End If
					
				End If
			End If
		Else

			' Write some logging  
			Call DebugAppend("Error - Could not get outbox folder", True)  
		End If
	Else

		' Write some logging  
		Call DebugAppend("Undefinied Error detected", True)  
	End If

	' Write some logging, without the folder name  
	Call DebugAppend("AutoForward - Processing finished", False)  

	' Clear objects  
	Set objSession = Nothing
	Set objFolder = Nothing
	Set objCurrentMsg = Nothing
	Set objForwardMsg = Nothing
	Set objFields = Nothing
	Set objField = Nothing
	Set objRecipient = Nothing

	' Write results to the Scripting Agent log  
	Script.Response = g_bstrDebug
End Sub

' DESCRIPTION: This event is fired when the timer on the folder expires  
Public Sub Folder_OnTimer
	'Not used  
End Sub

' DESCRIPTION: This event is fired when a message in the folder is changed  
Public Sub Message_OnChange
	'Not used  
End Sub

' DESCRIPTION: This event is fired when a message is deleted from the folder  
Public Sub Folder_OnMessageDeleted
	'Not used  
End Sub

'-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+  
'                  PRIVATE FUNCTIONS/SUBS  
'-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+  

'------------------------------------------------------------------------------  
'   Name: DebugAppend  
'   Area: Debug  
'   Desc: Simple Debugging Function  
'   Parm: String Text, Bool ErrorFlag  
'------------------------------------------------------------------------------  

Private Sub DebugAppend(bstrParm,boolErrChkFlag)

	If boolErrChkFlag = True Then
		If Err.Number <> 0 Then
			g_bstrDebug = g_bstrDebug & bstrParm & " - " & cstr(Err.Number) & " " & Err.Description & vbCrLf  
			Err.Clear
		End If
	Else
		g_bstrDebug = g_bstrDebug & bstrParm & vbCrLf
	End If

End Sub

</SCRIPT>
Member: sabado84
sabado84 May 16, 2008 at 08:03:27 (UTC)
Goto Top
Hallo Uwe,

vielen Dank. Ich werde die Sache meinem Vorgesetzen vorlegen und er soll dann entscheiden.

Gruß

Sabado