it4baer
Goto Top

Exchange CreateEvent mit Timezone

Hallo liebe Leut,

ich bin gerade dabei mir mit NTLM, SOAP mir einen Exchange Client in PHP zu basteln.

soweit funktioniert dieser schon ganz gut, allerdings habe ich noch Probleme mit der "Zeitzone" beim Termin Anlegen.

#e.g. "2010-09-21T16:00:00Z"; # ISO date format. Z denotes UTC time
		$CreateEvent->Items = new stdClass();
		$CreateEvent->Items->CalendarItem = new stdClass();
		$CreateEvent->Items->CalendarItem->Subject = $subject;
		$CreateEvent->Items->CalendarItem->Start = $start; 
		$CreateEvent->Items->CalendarItem->End = $end;
		$CreateEvent->Items->CalendarItem->IsAllDayEvent = $isallday;
		$CreateEvent->Items->CalendarItem->LegacyFreeBusyStatus = $busyStatus;
		$CreateEvent->Items->CalendarItem->Location = $location;
		$CreateEvent->Items->CalendarItem->Culture = "de-DE";  

return $response = $this->client->CreateItem( $CreateEvent );

so in etwa lege ich den "Termin" an...

Ich Zapfe hierfür ein "normales" Outlook.com Konto an...

Lege ich den Termin übers "webinterface" an steht im Array
[TimeZone] => (UTC+01:00) Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna

Lege ich diesen über meine "Schnittstelle" an steht da
[TimeZone] => (UTC+00:00) Monrovia, Reykjavik

also dachte ich mir, ich mache es mir leicht und erweitere das "Item" mit
$CreateEvent->Items->CalendarItem->TimeZone = "(UTC+01:00) Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna";

leider funktioniert das nicht...

Interessanterweise bringt er Folgenden Fehler:

stdClass Object
(
    [ResponseMessages] => stdClass Object
        (
            [CreateItemResponseMessage] => stdClass Object
                (
                    [ResponseCode] => NoError
                    [ResponseClass] => Success
                    [Items] => stdClass Object
                        (
                            [CalendarItem] => stdClass Object
                                (
                                    [ItemId] => stdClass Object
                                        (
                                            [Id] => AAAUFGdyb3VwY2FsQF91dGxvb2suY29tAEYAAAAAAAgZdk2zocZLtvQmUICl2QYHACFnOreAd9FIo+It/uNphcoAAADXG74AACFnNreAd9FIo+It/uNphcoAAAFXI5YAAA==
                                            [ChangeKey] => DwAAABY1AAAhZzq3gHfRSKPiLf7jfYXKADAE11A5
                                        )

                                )

                        )

                )

        )

)

Gebe ich ein "offensichtlich falsches" Objekt vor also ( $CreateEvent->Items->CalendarItem->FTimeZone ) trägt er den Termin ein und Ignoriert meine Vorgabe...

Ebenso habe ich als "TimeZone" auch schon "WEST" oder "GMT" versucht... aber ich bekomme es nicht hin...

Hat jemand eine Idee für mich?

Vielen Dank

Content-Key: 337743

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

Printed on: April 26, 2024 at 08:04 o'clock

Member: emeriks
emeriks May 13, 2017 updated at 17:08:45 (UTC)
Goto Top
Hi,
schon mal Zahlen versucht?
0 - UTC
+1 - Berlin

Nur im Dunkeln gestochert.

E-
Member: it4baer
it4baer May 13, 2017 at 21:41:40 (UTC)
Goto Top
schon mal Zahlen versucht?

ja, das geht leider auch nicht...

evtl. noch ne andere idee?

es gibt auch die "ServerTimeZones" ... das ist dann eine Liste aus "hunderten" Timezones...

die Id 50 wäre dann z.B. welche für Berlin:
stdClass Object
(
    [Periods] => stdClass Object
        (
            [Period] => Array
                (
                     => stdClass Object
                        (
                            [Bias] => -PT1H
                            [Name] => Standard
                            [Id] => trule:Microsoft/Registry/W. Europe Standard Time/1-Standard
                        )

                    [1] => stdClass Object
                        (
                            [Bias] => -PT2H
                            [Name] => Daylight
                            [Id] => trule:Microsoft/Registry/W. Europe Standard Time/1-Daylight
                        )

                )

        )

    [TransitionsGroups] => stdClass Object
        (
            [TransitionsGroup] => stdClass Object
                (
                    [Id] => 0
                )

        )

    [Transitions] => stdClass Object
        (
            [Transition] => stdClass Object
                (
                    [To] => stdClass Object
                        (
                            [_] => 0
                            [Kind] => Group
                        )

                )

        )

    [Id] => W. Europe Standard Time
    [Name] => (UTC+01:00) Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna
)

allerdings ist es auch nicht die 50 oder die
$CreateEvent->Items->CalendarItem->TimeZone->Id
...

Leider komme ich gar nicht weiter face-sad
Mitglied: 132895
132895 May 13, 2017 updated at 22:36:33 (UTC)
Goto Top
Hier stehts
https://msdn.microsoft.com/en-us/library/office/dn789031(v=exchg.150).as ...
Du brauchst nur ein Objekt vom Typ TimeZoneInfo in den Properties StartTimeZone und EndTimeZone des CalendarItems, oder alternativ eben im Konstruktor des Service.

Gruß
Member: it4baer
it4baer May 14, 2017 updated at 18:32:52 (UTC)
Goto Top
@132895, vielen Dank für die Hilfe... ich hab das alles mal durchgearbeitet... leider hänge ich trotzdem noch dran face-sad

Variante A
$timezone = $this->client->GetServerTimeZones()->ResponseMessages->GetServerTimeZonesResponseMessage->TimeZoneDefinitions->TimeZoneDefinition[50];

$CreateEvent->Items->CalendarItem->StartTimeZone = $timezone;
$CreateEvent->Items->CalendarItem->EndTimeZone = $timezone;


Variante B
		$timeZone = new stdClass();
		$timeZone->Periods = new stdClass();
		$timeZone->Periods->Period = new stdClass();
		$timeZone->Periods->Period->Bias = "-PT1H";  
		$timeZone->Periods->Period->Name = "Standard";  
		$timeZone->Periods->Period->Id = "trule:Microsoft/Registry/W. Europe Standard Time/1-Standard";  
		$timeZone->Periods->Period[1] = new stdClass();
		$timeZone->Periods->Period[1]->Bias = "-PT2H";  
		$timeZone->Periods->Period[1]->Name = "Daylight";  
		$timeZone->Periods->Period[1]->Id = "trule:Microsoft/Registry/W. Europe Standard Time/1-Daylight";  
		$timeZone->TransitionsGroups = new stdClass();
		$timeZone->TransitionsGroups->TransitionsGroup = new stdClass();
		$timeZone->TransitionsGroups->TransitionsGroup->Id = 0;
		$timeZone->Transitions = new stdClass();
		$timeZone->Transitions->Transition = new stdClass();
		$timeZone->Transitions->Transition->To = new stdClass();
		$timeZone->Transitions->Transition->To->_ = 0;
		$timeZone->Transitions->Transition->To->Kind = "Group";  
		$timeZone->Id = "W. Europe Standard Time";  
		$timeZone->Name = "(GMT+01:00) Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna";  

$CreateEvent->Items->CalendarItem->StartTimeZone = $timezone;
$CreateEvent->Items->CalendarItem->EndTimeZone = $timezone;

// aus spaß habe ich auch mal das hinterlegt:
		$timeZone->Transition = new stdClass();
		$timeZone->Transition->To = new stdClass();
		$timeZone->Transition->To->_ = 0;
		$timeZone->Transition->To->Kind = "Group";  

//=> weil er ja die 'Transition' unbedingt will... aber ich weiß nicht "in welcher Form" 

Als Rückmeldung kommt immer:
Uncaught SoapFault exception: [Client] SOAP-ERROR: Encoding: object has no 'Transition' property in: $new = $client->create_event( $CreateEvent );


Wenn ich die "Transision" Objekte weglasse, meldet er:
An internal server error occurred. The operation failed., Custom time zone should have Periods, TransitionsGroups, and Transitions elements.
=> aber genau diese Elemente liefer ich ja :/

wie ich "Grundsätzlich" als Client die Timezone einstellen kann, habe ich garnicht verstanden.

Vielen Dank für jeden Tipp face-smile

edit: habe jetzt herausgefunden, dass man die TimeZone auch so beziehen kann:
		$request->Ids->Id = 'W. Europe Standard Time';  
		$response = $this->client->GetServerTimeZones($request);
		$tz = $response->ResponseMessages->GetServerTimeZonesResponseMessage->TimeZoneDefinitions->TimeZoneDefinition; 


leider bringt mich das trotzdem nicht weiter

=> evtl, will jemand die verwendeten klassen einsehen...
https://github.com/rileydutton/Exchange-Web-Services-for-PHP/tree/master ...
Member: it4baer
it4baer May 15, 2017 at 07:33:10 (UTC)
Goto Top
nach langer suche, habe ich jemanden gefunden, welcher den selben Fehler als ich hatte...

https://github.com/jamesiarmes/php-ews/issues/82

Dieser Fehler wurde vom >jamesiarmes< auch behoben

<- allerdings ist das ein "anderer Hersteller" ... die Frage ist, ob jetzt jemand die "Fähigkeit" besitzt, den Fehler da auszulesen und die Lösung für meine "klasse" bereitzustellen?

Das ist mir natürlich auch was wert! Gerne hierzu an mich eine PN (z.B. Amazon-Gutschein)
Mitglied: 132895
132895 May 15, 2017 updated at 08:47:44 (UTC)
Goto Top
Zitat von @it4baer:
<- allerdings ist das ein "anderer Hersteller" ... die Frage ist, ob jetzt jemand die "Fähigkeit" besitzt, den Fehler da auszulesen und die Lösung für meine "klasse" bereitzustellen?
Alle Änderungen lassen sich auf Github schön nachvollziehen, setz die Client-Timezone im SOAP-Header richtig dann passt das auch schon im vornherein.
https://github.com/jamesiarmes/php-ews/commit/734f6a3ff7938dd9ad239f17e3 ...
"Deinen Hersteller" und "deine Klasse" kennt hier keine Sau ...
Member: it4baer
it4baer May 15, 2017 at 11:29:29 (UTC)
Goto Top
deshalb habe ich die Klassen ja "mitgegeben"...
https://github.com/rileydutton/Exchange-Web-Services-for-PHP/tree/master ...

=> so wirklich lange sind die klassen ja nicht...

das mit dem Header leuchtet mir ein, aber ich wüsste nicht "wo" ich den nachrüsten kann ... <- und auch nicht mit welchen Werten

die Klasse vom jamesjarmes ist leider nicht so einfach als PHP lauffähig zu machen sondern muss unter Linux installiert werden <- da habe ich kein System zur Verfügung! <- und auch nicht das "know how"
Mitglied: 132895
132895 May 15, 2017 at 11:33:30 (UTC)
Goto Top
die Klasse vom jamesjarmes ist leider nicht so einfach als PHP lauffähig zu machen sondern muss unter Linux installiert werden
Quark, die laufen auf jedem Webserver der PHP ausführen kann!
Member: it4baer
it4baer May 15, 2017 at 12:05:52 (UTC)
Goto Top
ganz bestimmt... aber man muss diese eben "umschreiben" oder vendorlisten dazu bauen !?!?

ich bekomms auf jeden fall leider nicht hin :/
Mitglied: 132895
132895 May 15, 2017 at 12:19:58 (UTC)
Goto Top
Zitat von @it4baer:

ganz bestimmt... aber man muss diese eben "umschreiben" oder vendorlisten dazu bauen !?!?
Nö.
Member: it4baer
it4baer May 15, 2017 at 12:27:40 (UTC)
Goto Top
joa... nö hilft mir jetzt nicht weiter...

magst du mir denn erklären wie ich dass dann "nutzen" kann?
Mitglied: 132895
132895 May 15, 2017 updated at 12:29:55 (UTC)
Goto Top
Steht hier doch schon
Mit Skript auf Debian-Server prüfen, ob im Exchange-Account im Kalender für jeweils heute "Urlaub" steht
Einfach entpacken und nutzen, einfacher geht's nicht.
Member: it4baer
it4baer May 15, 2017 at 12:45:25 (UTC)
Goto Top
hm... das ist halt eine andere Klasse oder "ältere" Version...

die Datei NTLMSoapClient.php oder EWSType.php gibt es schlichtweg nicht...
Mitglied: 132895
132895 May 15, 2017 updated at 12:59:58 (UTC)
Goto Top
Verarschen kann ich mich selbst, hier sind alle benötigten Klassen, auch wenn sie vielleicht jetzt anders heißen, Prinzip bleibt ja gleich.
https://github.com/jamesiarmes/php-ews/tree/master/src
Beispiele wie du sie nutzt findest du eine Ebene höher unter examples:
https://github.com/jamesiarmes/php-ews/blob/master/examples/event/create ...
Member: it4baer
it4baer May 15, 2017 at 13:07:19 (UTC)
Goto Top
ach wo...

hast du dir die daten überhaupt schon mal angeschaut???

abgesehen davon, dass ich überall andere Filenamen habe, wird auch "in den Files"
z.B. das gesucht: require_once '../../vendor/autoload.php';

also... ich kanns leider nicht! ... aber es ist okay, wenn du keinen bock drauf hast (zumindest kann ich das aus deine lieblos hingeworfenen infos herauslesen <- sorry, wenn ich das falsch verstehe).

eigentlich habe ich auch ein ganz anderes problem... enttäuschend sich jetzt 3 stunden mit dem script zu beschäftigen, wenn ich nachher neu meine eigene klasse aufbauen muss, welche auf der anderen basis nahezu fertig ist :/ ...

mir geht es eigentlich nur darum den header anzupassen um die TimeZones setzen zu können... also wäre es vom Nutzen "dies Script" zum laufen zu bringen und dann den Header auszulesen <- wann was wie passiert! Leider ist es eben nicht "wie beschrieben" mal kopieren und losgehts...
Mitglied: 132895
132895 May 15, 2017 updated at 13:21:49 (UTC)
Goto Top
Zitat von @it4baer:
hast du dir die daten überhaupt schon mal angeschaut???
Wohl besser als du...
Hier steht doch das wenn du Autoloading der Klassen willst das du dir die Funktion selbst anlegen musst!!!
http://jamesarmes.com/php-ews/0.1/
/**
 * Function to autoload the requested class name.
 * 
 * @param string $class_name Name of the class to be loaded.
 * @return boolean Whether the class was loaded or not.
 */
function __autoload($class_name)
{
    // Start from the base path and determine the location from the class name.
    $base_path = 'path/to/php-ews/';  
    $include_file = $base_path . str_replace('_', '/', $class_name) . '.php';  

    return (file_exists($include_file) ? require_once $include_file : false);
}
Wenn man zu faul ist zu lesen, bin ich hier jetzt raus, sorry.

Viel Erfolg.
Member: it4baer
it4baer May 15, 2017 at 14:39:15 (UTC)
Goto Top
danke & sorry
Member: it4baer
it4baer May 15, 2017 at 16:36:25 (UTC)
Goto Top
leider ist die klasse von jamesarmes.com auch nicht Zielführend... zwar kann man beim Auslesen endlich die TimeZone setzen... aber man kann beim generieren von neuen Terminen keinen Start bzw. EndTimeZone setzen face-sad ... <- also genau wie bei mir auch schon (nur, dass die Klasse 1 Millionen unübersichtliche Funktionen hat, welche ich nicht brauche)...
Mitglied: 132895
132895 May 16, 2017 updated at 10:27:28 (UTC)
Goto Top
aber man kann beim generieren von neuen Terminen keinen Start bzw. EndTimeZone setzen
Doch, das funktioniert hier tadellos, habe es gerade selbst ausprobiert!

Schnapp dir den EWS-Editor und sende einen plain SOAP-Request mit folgendem Inhalt:
(RequestServerVersion bitte an den verwendeten Exchange anpassen!).

Und du wirst sehen das das einwandfrei durch geht.

btw. die von dir geposteten Klassen sind voller Fehler und Ungereimtheiten. Die von James ist das um Längen besser da sie alle Typen korrekt implementiert!
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
               xmlns:xsd="http://www.w3.org/2001/XMLSchema"  
               xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"  
               xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types">  
  <soap:Header>
    <t:RequestServerVersion Version="Exchange2010_SP2"/>  
  </soap:Header>
  <soap:Body>
    <CreateItem xmlns="http://schemas.microsoft.com/exchange/services/2006/messages"  
                xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types"  
                SendMeetingInvitations="SendToNone" >  
      <SavedItemFolderId>
        <t:DistinguishedFolderId Id="calendar"/>  
      </SavedItemFolderId>
      <Items>
        <t:CalendarItem xmlns="http://schemas.microsoft.com/exchange/services/2006/types">  
          <Subject>Planning Meeting</Subject>
          <Body BodyType="Text">Plan the agenda for next week's meeting.</Body>  
          <ReminderIsSet>false</ReminderIsSet>
          <ReminderMinutesBeforeStart>60</ReminderMinutesBeforeStart>
          <Start>2017-05-17T12:00:00</Start>
          <End>2017-05-17T13:00:00</End>
          <LegacyFreeBusyStatus>Busy</LegacyFreeBusyStatus>
          <Location>Testraum</Location>
          <StartTimeZone Id="W. Europe Standard Time">  
              <t:Periods>
                  <t:Period Bias="-PT1H" Name="Standard" Id="trule:Microsoft/Registry/W. Europe Standard Time/1-Standard" />  
                  <t:Period Bias="-PT2H" Name="Daylight" Id="trule:Microsoft/Registry/W. Europe Standard Time/1-Daylight" />  
              </t:Periods>
              <t:TransitionsGroups>
                  <t:TransitionsGroup Id="0">  
                      <t:RecurringDayTransition>
                          <t:To Kind="Period">trule:Microsoft/Registry/W. Europe Standard Time/1-Daylight</t:To>  
                          <t:TimeOffset>PT2H</t:TimeOffset>
                          <t:Month>3</t:Month>
                          <t:DayOfWeek>Sunday</t:DayOfWeek>
                          <t:Occurrence>-1</t:Occurrence>
                      </t:RecurringDayTransition>
                      <t:RecurringDayTransition>
                          <t:To Kind="Period">trule:Microsoft/Registry/W. Europe Standard Time/1-Standard</t:To>  
                          <t:TimeOffset>PT3H</t:TimeOffset>
                          <t:Month>10</t:Month>
                          <t:DayOfWeek>Sunday</t:DayOfWeek>
                          <t:Occurrence>-1</t:Occurrence>
                      </t:RecurringDayTransition>
                  </t:TransitionsGroup>
              </t:TransitionsGroups>
              <t:Transitions>
                  <t:Transition>
                      <t:To Kind="Group">0</t:To>  
                  </t:Transition>
              </t:Transitions>
          </StartTimeZone>
          <EndTimeZone Id="W. Europe Standard Time">  
              <t:Periods>
                  <t:Period Bias="-PT1H" Name="Standard" Id="trule:Microsoft/Registry/W. Europe Standard Time/1-Standard" />  
                  <t:Period Bias="-PT2H" Name="Daylight" Id="trule:Microsoft/Registry/W. Europe Standard Time/1-Daylight" />  
              </t:Periods>
              <t:TransitionsGroups>
                  <t:TransitionsGroup Id="0">  
                      <t:RecurringDayTransition>
                          <t:To Kind="Period">trule:Microsoft/Registry/W. Europe Standard Time/1-Daylight</t:To>  
                          <t:TimeOffset>PT2H</t:TimeOffset>
                          <t:Month>3</t:Month>
                          <t:DayOfWeek>Sunday</t:DayOfWeek>
                          <t:Occurrence>-1</t:Occurrence>
                      </t:RecurringDayTransition>
                      <t:RecurringDayTransition>
                          <t:To Kind="Period">trule:Microsoft/Registry/W. Europe Standard Time/1-Standard</t:To>  
                          <t:TimeOffset>PT3H</t:TimeOffset>
                          <t:Month>10</t:Month>
                          <t:DayOfWeek>Sunday</t:DayOfWeek>
                          <t:Occurrence>-1</t:Occurrence>
                      </t:RecurringDayTransition>
                  </t:TransitionsGroup>
              </t:TransitionsGroups>
              <t:Transitions>
                  <t:Transition>
                      <t:To Kind="Group">0</t:To>  
                  </t:Transition>
              </t:Transitions>
          </EndTimeZone>
        </t:CalendarItem>
      </Items>
    </CreateItem>
  </soap:Body>
</soap:Envelope>

Server Response:
<?xml version="1.0" encoding="utf-8"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
    <s:Header>
        <h:ServerVersionInfo MajorVersion="14" MinorVersion="3" MajorBuildNumber="181" MinorBuildNumber="6" Version="Exchange2010_SP2" xmlns:h="http://schemas.microsoft.com/exchange/services/2006/types" xmlns="http://schemas.microsoft.com/exchange/services/2006/types" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" />
    </s:Header>
    <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
        <m:CreateItemResponse xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages" xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types">
            <m:ResponseMessages>
                <m:CreateItemResponseMessage ResponseClass="Success">
                    <m:ResponseCode>NoError</m:ResponseCode>
                    <m:Items>
                        <t:CalendarItem>
                            <t:ItemId Id="AAMkADMzZGE1Nzg1LWRkMWUtNDBiZS1hNmU5LTdiMDk0NjM2NDlhOQBGAAAAAAB0HYZuTqKFTZbIxPn/41WMBwCKwpJ9YVt3S7wyyx9sKd6yAAAAAAAdAACKwpJ9YVt3S7wyyx9sKd6yAAW5Ld6UAAA=" ChangeKey="DwAAABYAAACKwpJ9YVt3S7wyyx9sKd6yAAW5Lg8o" />
                        </t:CalendarItem>
                    </m:Items>
                </m:CreateItemResponseMessage>
            </m:ResponseMessages>
        </m:CreateItemResponse>
    </s:Body>
</s:Envelope>