jens4ever
Goto Top

Mit Skript auf Debian-Server prüfen, ob im Exchange-Account im Kalender für jeweils heute "Urlaub" steht

Moin zusammen,

ich möchte mit meinem Debian-Server prüfen, ob mein Exchange-Kalender für jeweils das aktuelle Datum einen Eintrag "Urlaub" enthält. Hintergrund: Ich steuere mit meinem Debian so einiges zu Hause und möchte keine 2 (bzw. 3) Kalender pflegen.

Ich habe schon mal Mailabfragen gemacht, aber beim Kalender geht es ja nicht per IMAP so weit ich weiß.
Hat jemand von euch einen Tipp, fertigen Code, oder einen Link, der mit helfen könnte?

Vielen Dank vorab.
Jensen

PS Frohes Fest und guten Rutsch an die Gemeinde hier.

Content-ID: 291418

Url: https://administrator.de/forum/mit-skript-auf-debian-server-pruefen-ob-im-exchange-account-im-kalender-fuer-jeweils-heute-urlaub-steht-291418.html

Ausgedruckt am: 22.12.2024 um 13:12 Uhr

114757
114757 20.12.2015 aktualisiert um 23:50:45 Uhr
Goto Top
Moin Jensen,
dafür gibts die Exchange Webservices(EWS), ob du dies nun mit PHP oder einer anderen Sprache umsetzt bleibt dir überlassen. Hier findest du schon zu 99% fertigen Code dafür
Exchange 2010 - bestimmte Kalendereinträge Abfragen und auf einer Webseite anzeigen lassen

Ebenso einen kollektiven Gruß zum Jahresendbesäufnis face-smile
jodel32

p.s. Danke für den Sixpack Bölkstoff face-wink
colinardo
Lösung colinardo 23.12.2015, aktualisiert am 13.02.2016 um 12:51:03 Uhr
Goto Top
Hallo Jensen,
@114757 hat dir schon den richtigen Tipp gegeben. Mit EWS ist das kein Problem.

Du besorgst dir folgende PHP-Bibliothek und entpackst sie in den Root deines PHP-Webservers:
https://github.com/jamesiarmes/php-ews

Vorraussetzungen sind:
  • PHP 5.2+
  • cURL with NTLM support (7.23.0+ recommended)

Dann erstellst du dir ein Skript mit folgendem Inhalt, wobei du SERVERNAME, USERNAME und PASSWORT in den Zeilen 17-19 anpasst

<?php
require_once '/php-ews/NTLMSoapClient.php';  
require_once '/php-ews/NTLMSoapClient/Exchange.php';  
require_once '/php-ews/ExchangeWebServices.php';  
require_once '/php-ews/EWSType.php';  
require_once '/php-ews/EWS_Exception.php';  
require_once '/php-ews/EWSType/DistinguishedFolderIdType.php';  
require_once '/php-ews/EWSType/ItemQueryTraversalType.php';  
require_once '/php-ews/EWSType/GetItemType.php';  
require_once '/php-ews/EWSType/DefaultShapeNamesType.php';  
require_once '/php-ews/EWSType/ItemResponseShapeType.php';  
require_once '/php-ews/EWSType/CalendarViewType.php';  
require_once '/php-ews/EWSType/NonEmptyArrayOfBaseFolderIdsType.php';  
require_once '/php-ews/EWSType/DistinguishedFolderIdNameType.php';  

function CheckForHoliday(){
	$server = 'DEINSERVERNAME';  
	$username = 'USERNAME';  
	$password = 'PASSWORD';  

        $string_search = "Urlaub";  
	$ews = new ExchangeWebServices($server, $username, $password);
	
	$request = new EWSType_GetItemType();
	
	$request->Traversal = EWSType_ItemQueryTraversalType::SHALLOW;
	$request->ItemShape = new EWSType_ItemResponseShapeType();
	$request->ItemShape->BaseShape = EWSType_DefaultShapeNamesType::DEFAULT_PROPERTIES;
	
	$request->CalendarView = new EWSType_CalendarViewType();
	
	$request->CalendarView->StartDate = date(DATE_W3C,mktime(0,0,0));
	$request->CalendarView->EndDate = date(DATE_W3C,mktime(23,59,59));
	
	$request->ParentFolderIds = new EWSType_NonEmptyArrayOfBaseFolderIdsType();
	$request->ParentFolderIds->DistinguishedFolderId = new EWSType_DistinguishedFolderIdType();
	$request->ParentFolderIds->DistinguishedFolderId->Id = EWSType_DistinguishedFolderIdNameType::CALENDAR;
	
	$response = $ews->FindItem($request);
	
	if ($response->ResponseMessages->FindItemResponseMessage->RootFolder->TotalItemsInView > 0){
		$events = $response->ResponseMessages->FindItemResponseMessage->RootFolder->Items->CalendarItem;
		//echo "<pre>" . print_r($events,true) . "</pre>"; 
		if(is_array($events)){
			foreach ($events as $event){
				if (preg_match("/" . preg_quote($string_search) . "/i",$event->Subject)){  
					return true;
				}
			}
		}else if(is_object($events)){
		        if (preg_match("/" . preg_quote($string_search) . "/i",$events->Subject)){  
				return true;
			}
		}
	}
	return false;
}

if (CheckForHoliday()){
	echo "Heute is Urlaub :-)";	  
}else{
	echo "Heut is arbeit :-(";  
}
?>
Wenn der String Urlaub im Betreff gefunden wird, gibt die Funktion true zurück, ansonsten false. Jetzt kannst du deine von dir gewünschte Aktion in der If-Abfrage am Ende des Skripts einbauen.

Frohes Fest und guten Rutsch
Grüße Uwe (@colinardo)
114757
114757 23.12.2015 um 14:35:48 Uhr
Goto Top
Jo, @colinardo, das ist natürlich mal wieder eine Steilvorlage face-smile so hat ich mir das auch vorgestellt.
colinardo
colinardo 30.12.2015 um 19:49:53 Uhr
Goto Top
Wenns das dann war, den Beitrag bitte noch auf gelöst setzen nicht vergessen. Merci.

Guten Rutsch.
Jens4ever
Jens4ever 30.12.2015 um 21:22:22 Uhr
Goto Top
Moin Colinardo,

erstmal vielen Dank für den Code.

Sorry hatte es neulich kurz getestet und kam nicht weiter. Hatte dann keine Zeit. ;)
Habe jetzt nochmal das Skript aufgerufen ("http://192.168.178.32/locked/abfrage.php") und bekomme eine 404. URL stimmt aber. Richtige Daten sind im Skript. Andere PHPs laufen.

Nur um sicher zu gehen: Ich habe eh für Abfragen Curl drauf. Muss ich für Curl mit NTLM noch was nachinstallieren?

"require_once '/php-ews/NTLMSoapClient.php';" verstehe ich so, dass die abfrage.php auf der selben Ebene liegen muss, wie das Directory "php-ews". Tut es.

Colinardo, hast du noch einen Tipp für mich?
Danke,
Jens.
colinardo
colinardo 31.12.2015 aktualisiert um 00:17:47 Uhr
Goto Top
N'Abend Jensen.
Zitat von @Jens4ever:
Nur um sicher zu gehen: Ich habe eh für Abfragen Curl drauf. Muss ich für Curl mit NTLM noch was nachinstallieren?
Nein, nur die minimal erforderliche Version von curl einhalten.
"require_once '/php-ews/NTLMSoapClient.php';" verstehe ich so, dass die abfrage.php auf der selben Ebene liegen muss, wie das Directory "php-ews". Tut es.
Falsch. Ein führender Slash sagt wie immer aus das das php-ews Verzeichnis im Root des Webservers gesucht wird.
Ist das bei dir nicht der Fall musst du es natürlich auf ./ (Punkt Slash) zur Referenzierung des relativen Pfads umschreiben.
Jens4ever
Jens4ever 13.02.2016 um 12:28:24 Uhr
Goto Top
Hallo Colinardo,

ich habe nun Zeit gefunden und es zum Laufen gebracht.
Du hast mir abermals ganz großartig geholfen mein kleines privates Projekt voran zu bringen.

Ich danke dir vielmals und wünsche ein schönes WE.
Jens.
Jens4ever
Jens4ever 13.02.2016 um 12:36:26 Uhr
Goto Top
Eine Frage noch:

Wenn ich im Outlook keinen Termin mit "Urlaub" habe, gibt es die korrekte Ausgabe:
root@debian02:~# php /php-ews/abfrage.php
Heut is arbeit :-(

Wenn es jedoch den Termin "Urlaub" gibt, dann kommt:
root@debian02:~# php /php-ews/abfrage.php
PHP Notice:  Undefined variable: event in /php-ews/abfrage.php on line 51
PHP Notice:  Trying to get property of non-object in /php-ews/abfrage.php on line 51
Heut is arbeit :-(

In der Zeile 51 steht:
if (preg_match("/" . preg_quote($string_search) . "/i",$event->Subject)){  

Muss da noch etwas angepasst werden? Er scheint ja mit der Variable $event nicht klarzukommen.

Danke und Gruß,
Jens.
colinardo
colinardo 13.02.2016 um 12:49:49 Uhr
Goto Top
Uups da fehlt das s bei $events in Zeile 51.
Jens4ever
Jens4ever 13.02.2016 aktualisiert um 13:26:51 Uhr
Goto Top
Bist ein Schatz. Es ist so klasse, was ich nun für Steuerungsmöglichkeiten habe. face-smile
Ich würde dir wieder nen Kaffee senden, falls du mir noch sagen könntest, wie ich alle jeweils heutigen Termine ausgeben könnte.

Ich will sie im Prinzip in eine Datei schreiben /php-ews/termine-heute.txt mit dem Inhalt BSP:
Geburtstag Colinardo
Blumen gießen
Lasertag

Wenn das geht, dann ist mein Tablet an der Flurwand der ultimative Tagesplaner :D
colinardo
colinardo 13.02.2016 aktualisiert um 14:08:07 Uhr
Goto Top
Dann mach dir eine zusätzliche Function unter den bisherigen Code
function WriteEventsToFile($filename){
	$server = 'DEINSERVERNAME';  
	$username = 'USERNAME';  
	$password = 'PASSWORD';  

        $string_search = "Urlaub";  
	$ews = new ExchangeWebServices($server, $username, $password);
	
	$request = new EWSType_GetItemType();
	
	$request->Traversal = EWSType_ItemQueryTraversalType::SHALLOW;
	$request->ItemShape = new EWSType_ItemResponseShapeType();
	$request->ItemShape->BaseShape = EWSType_DefaultShapeNamesType::DEFAULT_PROPERTIES;
	
	$request->CalendarView = new EWSType_CalendarViewType();
	
	$request->CalendarView->StartDate = date(DATE_W3C,mktime(0,0,0));
	$request->CalendarView->EndDate = date(DATE_W3C,mktime(23,59,59));
	
	$request->ParentFolderIds = new EWSType_NonEmptyArrayOfBaseFolderIdsType();
	$request->ParentFolderIds->DistinguishedFolderId = new EWSType_DistinguishedFolderIdType();
	$request->ParentFolderIds->DistinguishedFolderId->Id = EWSType_DistinguishedFolderIdNameType::CALENDAR;
	
	$response = $ews->FindItem($request);
	$allevents = ""  
	if ($response->ResponseMessages->FindItemResponseMessage->RootFolder->TotalItemsInView > 0){
		$events = $response->ResponseMessages->FindItemResponseMessage->RootFolder->Items->CalendarItem;
		if(is_array($events)){
			foreach ($events as $event){
                                $allevents .= $event->Subject ."\n";  
			}
		}else if(is_object($events)){
                        $allevents = $event->Subject;
		}
	}
	file_put_contents($filename, $allevents);
}

WriteEventsToFile("termine-heute.txt");  

Geburtstag Colinardo 
Bis dahin fließen noch ein paar Tage den Jordan runter face-smile

Schönes Wochenende
Grüße Uwe