I am sending event to MS outlook through mail, But Event time is different with what i have send.
I Also want to support icalender event for all Application like MS Outlook, Google Calendar ..etc
Any good resource or api for implement icalendar event then let me know.
e.g
Sending :
Start Time : 12:40 P.M.
End Time : 01:00 P.M.
At User end, Outlook shows event after 1 hour.
Start Time : 01:40 P.M.
End Time : 02:00 P.M.
I want the same result which i am sending.
Below is my icalendar code.
$ical = 'BEGIN:VCALENDAR' . "\r\n" .
'PRODID:-//Microsoft Corporation//Outlook 10.0 MIMEDIR//EN' . "\r\n" .
'VERSION:2.0' . "\r\n" .
'METHOD:REQUEST' . "\r\n" .
'BEGIN:VTIMEZONE' . "\r\n" .
'TZID:'.date_default_timezone_get() . "\r\n" .
'BEGIN:STANDARD' . "\r\n" .
'DTSTART:20091101T020000' . "\r\n" .
'RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=1SU;BYMONTH=11' . "\r\n" .
'TZOFFSETFROM:-0400' . "\r\n" .
'TZOFFSETTO:-0500' . "\r\n" .
'TZNAME:EST' . "\r\n" .
'END:STANDARD' . "\r\n" .
'BEGIN:DAYLIGHT' . "\r\n" .
'DTSTART:20090301T020000' . "\r\n" .
'RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=2SU;BYMONTH=3' . "\r\n" .
'TZOFFSETFROM:-0500' . "\r\n" .
'TZOFFSETTO:-0400' . "\r\n" .
'TZNAME:EDST' . "\r\n" .
'END:DAYLIGHT' . "\r\n" .
'END:VTIMEZONE' . "\r\n" .
'BEGIN:VEVENT' . "\r\n" .
'ORGANIZER;CN="'.$from_name.'":MAILTO:'.$from_address. "\r\n" .
'ATTENDEE;CN="'.$to_name.'";ROLE=REQ-PARTICIPANT;RSVP=TRUE:MAILTO:'.$to_address. "\r\n" .
'LAST-MODIFIED:' . date("Ymd\TGis") . "\r\n" .
'UID:'.date("Ymd\TGis", strtotime($startTime)).rand()."#".$domain."\r\n" .
'DTSTAMP:'.date("Ymd\TGis"). "\r\n" .
'DTSTART;TZID="'.date_default_timezone_get().'":'.date("Ymd", strtotime($startTime))."T".date("His", strtotime($startTime)). "\r\n" .
'DTEND;TZID="'.date_default_timezone_get().'":'.date("Ymd", strtotime($endTime))."T".date("His", strtotime($endTime)). "\r\n" .
'TRANSP:OPAQUE'. "\r\n" .
'SEQUENCE:1'. "\r\n" .
'SUMMARY:' . $subject . "\r\n" .
'CLASS:PUBLIC'. "\r\n" .
'PRIORITY:5'. "\r\n" .
'BEGIN:VALARM' . "\r\n" .
'TRIGGER:-PT15M' . "\r\n" .
'ACTION:DISPLAY' . "\r\n" .
'DESCRIPTION:Reminder' . "\r\n" .
'END:VALARM' . "\r\n" .
'END:VEVENT'. "\r\n" .
'END:VCALENDAR'. "\r\n";
What is in your TZID parameter needs to match what is in the TZID in the VTIMEZONE object.
Related
I have a php code, that generates and sends outlook event. But it sets user status as Busy and we dont want that. I know that I can send event to someone and set status as free time for that event. But I have no idea, how to do it in my code. So my question is, which parameter I need to change, to set event status as free time?
Code :
$ical = 'BEGIN:VCALENDAR' . "\r\n" .
'PRODID:-//Microsoft Corporation//Outlook 10.0 MIMEDIR//EN' . "\r\n" .
'VERSION:2.0' . "\r\n" .
'METHOD:REQUEST' . "\r\n" .
'BEGIN:VTIMEZONE' . "\r\n" .
'TZID:Central Europe Standard Time' . "\r\n" .
'BEGIN:STANDARD' . "\r\n" .
'DTSTART:16011028T030000' . "\r\n" .
'RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10' . "\r\n" .
'TZOFFSETFROM:+0200' . "\r\n" .
'TZOFFSETTO:+0100' . "\r\n" .
'END:STANDARD' . "\r\n" .
'BEGIN:DAYLIGHT' . "\r\n" .
'DTSTART:16010325T020000' . "\r\n" .
'RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=3' . "\r\n" .
'TZOFFSETFROM:+0100' . "\r\n" .
'TZOFFSETTO:+0200' . "\r\n" .
'END:DAYLIGHT' . "\r\n" .
'END:VTIMEZONE ' . "\r\n" .
'BEGIN:VEVENT' . "\r\n" .
'ORGANIZER;CN="'.$name.'":MAILTO:'.$name. "\r\n" .
'ATTENDEE;CN="'.$name.'";ROLE=REQ-PARTICIPANT;RSVP=TRUE:MAILTO:'.$name.','.$address.','.$address2.' ,'.$address3. "\r\n" .
'LAST-MODIFIED:' . date("Ymd\TGis") . "\r\n" .
'UID:'.date("Ymd\TGis", strtotime($startTime)).rand()."#".$domain."\r\n" .
'DTSTAMP:'.date("Ymd\TGis"). "\r\n" .
'DTSTART;TZID="Central Europe Standard Time":'.date("Ymd\THis", strtotime($startTime)). "\r\n" .
'DTEND;TZID="Central Europe Standard Time":'.date("Ymd\THis", strtotime($endTime)). "\r\n" .
'TRANSP:OPAQUE'. "\r\n" .
'SEQUENCE:1'. "\r\n" .
'SUMMARY:' . $subject . "\r\n" .
'CLASS:PUBLIC'. "\r\n" .
'PRIORITY:5'. "\r\n" .
'BEGIN:VALARM' . "\r\n" .
'TRIGGER:-PT15M' . "\r\n" .
'ACTION:DISPLAY' . "\r\n" .
'DESCRIPTION:Reminder' . "\r\n" .
'END:VALARM' . "\r\n" .
'END:VEVENT'. "\r\n" .
'END:VCALENDAR'. "\r\n";
$mail->Subject = "Invitation: Outlook Calendar Event";
$mail->AddStringAttachment($ical, "event.ics", "7bit", "text/calendar; charset=utf-8; method=REQUEST");
$mail->Body = "Test Outlook Calendar event mail";
$mail->Ical = $ical;
$mail->CharSet = 'UTF-8';
Just add this line in your ical with the right date and time :
FREEBUSY;FBTYPE=FREE:[date start format Ymd]T[time start format Gis]Z/[date end format Ymd]T[time end format Gis]Z
e.g. : FREEBUSY;FBTYPE=BUSY:19980415T133000Z/19980415T170000Z
Or, if it's for Outlook :
X-MICROSOFT-CDO-BUSYSTATUS:FREE
sources :
https://icalendar.org/iCalendar-RFC-5545/3-2-9-free-busy-time-type.html
https://learn.microsoft.com/en-us/openspecs/exchange_server_protocols/ms-oxcical/cd68eae7-ed65-4dd3-8ea7-ad585c76c736
hi i am generating even from php using ics vacalendar , but when event generate in gamil it change the time for correcting time i have added +0500 as i am in pakistan then it shows correct time
what i want i dnt want to use any time zone i want to create event in gmail at that time which i am posting in DTSTART and DTEND without anytimezone
here is my code
$ical = 'BEGIN:VCALENDAR' . "\r\n" .
'PRODID:-//Microsoft Corporation//Outlook 16.0 MIMEDIR//EN' . "\r\n" .
'VERSION:2.0' . "\r\n" .
'METHOD:REQUEST' . "\r\n" .
'BEGIN:VTIMEZONE' . "\r\n" .
'TZID:Eastern Time' . "\r\n" .
'BEGIN:STANDARD' . "\r\n" .
'DTSTART:20091101T020000' . "\r\n" .
'RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=1SU;BYMONTH=11' . "\r\n" .
'TZOFFSETFROM:+0500' . "\r\n" .
'TZOFFSETTO:+0500' . "\r\n" .
'TZNAME:UTC' . "\r\n" .
'END:STANDARD' . "\r\n" .
'BEGIN:DAYLIGHT' . "\r\n" .
'DTSTART:20090301T020000' . "\r\n" .
'RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=2SU;BYMONTH=3' . "\r\n" .
'TZOFFSETFROM:+0500' . "\r\n" .
'TZOFFSETTO:+0500' . "\r\n" .
'TZNAME:TZID' . "\r\n" .
'END:DAYLIGHT' . "\r\n" .
'END:VTIMEZONE' . "\r\n" .
'BEGIN:VEVENT' . "\r\n" .
'ORGANIZER;CN="'.$from_name.'":MAILTO:'.$from_address. "\r\n" .
'LAST-MODIFIED:' . date("Ymd\TGis") . "\r\n" .
'UID:'.date("Ymd\TGis", strtotime($startTime)).rand()."#".$domain."\r\n" .
'DTSTAMP:'.date("Ymd\TGis"). "\r\n" .
'DTSTART;TZID=UTC:'.date("Ymd\THis", strtotime($startTime)). "\r\n" .
'DTEND;TZID=UTC:'.date("Ymd\THis", strtotime($endTime)). "\r\n" .
'TRANSP:OPAQUE'. "\r\n" .
'SEQUENCE:1'. "\r\n" .
'SUMMARY:' . $subject . "\r\n" .
'LOCATION:' . $location . "\r\n" .
'CLASS:PUBLIC'. "\r\n" .
'PRIORITY:5'. "\r\n" .
'BEGIN:VALARM' . "\r\n" .
'TRIGGER:-PT15M' . "\r\n" .
'ACTION:DISPLAY' . "\r\n" .
'DESCRIPTION:Reminder' . "\r\n" .
'END:VALARM' . "\r\n" .
'END:VEVENT'. "\r\n" .
'END:VCALENDAR'. "\r\n";
If you don't want to post a timezone, you should know this is only meaningful for some 'events'eg: A reminder to take pills at 10am whichever timezone you are in. That is the only date-time in the ics specifocation for which there is no timezone. It is called 'Local time'. Otherwise you either need to have times in either UTC timezone OR in 'your' timezone with a TZID for your timezone.
The specification says one can post dates 3 different ways:
FORM #1: DATE WITH LOCAL TIME: eg: 19980118T230000 will be 11 pm in any and all timezones, like a morning wakeup alarm
FORM #2: DATE WITH UTC TIME (the Z at the back) eg: 19980119T070000Z
FORM #3: DATE WITH LOCAL TIME AND TIME ZONE REFERENCE eg:
TZID=America/New_York:19980119T020000
In forms 2 and 3, the receiving application will adjust the time from UTC or the timezone given to the timezone of the viewer. Form 1 will always be displayed at that time for every zone, so will be different actual time around the world.
See the RFC5545 specification for more details https://www.rfc-editor.org/rfc/rfc5545#section-3.3.5
I am trying to send a calendar invite using SendGrid and when the email comes in, the invite is an .ics attachment. I would like the invite to be displayed already.
Current Result
Desired Result
This is how I am currently to adding the calendar:
$email->addContent("text/calendar", $mimeMessage);
$mimeMessage is set to the message below:
From: <from#someemail.com>
To: <to#someemail.com>
Subject: Program Calendar Event
MIME-Version: 1.0
Content-Type: text/calendar; method=REQUEST; charset="UTF-8"
Message-ID: 2797a6bab44c7188e16e6e2408b02a4a.somedomain.com
\r\nContent-Transfer-Encoding: 7bit
BEGIN:VCALENDAR
PRODID:-//Microsoft Corporation//Outlook 16.0 MIMEDIR//EN
VERSION:2.0
METHOD:REQUEST
X-MS-OLK-FORCEINSPECTOROPEN:TRUE
BEGIN:VEVENT
LOCATION:123 Hill Top
DESCRIPTION:..
DTEND:20190122T123000Z
DTSTAMP:20200207T145155Z
DTSTART:20190122T103000Z
ORGANIZER;CN=Calendar Invitation - Nariel :mailto:info#someemail.com
PRIORITY:5
SEQUENCE:0
SUMMARY:Program Calendar Event
TRANSP:OPAQUE
UID:dd0dd7668a8065f322975099ac26bb06.somedomain.com
X-ALT-DESC;FMTTYPE=text/html:
END:VEVENT
END:VCALENDAR
This vcalendar syntax works when sending through MailGun and SparkPost. I am now trying to implement a solution using SendGrid.
I also tried setting $mimeMessage only to the vcalendar and got the same results.
BEGIN:VCALENDAR
PRODID:-//Microsoft Corporation//Outlook 16.0 MIMEDIR//EN
VERSION:2.0
METHOD:REQUEST
X-MS-OLK-FORCEINSPECTOROPEN:TRUE
BEGIN:VEVENT
LOCATION:123 Hill Top
DESCRIPTION:..
DTEND:20190122T123000Z
DTSTAMP:20200207T145155Z
DTSTART:20190122T103000Z
ORGANIZER;CN=Calendar Invitation - Nariel :mailto:info#someemail.com
PRIORITY:5
SEQUENCE:0
SUMMARY:Program Calendar Event
TRANSP:OPAQUE
UID:dd0dd7668a8065f322975099ac26bb06.somedomain.com
X-ALT-DESC;FMTTYPE=text/html:
END:VEVENT
END:VCALENDAR
Thank you!
public function build()
{
return $this
->from(getenv('MAIL_FROM_ADDRESS'), getenv('MAIL_FROM_NAME'))
->subject($this->subject)
->view('mails.calendar')
->attachData($this->ics, 'meeting.ics', [
'mime' => 'text/calendar; charset=UTF-8; method=REQUEST',
]);
}
public function sendInvite($to_name, $to_address, $startTime, $endTime, $subject, $location, $company)
{
$domain = 'domain.com';
$ical = 'BEGIN:VCALENDAR' . "\r\n" .
'PRODID:-//Microsoft Corporation//Outlook 10.0 MIMEDIR//EN' . "\r\n" .
'VERSION:2.0' . "\r\n" .
'METHOD:REQUEST' . "\r\n" .
'BEGIN:VTIMEZONE' . "\r\n" .
'TZID:Tokyo Standard Time' . "\r\n" .
'BEGIN:STANDARD' . "\r\n" .
'DTSTART:20091101T020000' . "\r\n" .
'RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=1SU;BYMONTH=11' . "\r\n" .
'TZOFFSETFROM:-0400' . "\r\n" .
'TZOFFSETTO:-0500' . "\r\n" .
'TZNAME:EST' . "\r\n" .
'END:STANDARD' . "\r\n" .
'BEGIN:DAYLIGHT' . "\r\n" .
'DTSTART:20090301T020000' . "\r\n" .
'RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=2SU;BYMONTH=3' . "\r\n" .
'TZOFFSETFROM:-0500' . "\r\n" .
'TZOFFSETTO:-0400' . "\r\n" .
'TZNAME:EDST' . "\r\n" .
'END:DAYLIGHT' . "\r\n" .
'END:VTIMEZONE' . "\r\n" .
'BEGIN:VEVENT' . "\r\n" .
'ATTENDEE;CN="'.$to_name.'";ROLE=REQ-PARTICIPANT;RSVP=TRUE:MAILTO:'.$to_address. "\r\n" .
'LAST-MODIFIED:' . date("Ymd\TGis") . "\r\n" .
'UID:'.date("Ymd\TGis", strtotime($startTime)).rand()."#".$domain."\r\n" .
'DTSTAMP:'.date("Ymd\TGis"). "\r\n" .
'DTSTART;TZID="Tokyo Standard Time":'.$startTime. "\r\n" .
'DTEND;TZID="Tokyo Standard Time":'.$endTime. "\r\n" .
'TRANSP:OPAQUE'. "\r\n" .
'SEQUENCE:1'. "\r\n" .
'SUMMARY:' . $subject . "\r\n" .
'LOCATION:' . $location . "\r\n" .
'CLASS:PUBLIC'. "\r\n" .
'PRIORITY:5'. "\r\n" .
'BEGIN:VALARM' . "\r\n" .
'TRIGGER:-PT15M' . "\r\n" .
'ACTION:DISPLAY' . "\r\n" .
'DESCRIPTION:Reminder' . "\r\n" .
'END:VALARM' . "\r\n" .
'END:VEVENT'. "\r\n" .
'END:VCALENDAR'. "\r\n";
$data=[
'name'=>$to_name,
'company'=>$company,
];
$email = new Calendar($subject, $ical, $data);
return Mail::to($to_address)->send($email)->getDebug();
}
I have used Laravel to implement the same use-case. I created a Mailable object and included the above code in the build funtion. $this->ics contains my iCal text. Attaching the calendar content as a mime is the key here.
The build function is used to contruct the e-mail by the Laravel. The same procedure can be followed without using Laravel too.
Credits: https://dev.to/arxeiss/adding-events-to-calendar-automatically-from-email-1h0a
I'm using a function I found online to generate meeting invites in OutLook using PHP. I have made an online calendar where the users are assigned work orders on a day-to-day basis. I'm trying to "sync" this one with Outlook. Everything works fine, except the resulting Outlook invitation is uneditable. The user must be able to edit the start time and duration of the assignment in Outlook.
The calendar body looks like this:
$ical = 'BEGIN:VCALENDAR' . "\r\n" .
'PRODID:-//Microsoft Corporation//Outlook 10.0 MIMEDIR//EN' . "\r\n" .
'VERSION:2.0' . "\r\n" .
'METHOD:REQUEST' . "\r\n" .
'BEGIN:VTIMEZONE' . "\r\n" .
'TZID:W. Europe Standard Time' . "\r\n" .
'BEGIN:STANDARD' . "\r\n" .
'DTSTART:20181028T030000' . "\r\n" .
'RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=10' . "\r\n" .
'TZOFFSETFROM:+0200' . "\r\n" .
'TZOFFSETTO:+0100' . "\r\n" .
'TZNAME:CET' . "\r\n" .
'END:STANDARD' . "\r\n" .
'BEGIN:DAYLIGHT' . "\r\n" .
'DTSTART:20190331T020000' . "\r\n" .
'RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=3' . "\r\n" .
'TZOFFSETFROM:+0100' . "\r\n" .
'TZOFFSETTO:+0200' . "\r\n" .
'TZNAME:CEST' . "\r\n" .
'END:DAYLIGHT' . "\r\n" .
'END:VTIMEZONE' . "\r\n" .
'BEGIN:VEVENT' . "\r\n" .
'ORGANIZER;CN="'.$from_name.'":MAILTO:'.$from_address. "\r\n" .
'ATTENDEE;CN="'.$to_name.'";ROLE=REQ-PARTICIPANT;RSVP=TRUE:MAILTO:'.$to_address. "\r\n" .
'LAST-MODIFIED:' . date("Ymd\TGis") . "\r\n" .
'UID:'.date("Ymd\TGis", strtotime($startTime)).rand()."#".$domain."\r\n" .
'DTSTAMP:'.date("Ymd\TGis"). "\r\n" .
'DTSTART:'.date("Ymd\THis", strtotime($startTime)). "\r\n" .
'DTEND:'.date("Ymd\THis", strtotime($endTime)). "\r\n" .
'TRANSP:OPAQUE'. "\r\n" .
'SEQUENCE:1'. "\r\n" .
'SUMMARY:' . $subject . "\r\n" .
'LOCATION:' . $location . "\r\n" .
'CLASS:PUBLIC'. "\r\n" .
'PRIORITY:5'. "\r\n" .
'BEGIN:VALARM' . "\r\n" .
'TRIGGER:-PT15M' . "\r\n" .
'ACTION:DISPLAY' . "\r\n" .
'DESCRIPTION:Reminder' . "\r\n" .
'END:VALARM' . "\r\n" .
'END:VEVENT'. "\r\n" .
'END:VCALENDAR'. "\r\n";
$message .= 'Content-Type: text/calendar;name="meeting.ics";method=REQUEST'."\n";
$message .= "Content-Transfer-Encoding: 8bit\n\n";
$message .= $ical;
$mailsent = mail($to_address, $subject, $message, $headers);
Is there any parameter I can change in order to make the appointment editable?
The organizer is always the same as the attendee in this case.
The headers look like this:
$mime_boundary = "----Meeting Booking----".MD5(TIME());
$headers = "From: ".$from_name." <".$from_address.">\n";
$headers .= "Reply-To: ".$from_name." <".$from_address.">\n";
$headers .= "MIME-Version: 1.0\n";
$headers .= "Content-Type: multipart/alternative; boundary=\"$mime_boundary\"\n";
$headers .= "Content-class: urn:content-classes:calendarmessage\n";
Tony, My understanding is that an ics file that is 'synced' (ie a url that is subscribed to) will not be editable in any application other than the creating one (OR if the receiving application is connected with the creating application, in which case all events will be 'synced' anyway).
If the receiver imports (Ie NOT subscribe to a URL or 'sync') the ics contents into one of their calendars then they should be able to edit it, however it will not 'sync' then.
I'm sending this ical as part of a multi/part email message. However I'm getting an error in outlook "not supported calendar message.ics" I have confirmed I have both a Attendee and an Organizer so I dont know why this would be happening.
$ical = 'BEGIN:VCALENDAR' . "\r\n" .
'PRODID:-//Microsoft Corporation//Outlook 10.0 MIMEDIR//EN' . "\r\n" .
'VERSION:2.0' . "\r\n" .
'METHOD:REQUEST' . "\r\n" .
'BEGIN:VTIMEZONE' . "\r\n" .
'TZID:Central Time' . "\r\n" .
'BEGIN:STANDARD' . "\r\n" .
'DTSTART:20141101T020000' . "\r\n" .
'RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=1SU;BYMONTH=11' . "\r\n" .
'END:STANDARD' . "\r\n" .
'BEGIN:DAYLIGHT' . "\r\n" .
'DTSTART:20090301T020000' . "\r\n" .
'RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=2SU;BYMONTH=3' . "\r\n" .
'TZOFFSETFROM:-0500' . "\r\n" .
'TZOFFSETTO:-0400' . "\r\n" .
'TZNAME:EDST' . "\r\n" .
'END:DAYLIGHT' . "\r\n" .
'END:VTIMEZONE' . "\r\n" .
'BEGIN:VEVENT' . "\r\n" .
'ORGANIZER;CN="'.$rep.'":MAILTO:'.$repemail. "\r\n" .
'ATTENDEE;CN="'.$to_name.'";ROLE=REQ-PARTICIPANT;RSVP=TRUE:MAILTO:'.$to_address. "\r\n" .
'LAST-MODIFIED:' . date("Ymd\TGis") . "\r\n" .
'UID:'.date("Ymd\TGis", strtotime($startTime)).rand()."#".$domain."\r\n" .
'DTSTAMP:'.date("Ymd\TGis"). "\r\n" .
'DTSTART;TZID="Central Time":'.date("Ymd\THis", strtotime($startTime)). "\r\n" .
'DTEND;TZID="Central Time":'.date("Ymd\THis", strtotime($endTime)). "\r\n" .
'TRANSP:OPAQUE'. "\r\n" .
'SEQUENCE:1'. "\r\n" .
'DESCRIPTION: '.$description. "\r\n" .
'SUMMARY:' . $subject . "\r\n" .
'LOCATION:' . $location . "\r\n" .
'CLASS:PUBLIC'. "\r\n" .
'PRIORITY:5'. "\r\n" .
'BEGIN:VALARM' . "\r\n" .
'TRIGGER:-PT15M' . "\r\n" .
'ACTION:DISPLAY' . "\r\n" .
'DESCRIPTION:Reminder' . "\r\n" .
'END:VALARM' . "\r\n" .
'END:VEVENT'. "\r\n" .
'END:VCALENDAR'. "\r\n";
// Send Appointment .ical file
$message .= 'Content-Type: text/calendar;name="message.ics";method=REQUEST\n';
$message .= "Content-Transfer-Encoding: 8bit\n\n";
$message .= $ical;
You're dealing with the outlook sniffer, the task that processes invitations on arrival. It's ridiculously picky and there's no documentation. Start by checking your Icalendar in the online validators. Then, send an invitation from gmail to Outlook. Use Gmail "show original" to inspect the generated Icalendar. Change your application to match exactly the gmail invitation, including the order of fields, and you should find your invitation is correctly processed by Outlook.