2017-04-14 1 views
0

Ich erstelle eine .vcs-Datei mit der iCalcreator (v2.6) PHP-Bibliothek. Wenn das Ereignis in Outlook geöffnet wird (neueste Version, ich weiß nichts über andere Versionen), wird das Besprechungsdatum nicht auf die lokale Zeit angepasst. Ich dachte, es könnte mit this verwandt sein, aber das Einstellen des X-MICROSOFT-CDO-TZID-Werts schien nicht zu helfen. Ich hoffe, jemand weiß etwas über die Erstellung von vcs-Dateien, die mich in die richtige Richtung weisen kann. Hier ist die VCS-Datei, die ich schaffe:Es ist nicht möglich, vCalendar (vcs) beim Öffnen in einer anderen Zeitzone anzupassen.

BEGIN:VCALENDAR 
CALSCALE:GREGORIAN 
METHOD:PUBLISH 
PRODID:-//127.0.53.53//NONSGML iCalcreator 2.6// 
VERSION:2.0 
BEGIN:VTIMEZONE 
TZID:US/Pacific 
LAST-MODIFIED:20040110T032845Z 
X-MICROSOFT-CDO-TZID:13 
BEGIN:DAYLIGHT 
DTSTART:19900404T010000 
TZOFFSETFROM:-0800 
TZOFFSETTO:-0700 
RRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU 
TZNAME:PDT 
END:DAYLIGHT 
BEGIN:STANDARD 
DTSTART:19901026T060000 
TZOFFSETFROM:-0700 
TZOFFSETTO:-0800 
RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU 
TZNAME:PST 
END:STANDARD 
END:VTIMEZONE 
BEGIN:VEVENT 
UID:[email protected] 
DTSTAMP:20170413T185736Z 
DESCRIPTION:sdfg\n\nSome awesome description 
DTSTART:20170419T180000 
DURATION:PT3H0M0S 
LOCATION:The best place in the world 
SUMMARY:One fine summary 
END:VEVENT 
END:VCALENDAR 

Antwort

0

Jahre zu spät, aber hier ist, wie es funktioniert für mich, und vielleicht wird dies jemand helfen anderen, die auf diese Frage kommt.

Ich habe TZOFFSETFROM noch nie versucht ... also nicht sicher, worum es geht oder ob es überhaupt funktionieren sollte. Wenn Sie die Zeitzone jedoch in DTSTART und DTEND setzen, wird sie automatisch angepasst. Sie müssen nur das Datum in UTC wie Ihr LAST-MODIFIED Datum haben. Ich mache es dies wie ($start und $end sind PHP Datetime-Objekte):

"DTSTART:".$start->setTimezone(new DateTimeZone('UTC'))->format('Ymd\THis\Z').$eol. 
"DTEND:".$end->setTimezone(new DateTimeZone('UTC'))->format('Ymd\THis\Z') 

Also, im Grunde alles, was das Datum in die UTC-Zeitzone wird tut gesetzt und dann formatiert das Datum/Zeit mit einem Z am Ende um dies dem Kunden mitzuteilen.

Ein komplettes Arbeitsbeispiel (in dem Fall, jeder kann es nützlich ist) ist:

<?php 
    date_default_timezone_set('America/New_York'); 
    //CONFIGURE HERE 
    $fromName   = "John Doe"; 
    $fromEmail   = "[email protected]"; 
    $toName    = "Your Name"; 
    $toEmail   = '[email protected]'; 
    $start    = new DateTime('2017-08-15 15:00'); 
    $end    = new DateTime('2017-08-15 16:00'); 
    $summary   = "Hello World Event"; 
    //END CONFIGURATION 

    $uid    = ""; 
    $headers   = array(); 
    $boundary   = "_CAL_" . uniqid("B",true) . "_B_"; 
    $headers[]   = "MIME-Version: 1.0"; 
    $headers[]   = "Content-Type: multipart/alternative; boundary=\"".$boundary."\""; 
    $headers[]   = "To: \"{$toName}\" <{$toEmail}>"; 
    $headers[]   = "From: \"{$fromName}\" <{$fromEmail}>"; 

    $calendarLines  = array(
     "BEGIN:VCALENDAR", 
     "METHOD:REQUEST", 
     "PRODID:-//PHP//MeetingRequest//EN", 
     "VERSION:2.0", 
     "BEGIN:VEVENT", 
     "ORGANIZER;CN={$fromName}:MAILTO:{$fromEmail}", 
     "ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;CN={$toName}:MAILTO:{$toEmail}", 
     "DESCRIPTION:{$summary}", 
     "SUMMARY:{$summary}", 
     "DTSTART:".$start->setTimezone(new DateTimeZone('UTC'))->format('Ymd\THis\Z'), 
     "DTEND:".$end->setTimezone(new DateTimeZone('UTC'))->format('Ymd\THis\Z'), 
     "UID:{$uid}", 
     "CLASS:PUBLIC", 
     "PRIORITY:5", 
     "DTSTAMP:".gmdate('Ymd\THis\Z'), 
     "TRANSP:OPAQUE", 
     "STATUS:CONFIRMED", 
     "SEQUENCE:0", 
     "LOCATION:123 Any Street", 
     "BEGIN:VALARM", 
     "ACTION:DISPLAY", 
     "DESCRIPTION:REMINDER", 
     "TRIGGER;RELATED=START:-PT15M", 
     "END:VALARM", 
     "END:VEVENT", 
     "END:VCALENDAR" 
    ); 


    $calendarBase64  = base64_encode(implode("\r\n",$calendarLines)); 
    //ensure we don't have lines longer than 70 characters for older computers: 
    $calendarResult  = wordwrap($calendarBase64,68,"\n",true); 

    $emailLines = array(
     "--{$boundary}", 
     "Content-Type: text/html; charset=\"iso - 8859 - 1\"", 
     "Content-Transfer-Encoding: quoted-printable", 
     "", 
     "<html><body>", 
     "<h1>Hello World</h1>", 
     "<p>This is a calendar event test</p>", 
     "</body></html>", 
     "", 
     "--{$boundary}", 
     "Content-Type: text/calendar; charset=\"utf - 8\"; method=REQUEST", 
     "Content-Transfer-Encoding: base64", 
     "", 
     $calendarResult, 
     "", 
     "--{$boundary}--" 
    ); 
    $emailContent = implode("\n",$emailLines); 

    $headersResult  = implode("\n",$headers); 
    mail($toEmail, $summary, $emailContent, $headersResult); 
    echo("<pre>".htmlentities($headersResult)."\n\n".htmlentities($emailContent)."</pre>"); 
    echo("<br /><br />"); 
    echo("<pre>".base64_decode($calendarResult)."</pre>"); 
Verwandte Themen