Termine von Exchange und WebDav per PHP in IPS

In Anknüpfung an diesen etwas älteren Thread hier eine einfache Möglichkeit, per PHP Termine von Exchange (bei mir: 2010) auszulesen und als ICS-Datei zu speichern oder halt weiterzuverarbeiten:

  1. Es werden die Skripte von PHP-EWS benötigt. Ich habe sie als ZIP geladen und im Skript-verzeichnis von IPS in einem eigenen Ordner „php-ews“ gespeichert.

  2. Ein Skript „include_user.php“ anlegen (und Datei auch so umbenennen), Angaben anpassen, Version kann so bleiben:

$host = "Host";
$username = "Username";
$password = "Passwort";
$version = "";
  1. Das Funktionsskript anlegen, Monate ggf. anpassen:
<?

	// Termine der nächsten x Monate
	$month = 3;

	// libraries
	require_once('php-ews/ExchangeWebServices.php');
	require_once('php-ews/NTLMSoapClient.php');
	require_once('php-ews/NTLMSoapClient/Exchange.php');
	require_once('php-ews/EWS_Exception.php');
	require_once('php-ews/EWSType.php');

	require_once('include_user.php');

	// autoload
	spl_autoload_register( function ($class) { $class = explode('_', $class); if ($class[0] == 'EWSType') require_once 'php-ews/' .$class[0] . '/' . $class[1] . '.php'; } );



	// Define EWS
	$ews = new ExchangeWebServices($host, $username, $password, $version);

	// Set init class
	$request = new EWSType_FindItemType();
	// Use this to search only the items in the parent directory in question or use ::SOFT_DELETED
	// to identify "soft deleted" items, i.e. not visible and not in the trash can.
	$request->Traversal = EWSType_ItemQueryTraversalType::SHALLOW;
	// This identifies the set of properties to return in an item or folder response
	$request->ItemShape = new EWSType_ItemResponseShapeType();
	$request->ItemShape->BaseShape = EWSType_DefaultShapeNamesType::DEFAULT_PROPERTIES;

	// Define the timeframe to load calendar items
	$request->CalendarView = new EWSType_CalendarViewType();
	$request->CalendarView->StartDate =  date("c");// current date
	$request->CalendarView->EndDate = date("c", strtotime("+".$month." months"));// "countmonths" month(s) later

	// Only look in the "calendars folder"
	$request->ParentFolderIds = new EWSType_NonEmptyArrayOfBaseFolderIdsType();
	$request->ParentFolderIds->DistinguishedFolderId = new EWSType_DistinguishedFolderIdType();
	$request->ParentFolderIds->DistinguishedFolderId->Id = EWSType_DistinguishedFolderIdNameType::CALENDAR;

	// Send request
	$response = $ews->FindItem($request);

	// ics header
	$icsdetails = "BEGIN:VCALENDAR".chr(10);
	$icsdetails = $icsdetails."VERSION:2.0".chr(10);
	$icsdetails = $icsdetails."PRODID:-//cybermonde.org/handcal//NONSGML v1.0//EN".chr(10);

	// Loop through each item if event(s) were found in the timeframe specified
	if ($response->ResponseMessages->FindItemResponseMessage->RootFolder->TotalItemsInView > 0){
		$events = $response->ResponseMessages->FindItemResponseMessage->RootFolder->Items->CalendarItem;
		foreach ($events as $event){
			$start = $event->Start;
			$end = $event->End;
			$subject = $event->Subject;
			$location = $event->Location;
			// ics detail
			$icsdetails = $icsdetails."BEGIN:VEVENT".chr(10);
			// clean date
			$cleandate = array("-", ":");
			$icsdetails = $icsdetails."DTSTART:".str_replace($cleandate, "", $start).chr(10);
			$icsdetails = $icsdetails."DTEND:".str_replace($cleandate, "", $end).chr(10);
			$icsdetails = $icsdetails."SUMMARY:".$subject.chr(10);
			$icsdetails = $icsdetails."LOCATION:".$location.chr(10);
			$icsdetails = $icsdetails."END:VEVENT".chr(10);
		}
	}
	else {
		// No items returned
	}

	// ics footer
	$icsdetails = $icsdetails."END:VCALENDAR".chr(10);
	
//print_r($icsdetails);

	// write ics file
	$fileout="../media/$username.ics";
	$fileptr = fopen($fileout, "w");
	fwrite($fileptr, $icsdetails);
	fclose($fileptr);

//	echo "<p><a href='ics/$username.ics'>$username.ics</a></p>";

?>

  1. Skript ausführen, es wird im Media-Ordner eine ICS-Datei mit dem Usernamen angelegt.

Was man mit PHP-EWS und Exchange in Sachen Kalender, Mail, Kontakte, … noch alles so anstellen kann, findet man hier.

Mithilfe der von Schablone ergänzten Ferengi-Master-Terminverwaltung, die ich für meine Zwecke angepasst/vereinfacht habe, entsteht auf der Basis von mehreren ICS- und Exchange-Kalendern automatisch eine praktische, kleine Terminübersicht für Geburtstage, Müll, Arbeit, Frauchen, mich, …

termine.png

Grüße
galleto

Hi,

vielen Dank zunächst für den Tipp mit dem PHP-EWS!

Magst du bitte deine „vereinfachte“ Ferengi-Terminverwaltung posten?
Ich bräuchte einfach nur die Möglichkeit, die .ics-Datei in IPSymcon einzulesen und irgendwie in einer Stringbox zu visualisieren… dafür möchte ich eigentlich garkeine komplette Terminverwaltung in IPS :wink:

Dank & Gruß
Michael

Hatte und habe den selben geringen Funktionsanspruch. Ich hoffe, man sieht es den Skripten nicht allzu sehr an. :wink:

  1. Der Vollständigkeit halber: Zusätzlich zu den Exchange-Terminen - siehe oben - werden auch die ICS-Dateien vom Webdav-Speicher eingesammelt (die für Müll lade ich einmal im Jahr manuell vom Entsorger) und jeweils als Text-Datei gespeichert:
 <?

$array = array("NameA","NameB","NameC","NameD","NameE");

//und los
foreach($array as $key => $value) {

	$Name = $value;

	$url = "https://USER:PASSWORT@WEBDAVURL".$Name.".ics";

	$ch = curl_init();
	curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
	curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
	curl_setopt($ch, CURLOPT_URL, $url);

	$file_txt = IPS_GetKernelDir()."media\\Kalender\\$Name.txt";
	$fp = fopen($file_txt, 'wb');

	curl_setopt($ch, CURLOPT_FILE, $fp);
	curl_setopt($ch, CURLOPT_HEADER, 0);
	curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);

	curl_exec ($ch);
	curl_close ($ch);
	fclose($fp);
	}

?>

In der Zeile $url = „https://USER:PASSWORT@WEBDAVURL“.$Name.".ics"; sind die drei groß geschrieben Angaben anzupassen!

  1. Jede als *.txt gespeicherte ICS-Datei wird mit einem zugehörigen Skript durchforstet, dabei alle Termine in ein einfacheres Format umgewandelt und in eine verkürzte Text-Datei gespeichert. Die einzelnen Skripte ermöglichen mir, auf Besonderheiten (wie Wiederholungstermine) der ICS-Dateien einzugehen. Mein Kurzformat ist „$TIMESTAMP,$dd,$MM,$Terminname,$Kalendername, ENDE“ - etwa „1391036400,30,01,Elternabend,Frauchen,ENDE“. Hier ein Beispielskript:
<?

/*=============================================

Skriptvorlage: 
export_sunbird - Martin Heinzel - 18.03.2010 
Version: 2.1 

Beschreibung:
In diesem Skript werden die relevanten Termindaten einer *.ics (Sunbird
Terminverwaltung) in eine *.txt konvertiert.

================================================*/


//Bitte anpassen
//------------------------------------------
//Ablageort für *.txt
$file_txt = IPS_GetKernelDir()."media\\Kalender\\NameB_kurz.txt";
//Ablageort für *.ics ("Sunbird")
$file_sunbird = IPS_GetKernelDir()."media\\Kalender\\NameB.txt";
//Terminart
$term_art = "Frauchen";
//------------------------------------------


//--------------------------- Main ----------------------------

// Variablen

//String für kompletten Sunbird Datensatz
$Sunbird_DS_komplett = "";
//String array für Termine
$term_arr_komplett = array();
$dauer_term_arr = array();
//$term_arr_komplett[] = "000000000,00,00,,";
//timestamp,tag,monat,inhalt,art


//Daten holen
if(file_exists($file_sunbird))
//Termine in Variable einlesen
$Sunbird_DS_komplett = file_get_contents($file_sunbird);
//print_r ($Sunbird_DS_komplett);

// war die Kalenderdatei gefüllt?
if(strpos($Sunbird_DS_komplett,'VCALENDAR'))
{

//Den kompletten Datensatz zerlegen
$Sunbird_DS_arr_komplett = explode("BEGIN:", $Sunbird_DS_komplett);
//print_r($Sunbird_DS_arr_komplett);

//alle Datensätze durchlaufen
foreach($Sunbird_DS_arr_komplett as $key_1 => $value_1)
    {

    $term_inhalt            = "";
    $term_end               = "ENDE";

    $term_tag                  = "";
    $term_monat             = "";
    $term_jahr              = "";

    $startdatum             = "";

    //Schalter inaktiv setzen
    $rrule                    = 0;
    $zusatz                 = 0;

    //Der erste Datensatz ist "2"
   if($key_1 > 1)
        {
        //einzelnen Datensatz in Daten zerlegen
         $Sunbird_arr = explode("
", $value_1);
//        $Sunbird_arr = explode("
", $value_1);

        //Nur Datensätze vom Typ "VEVENT" durchlaufen
        if($Sunbird_arr[0] == "VEVENT")
            {
            //alle Daten durchlaufen
            foreach($Sunbird_arr as $key_2 => $value_2)
                {
                //Daten zerlegen in Parameter und Wert
                $Data_arr = explode(":", $value_2);

                //Kontrolle der Parameter
                Switch($Data_arr[0])
                    {
                
                    case "SUMMARY":
                    $term_inhalt     = $Data_arr[1];
                    $term_inhalt     = iconv('UTF-8','ISO-8859-1',$term_inhalt);
                    break;

                    //Wiederholender Termin
                    case "RRULE":
//                    print_r($Data_arr[1]."
");

                    //Wiederholung zerlegen und in array
                    //    $term_rule_arr = explode(";", $Data_arr[1]);
                    $rrule = 1;
                    $timestamp = time();
                    $diesjahr = date("Y",$timestamp);
                    $term_jahr_rr          = $diesjahr;
                    break;

                    //Zeitstempel Datum
                    case "DTSTART":
                    case "DTSTART;VALUE=DATE":
                    $term_jahr      = substr($Data_arr[1], 0, 4);
                    $term_monat     = substr($Data_arr[1], 4, 2);
                    $term_tag       = substr($Data_arr[1], 6, 2);
                    if ($rrule)
                        {
                        $term_jahr = $term_jahr_rr;
                           }
                    $startdate = $Data_arr[1];
                      $start_timestamp   = mktime(0, 0, 0, (int)$term_monat, (int)$term_tag, (int)$term_jahr);
                    break;

                    //Zeitstempel Datum und Zeit
                    case "DTSTART;TZID=Europe/Berlin":
                    $term_jahr      = substr($Data_arr[1], 0, 4);
                    $term_monat     = substr($Data_arr[1], 4, 2);
                    $term_tag       = substr($Data_arr[1], 6, 2);
                    if ($rrule)
                        {
                        $term_jahr = $term_jahr_rr;
                           }
                    break;

                    case "DTSTART;VALUE=DATE;TZID=Europe/Berlin":
                    $term_jahr     = substr($Data_arr[1], 0, 4);
                    $term_monat     = substr($Data_arr[1], 4, 2);
                    $term_tag       = substr($Data_arr[1], 6, 2);
                    if ($rrule)
                        {
                        $term_jahr = $term_jahr_rr;
                           }
                    break;

                    case "DTEND;VALUE=DATE":
                    $end_jahr     = substr($Data_arr[1], 0, 4);
                    if ($end_jahr >= date("Y"))
                        {
                        $end_monat     = substr($Data_arr[1], 4, 2);
                           $end_tag       = substr($Data_arr[1], 6, 2);
                          $end_timestamp   = mktime(0, 0, 0, (int)$end_monat, (int)$end_tag, (int)$end_jahr);

                        if ($start_timestamp !== $end_timestamp - (24 * 60 *60))
                            {
                            $dauer = round(($end_timestamp - $start_timestamp) / 60 / 60 / 24) - 1;

                            for ($i = 1; $i <= $dauer; $i++)
                                {
                                   $start_timestamp = $start_timestamp + (24 * 60 *60);
                                if (!$zusatz)
                                       {
                                       $zusatz_term_tag = $term_tag + 1;
                                    $zusatz                 = 1;
                                    }
                                else $zusatz_term_tag = $zusatz_term_tag + 1;
                                
                                foreach($Sunbird_arr as $key_3)
                                    {
                                     if (strstr($key_3, "SUMMARY") != False )
                                        {
                                          $term_inhalt = substr($key_3, 8);
                                          $term_inhalt = iconv('UTF-8','ISO-8859-1',$term_inhalt);
                                        }
                                    }
                                
                                $zusatz_term_arr[0] = $start_timestamp;
                                   $zusatz_term_arr[1] = sprintf("%02s", $zusatz_term_tag);
                                $zusatz_term_arr[2] = sprintf("%02s", $term_monat);
                                   $zusatz_term_arr[3] = $term_inhalt;
                                   $zusatz_term_arr[4] = $term_art;
                                   $zusatz_term_arr[5] = $term_end;
                                $zusatz_termin      = implode(",", $zusatz_term_arr);
                                $dauer_term_arr[]   = $zusatz_termin;
                                }
                            }
                        }
                    break;
                    
                    }
                }

            //Restliche Daten generieren
            //Time stamp
            $term_timestamp   = mktime(0, 0, 0, (int)$term_monat, (int)$term_tag, (int)$term_jahr);

            //Termin array zusammenstellen
             $term_arr[0]  = $term_timestamp;
               $term_arr[1] = sprintf("%02s", $term_tag);
            $term_arr[2] = sprintf("%02s", $term_monat);
               $term_arr[3] = $term_inhalt;
               $term_arr[4] = $term_art;
               $term_arr[5] = $term_end;

            //Termin in einen String
            $termin           = implode(",", $term_arr);
            $term_arr_komplett[] = $termin;
            }
        }
    }

$term_arr_komplett = array_merge($term_arr_komplett,$dauer_term_arr);
sort($term_arr_komplett); // nach Zeit sortieren
$term_neu_komplett = implode("
", $term_arr_komplett); // in String zurück
//print_r($term_neu_komplett);

$handle=fopen($file_txt, "w");
fwrite($handle,$term_neu_komplett);
fclose($handle);

}
//---------------------- Main Ende ----------------------------

?>

Falls die erzeugte „kurze Textdatei“ fehlerhaft/leer ist, dann den alternativen Zeilenumbruch durch (aus)kommentieren umschalten!

  1. Wenn alles in „kurze Textdateien“ umgewandelt wurde, dann werden diese mit folgendem Skript ausgelesen. Die Termine werden sortiert, dann „heute“, „morgen“, einem späteren Wochentag oder noch späteren Datum zugeordnet und farbig markiert als Tabelle in die Variable 12345 geschrieben:
<?

//Daten holen, zerlegen und sortieren
$file_abfall = IPS_GetKernelDir()."media\\Kalender\\Abfall2013_kurz.txt";
$file_geburt = IPS_GetKernelDir()."media\\Kalender\\Geburtstage_kurz.txt";
$file_arbeit = IPS_GetKernelDir()."media\\Kalender\\Arbeit_kurz.txt";
$file_privat = IPS_GetKernelDir()."media\\Kalender\\Privat_kurz.txt";
$file_frauchen = IPS_GetKernelDir()."media\\Kalender\\frauchen_kurz.txt";
$file_exchange = IPS_GetKernelDir()."media\\Kalender\\exchange_kurz.txt";

$Daten_abfall = file_get_contents($file_abfall);
$Daten_geburt = file_get_contents($file_geburt);
$Daten_arbeit = file_get_contents($file_arbeit);
$Daten_privat = file_get_contents($file_privat);
$Daten_frauchen = file_get_contents($file_frauchen);
$Daten_exchange = file_get_contents($file_exchange);


$Daten_komplett = $Daten_abfall."
".$Daten_geburt."
".$Daten_arbeit."
".$Daten_privat."
".$Daten_frauchen."
".$Daten_exchange;
$Daten_arr_komplett = explode("
", $Daten_komplett);
sort($Daten_arr_komplett);


//Daten durchlaufen
foreach($Daten_arr_komplett as $key_1 => $value_1) {

		 //Zeitstempel extrahieren
		 if (substr($value_1,9,1) == ",") $laenge = 9;
		 else $laenge = 10;
	    $timestamp = substr($value_1,0,$laenge);
		 $now = time();

		 //für alle zukünftigen Datensätze

       if(!function_exists('date2timestamp')) {
		  function date2timestamp($datum1) {
        list($day, $month, $year) = explode(".", $datum1);
        $year = sprintf("%04d", $year);
        $month = sprintf("%02d", $month);
        $day = sprintf("%02d", $day);
        return(mktime(0, 0, 0, $month, $day, $year));
	     }
	    }
		 $termindatum = date("d.m.Y",$timestamp);
		 $heutedatum = date("d.m.Y",$now);

		 if (date2timestamp($termindatum) >= date2timestamp($heutedatum)) {

				//Datensatz zerlegen und Daten entnehmen
				$Datensatz_arr = explode(",", $value_1);
				@$datumalt = $datumneu;
			   $datum = date("d.m.Y",$timestamp);
         	$inhalt = $Datensatz_arr[3];
				$art = "";
         	$art = $Datensatz_arr[4];

				//Datum ggf. ersetzen und färben
				$heute   = date("d.m.Y",$now);
	         $morgen = date("d.m.Y",($now + 86400));
	         $wochentage = array("Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Sonnabend", "Sonntag");
	         $tag = date("w",$timestamp);

				if ($datum == $heute) {
					$datumneu = "<td style=\"color:red\">heute</td>";
					}
	         elseif ($datum == $morgen) {
					$datumneu = "<td style=\"color:red\">morgen</td>";
					}
	         elseif ($timestamp <= ($now + 604800)) {
					if (!$tag) $datumneu = "<td>Sonntag</td>";
					else $datumneu = "<td>".$wochentage[$tag-1]."</td>";
					}
				else {
				$datumneu = "<td>".date("d.m.",$timestamp)."</td>";
				}

  				if ($datumneu == $datumalt) $datum = "<td></td>";
  				else $datum = $datumneu;

				//Inhalt präzisieren und färben

				$muell = "Abfall";
				$geburtstage = "Geburtstag";
				$arbeit = "Arbeit";
				$privat = "Privat";
				$frauchen = "Frauchen";
				$exchange = "Exchange";
				
				if ($art==$muell) $farbe = "orange";
				elseif ($art==$geburtstage) $farbe = "#0099FF";
				elseif ($art==$arbeit) $farbe = "darkred";
				elseif ($art==$exchange) $farbe = "darkred";
				elseif ($art==$privat) $farbe = "green";
				elseif ($art==$frauchen) $farbe = "green";

				$inhalt = "<td style=\"color:$farbe\">$inhalt</td>";

			//Termine zusammenführen

			$termin = "<tr>".$datum.$inhalt."</tr>";
			$termin_arr[] = $termin;
		 }

}
$termin_arr_kurz = array_slice($termin_arr, 0, 12);
$term_fertig = implode("", $termin_arr_kurz);
$table = "<table border=\"0\"><colgroup width=\"100\"></colgroup>".$term_fertig."<table>";
SetValue(12345,$table);

?>

Die viertletzte Zeile begrenzt die Anzahl der Termine (aktuell 12). Ein paar Zeilen vorher werden die Anzeigefarben definiert.

So, ich hoffe das ist ausreichend verständlich und die Anonymisierung hat keine Fehler eingebaut (die Formatierung hat offenbar etwas gelitten - sorry). Ansonsten: Fragen! :wink:

Mit Dank an Ferengi-Master und Schablone!

Grüße
galleto

Ergänzung: Zusammen mit @ika haben wir festgestellt, dass von Exchange ein abweichendes Datumsformat kommen kann, was im zweiten Skript eine Anpassung erforderlich macht. Die mittlere Zeile ist neu:

//Zeitstempel Datum und Zeit
   case "DTSTART":
   case "DTSTART;TZID=Europe/Berlin":

Grüße
galleto

Bin Zufälliger weis ob auf das Script von galleto gestoßen und habe es im Grund 1zu1 übernommen. Danke noch mal. Ich will im Grund aus meinen Outlook Exchange Postfach die Termine auslesen und diesen dann als ics im Web anzeigen lassen. Die Anzeige besorgt mir dann phpicalendar.net. Das ganze läuft auch schon (ical.pcboy.de). Nur will ich in Outlook nicht den Hauptkalender(1) haben sondern mehrere Unterkalender(1.1,1.2, usw) anlegen. Aus diesen sollen dann die ICS Dateien erstellt werden die dann am ende Anzeigt werden.
Hier in etwa die Struktur in Outlook im Kalender

  1. Calendar

[INDENT]1.1 Ferien
1.2 Jahrgang 5-7
1.3 Jahrgang 8-10
1.4 Oberstufe
1.5 Schulische Gremine
1.6 Sonstige Termine [/INDENT]
Das würde die ganze Verwaltung bei uns erheblich vereinfachen… Leider bin ich mir nicht im klaren ob das Überhaupt machbar ist… Ich bin nicht sicher wo ich Ansetzten soll da mir Outlook Programmierung sehr Fremd ist…
Vielleicht weis ja eine Rat…

Ich habe eine Vermutung, mir fehlt aber etwas das Hintergrundwissen…
Ich vermute ich muss den Folder ändern in dem ich suche oder das ganze Recursive machen und die Items erweitern die ich finden will…
also Entweder hier

    // Only look in the "calendars folder"
    $request->ParentFolderIds = new EWSType_NonEmptyArrayOfBaseFolderIdsType();
    $request->ParentFolderIds->DistinguishedFolderId = new EWSType_DistinguishedFolderIdType();
    $request->ParentFolderIds->DistinguishedFolderId->Id = EWSType_DistinguishedFolderIdNameType::CALENDAR; 

oder hier

   // This identifies the set of properties to return in an item or folder response
    $request->ItemShape = new EWSType_ItemResponseShapeType();
    $request->ItemShape->BaseShape = EWSType_DefaultShapeNamesType::DEFAULT_PROPERTIES; 

Aber wie gesagt mir fehlt das Hintergrundwissen…

Hallo bhoernchen,

und herzlich Willkommen im IPS-Forum für Hausautomation.

Ob Du bzgl. PHP-EWS hier mehr Hintergrund Wissen findest weiß ich nicht da wir hier hauptsächlich beim Thema Hausautomation sind. PHP-EWS findet hier nur bei einer Handvoll User Anwendung.

In Sachen Kalender habe ich mich mal auf https://github.com/jamesiarmes/php-ews/wiki/Calendar:-Check-user-and-room-calendars-for-items-that-don’t-match umgesehen. In diesem Eintrag wird zwar nach Räumen gesucht aber vielleicht hilft es Dir weiter.

Falls nicht würde ich aber genau dort die Frage platzieren.

Hallo,

ich würde gerne ebenfalls meine Termine aus Outlook 2010 im Webfront sehen, betreibe aber keinen Exchange-Server. Meine User-Kalender share ich bereits per WebDAV über meinen kleinen Heimserver. Nun würde ich gerne die Kalenderdaten im Webfront sehen. Nicht bearbeiten, ändern, … .

Da meine PHP-Kenntnisse leider nur minimalistisch sind und ein Umbau der vorhandenen Scripte für mich viel zu schwierig ist, habe ich mich gefragt, ob vielleicht jemand aus der Community dies bereits ohne Exchange-Server nutzt und seine Scripte zur Verfügung stellen könnte.

Im Thread wurde ja bereits beschrieben, dass das auslesen von WebDAV-Daten wohl bereits funktioniert, jedoch weis ich nicht, was hierzu nötig ist, bzw. was (von Exchange) weggelassen werden kann.

Für Eure Unterstützung wäre ich sehr dankbar.

Gruß Proxima

Wo klemmt es denn? Hast Du die Kalenderdateien schon im IPS-Zugriff?

In Beitrag #3 ist unter Nr. 0 erklärt, wie es mit Webdav läuft. Eine Anpassung der Skripte ist - von den Pfaden und Dateinamen abgesehen - eigentlich nicht nötig.

Beschreib mal Deinen Stand, dann gehe wir es schrittweise durch.

Grüße
galleto

Hallo,

also ich habe mal meine Daten in das erste Script eingegeben. Daraufhin werden im Ordner …\scripts\Kalender\ zwei TXT-Dateien angelegt, die die Namen der ICS-Dateien haben. Die Dateien sind aber leer. Die ICS-Dateien, geöffnet mit dem Texteditor sind aber prall gefüllt.

Warum sind die Dateien leer ???

Gruß Proxima

Okay, Du hast richtigerweise das Skript von Nr. 1 genommen. Darunter steht:

Falls die erzeugte „kurze Textdatei“ fehlerhaft/leer ist, dann den alternativen Zeilenumbruch durch (aus)kommentieren umschalten!

Hast Du das schon probiert?

Grüße
galleto

Hallo,

also …

ich habe das Script Nr.0 aus Post #3 genommen, um aus der ICS-Datei die „lange“ TXT-Datei zu machen. Diese wird angelegt, jedoch steht in der langen TXT-Datei etwas von IIS 8.0 … bla bla bla … fehler 500.19, bzw. 401.3. Ich vermute also, das auf die ICS-Datei nicht zugegriffen werden kann.

Mittels Outlook kann auf die ICS-Dateien zugegriffen und die Kalender angezeigt werden.

Muß ich an den Sicherheitseinstellungen der ICS-Dateien etwas verändern, damit IPS darauf zugreifen kann ???

Ach ja, das Ganze läuft unter WSE2012.

Gruß Proxima

Ah, doch noch Skript Nr. 0, hatte ich falsch verstanden. Das holt die ICS-Dateien per WebDAV ab und speichert sie als *.txt - wenn es hier zu Fehlern kommt, dann gibt es ein (Einstellungs-) Problem bezüglich WebDAV. Das hat mit IPS eigentlich noch nix zu tun.

Greifst Du tatsächlich über SSL („https“) auf die Dateien zu?

Falls ja, nimm mal folgendes Skript, damit wir uns langsam heranarbeiten (falls nein, kommentiere die SSL-Optionen aus und passe „http(s)“ an):

<?

    $url = "https://USER:PASSWORT@WEBDAVURL/NAME.ics";

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
    curl_setopt($ch, CURLOPT_URL, $url);

    $file_txt = IPS_GetKernelDir()."media\\Kalender\	est.txt";
    $fp = fopen($file_txt, 'wb');

    curl_setopt($ch, CURLOPT_FILE, $fp);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);

    curl_exec ($ch);
    curl_close ($ch);
    fclose($fp);
    
?>

Anzupassen sind (Beispiel: https://mustermann:geheim@abc.de/test.ics)

  • USER
  • PASSWORT
  • WEBDAVURL
  • NAME
    Die volle Adresse sollte auch per Browser aufrufbar sein.

Da ich das Ganze aber fachlich nicht wirklich aus dem Ärmel schütteln kann, müsstest Du die Fehlermeldung selber mit Googel analysieren. Vielelicht bringt das noch mehr Infos.

Wenn Du die Dateien dann lokal verfügbar hast, kann ich wieder mehr unter die Arme greifen.

Grüße
galleto

Hallo,

also irgendwie bekomme ich das mit dem IIS nicht hin. Ich habe also die ICS-Datei auf meinen 1&1-Online-Speicher hochgeladen.

Nur wie gebe ich jetzt den Benutzernamen in er URL an, da dieser die eMail-Adresse ist ( inkl. @ ) ???

Gruß Proxima

Edit: OK, habs selbst rausbekommen.

Hallo,

so, also das nächste Problem:

Mit dem Script #0 erhalte ich die lange TXT. Mit dem nächsten Script soll die lange in eine kurze TXT umgewandelt werden. Es wird nur mit dem Umstellen der Zeilenumbrauchs-Variable die kurze TXT befüllt. Allerdings erhalte ich dabei Fehler:

Wie kann ich die Fehler beheben ???

Gruß Proxima

Also dies war sehr wichtig - Funktioniert sonst mit meinem Exchange 2010 - VIELEN DANK

Hallo,

das hatte ich bereits gelesen und integriert, der Fehler bleibt aber trotzdem. Wenn ich den alternativen Zeilenumbruch ändere, bleibt die kurze TXT leer.

Welche IPS-Version benutzt Du ???
Kann es sein, das z.B. ändern der PHP-Version da was durcheinander gerät / nicht mehr so funktioniert ???
Soll ich Dir die TXT-Datei(en) und Scripte mal zukommen lassen ???

Gruß Proxima

Das hat mit den Versionen sicher nix zu tun. Sieht ja auch schon ganz gut aus, den Fehler bekommen wir auch noch in den Griff.

Offensichtlich kennt er (an der Stelle!) die Variable $start_timestamp nicht. Ich beschäftige mich dann gleich näher damit, aber auf dem ersten Blick liegt es wohl daran, dass diese Varaibel in einem anderen „case“-Abschnitt definiert wird, den es bei Dir wahrscheinlich inhaltlich nicht gibt - der „case“ wird daher nicht durchlaufen, deshalb ist die Variable im case „DTEND;VALUE=DATE“ ab Zeile 132 nicht bekannt.

Melde mich dann, hoffentlich mit der Lösung. :wink:

Grüße
galleto

Versuch mal bitte Folgendes:

Das Skript kennt u.a. folgende drei „case“-Abschnitte:

case "DTSTART;VALUE=DATE":
...
case "DTSTART":
case "DTSTART;TZID=Europe/Berlin":
...
case "DTSTART;VALUE=DATE;TZID=Europe/Berlin":

Nur im ersten Abschnitt wird definiert:

$start_timestamp   = mktime(0, 0, 0, (int)$term_monat, (int)$term_tag, (int)$term_jahr);

Wenn Du jetzt im zweiten (und dritten) Abschnitt diese Zeile vor der Zeile „break;“ einfügst, klappt es dann?

Grüße
galleto

Hallo,

leider noch immer die gleichen Fehler (etwas verschoben):

Notice:  Undefined variable: start_timestamp in C:\IP-Symcon\scripts\37072.ips.php on line 144

Notice:  Undefined variable: start_timestamp in C:\IP-Symcon\scripts\37072.ips.php on line 146

Notice:  Undefined variable: start_timestamp in C:\IP-Symcon\scripts\37072.ips.php on line 150


Hier nochmal das von mir verwendete Script

<?

/*=============================================
Skriptvorlage:
export_sunbird - Martin Heinzel - 18.03.2010
Version: 2.1
Beschreibung:
In diesem Skript werden die relevanten Termindaten einer *.ics (Sunbird
Terminverwaltung) in eine *.txt konvertiert.

================================================*/


//Bitte anpassen
//------------------------------------------
//Ablageort für kurze *.txt
$file_txt = IPS_GetKernelDir()."media\\Kalender\\Kalender_Jürgen_kurz.txt";
//Ablageort für lange *.txt ("ICS")
$file_sunbird = IPS_GetKernelDir()."media\\Kalender\\Kalender_von_J%C3%BCrgen_Steb.txt";
//Terminart
$term_art = "Jürgen";
//------------------------------------------


//--------------------------- Main ----------------------------

// Variablen

//String für kompletten Sunbird Datensatz
$Sunbird_DS_komplett = "";
//String array für Termine
$term_arr_komplett = array();
$dauer_term_arr = array();

//Daten holen
if(file_exists($file_sunbird))

//Termine in Variable einlesen
$Sunbird_DS_komplett = file_get_contents($file_sunbird);

// war die Kalenderdatei gefüllt?
if(strpos($Sunbird_DS_komplett,'VCALENDAR')){

//Den kompletten Datensatz zerlegen
$Sunbird_DS_arr_komplett = explode("BEGIN:", $Sunbird_DS_komplett);

//alle Datensätze durchlaufen
foreach($Sunbird_DS_arr_komplett as $key_1 => $value_1)
{

$term_inhalt            = "";
$term_end               = "ENDE";

$term_tag                  = "";
$term_monat             = "";
$term_jahr              = "";

$startdatum             = "";

//Schalter inaktiv setzen
$rrule                         = 0;
$zusatz                 = 0;

    //Der erste Datensatz ist "2"
   if($key_1 > 1)
    {
        //einzelnen Datensatz in Daten zerlegen

         //***Achtung! Alternativer Zeilenumbruch!***
         $Sunbird_arr = explode("
", $value_1);
//       $Sunbird_arr = explode("
", $value_1);

        //Nur Datensätze vom Typ "VEVENT" durchlaufen
        if($Sunbird_arr[0] == "VEVENT")
        {
            //alle Daten durchlaufen
            foreach($Sunbird_arr as $key_2 => $value_2)
            {
            //Daten zerlegen in Parameter und Wert
            $Data_arr = explode(":", $value_2);

                //Kontrolle der Parameter
                Switch($Data_arr[0])
                        {
                            case "SUMMARY":
                          $term_inhalt    = $Data_arr[1];
                        $term_inhalt    = iconv('UTF-8','ISO-8859-1',$term_inhalt);
                        break;

                    //Wiederholender Termin
                            case "RRULE":
                                $rrule = 1;

                        $timestamp         = time();
                        $diesjahr         = date("Y",$timestamp);
                        $term_jahr_rr     = $diesjahr;
                        break;

                    //Zeitstempel Datum
                            case "DTSTART;VALUE=DATE":
                        $term_jahr         = substr($Data_arr[1], 0, 4);
                         $term_monat     = substr($Data_arr[1], 4, 2);
                         $term_tag       = substr($Data_arr[1], 6, 2);
                        if ($rrule)
                            {
                           $term_jahr = $term_jahr_rr;
                           }
                        $startdate = $Data_arr[1];
                        $start_timestamp = mktime(0, 0, 0, (int)$term_monat, (int)$term_tag, (int)$term_jahr);
                        break;

                    //Zeitstempel Datum und Zeit
                            case "DTSTART":
                           case "DTSTART;TZID=Europe/Berlin":
                        $term_jahr      = substr($Data_arr[1], 0, 4);
                        $term_monat     = substr($Data_arr[1], 4, 2);
                        $term_tag       = substr($Data_arr[1], 6, 2);
                        if ($rrule)
                                     {
                           $term_jahr = $term_jahr_rr;
                              }
                        $start_timestamp = mktime(0, 0, 0, (int)$term_monat, (int)$term_tag, (int)$term_jahr);
                         break;

                     case "DTSTART;VALUE=DATE;TZID=Europe/Berlin":
                         $term_jahr         = substr($Data_arr[1], 0, 4);
                          $term_monat     = substr($Data_arr[1], 4, 2);
                          $term_tag       = substr($Data_arr[1], 6, 2);
                        if ($rrule)
                                    {
                           $term_jahr = $term_jahr_rr;
                              }
                        $start_timestamp = mktime(0, 0, 0, (int)$term_monat, (int)$term_tag, (int)$term_jahr);
                          break;

                            case "DTEND;VALUE=DATE":
                        $end_jahr     = substr($Data_arr[1], 0, 4);
                            if ($end_jahr >= date("Y"))
                               {
                               $end_monat     = substr($Data_arr[1], 4, 2);
                               $end_tag       = substr($Data_arr[1], 6, 2);
                           $end_timestamp = mktime(0, 0, 0, (int)$end_monat, (int)$end_tag, (int)$end_jahr);

                              if ($start_timestamp !== $end_timestamp - (24 * 60 *60))
                               {
                              $dauer = round(($end_timestamp - $start_timestamp) / 60 / 60 / 24) - 1;

                               for ($i = 1; $i <= $dauer; $i++)
                                  {
                                  $start_timestamp = $start_timestamp + (24 * 60 *60);
                                  if (!$zusatz)
                                     {
                                                $zusatz_term_tag = $term_tag + 1;
                                    $zusatz = 1;
                                    }
                                 else $zusatz_term_tag = $zusatz_term_tag + 1;

                                 $zusatz_term_arr[0] = $start_timestamp;
                                 $zusatz_term_arr[1] = sprintf("%02s", $zusatz_term_tag);
                                 $zusatz_term_arr[2] = sprintf("%02s", $term_monat);
                                 $zusatz_term_arr[3] = $term_inhalt;
                                 $zusatz_term_arr[4] = $term_art;
                                 $zusatz_term_arr[5] = $term_end;
                                 $zusatz_termin      = implode(",", $zusatz_term_arr);
                                 $dauer_term_arr[]   = $zusatz_termin;
                                 }
                              }
                           }
                          break;
                            }
                }

            //Restliche Daten generieren
            //Time stamp
               $term_timestamp = mktime(0, 0, 0, (int)$term_monat, (int)$term_tag, (int)$term_jahr);

            //Termin array zusammenstellen
                 $term_arr[0] = $term_timestamp;
               $term_arr[1] = sprintf("%02s", $term_tag);
                 $term_arr[2] = sprintf("%02s", $term_monat);
               $term_arr[3] = $term_inhalt;
               $term_arr[4] = $term_art;
               $term_arr[5] = $term_end;

            //Termin in einen String
                $termin               = implode(",", $term_arr);
                 $term_arr_komplett[] = $termin;
        }
    }
}

$term_arr_komplett = array_merge($term_arr_komplett,$dauer_term_arr);
sort($term_arr_komplett); // nach Zeit sortieren
$term_neu_komplett = implode("
", $term_arr_komplett); // in String zurück

$handle=fopen($file_txt, "w");
fwrite($handle,$term_neu_komplett);
fclose($handle);

}
//---------------------- Main Ende ----------------------------

?>


Gruß Proxima

Dann springt offenbar gar kein „case“ an. Wahrscheinlich hast Du noch ein anderes Datumsformat. Schau mal in Deine ICS-Datei. Wie genau lauten die Zeilen, die mit „DTSTART“ beginnen?

Kannst Du mal eine ICS-Datei als beispiel anonymiseren und hochladen/anhängen? Dann könnte ich das Format und weitere Probleme selber analysieren.

Grüße
galleto