iCalendar creation: RFC 5546 explanation - ios5

I am facing several issues related to the creation of an ICS file which has to be compatible with several clients, especially iOS, Gmail, Outlook, Android and Windows Phone. Googling around, I found out the proposed standard from 2009, aka RFC5546. I read through this document and found a point which is very interesting and could potentially solve my issue. Section Methods for VEVENT Calendar Components explains the distinctions between methods REQUEST and PUBLISH. But, there are a couple of points which are not really clear to me:
What should PUBLISH do? Should it add a new calendar? Should it create a new calendar (like in Outlook or iOS) or should add the event in the existing user calendar (like in Gmail or Lightning)? EDIT: note the calendar as a file attached to an e-mail.
Can PUBLISH contain more than one event? From the document and logically, yes, but Gmail then adds only the first event of the list. Lightning adds only one event and then gives a 804a0004 error.
How should REQUEST work? The document states: VEVENT | 1+ | All components MUST have the same UID. which means a calendar may have more than 1 VEVENT but they must have the same UID. Then, how can I client distinguish between those events? And in fact no client I tried is able to distinguish the events generated with the same UID, but they add only the one with highest SEQUENCE. Logically, I don't want to send more than one event per invitation, but the RFC allows me to do that (and in my case study I want to), so how?
With REQUEST, forgetting the statement VEVENT | 1+ | All components MUST have the same UID., so providing a unique UID to each event in the ICS file, Gmail and iOS add all the events contained in the file, while Lightning and Outlook add only the first one. Is there a way to pursue this path or since it should not be allowed I should find another way?
Basically, how do you suggest to proceed to add more events with a single ICS file to the users' calendar for the platforms I mentioned?
Sample ICS for PUBLISH:
BEGIN:VCALENDAR
PRODID:-//prodid//product//IT
VERSION:2.0
METHOD:PUBLISH
CALSCALE:GREGORIAN
BEGIN:VEVENT
UID:uid1
DTSTAMP:20130515T121437Z
DTSTART:20130619T205000
DTEND:20130619T215000
DESCRIPTION:Desc 1
SUMMARY:Sum 1
LOCATION:location
ORGANIZER:mailto:organizer#somedomain
SEQUENCE:1
STATUS:CONFIRMED
END:VEVENT
BEGIN:VEVENT
UID:uid2
DTSTAMP:20130515T121437Z
DTSTART:20130719T205000
DTEND:20130719T215000
DESCRIPTION:Desc 2
SUMMARY:Sum 2
LOCATION:location
ORGANIZER:mailto:organizer#somedomain
SEQUENCE:1
STATUS:CONFIRMED
END:VEVENT
END:VCALENDAR
Sample for REQUEST:
BEGIN:VCALENDAR
PRODID:-//prodid//product//IT
VERSION:2.0
METHOD:REQUEST
CALSCALE:GREGORIAN
BEGIN:VEVENT
UID:uid1
DTSTAMP:20130515T121437Z
DTSTART:20130619T205000
DTEND:20130619T215000
DESCRIPTION:Desc 1
SUMMARY:Sum 1
LOCATION:location
ORGANIZER:mailto:organizer#somedomain
ATTENDEE;RSVP=TRUE;CN=attendee cn:mailto:attendee#email
SEQUENCE:1
STATUS:CONFIRMED
END:VEVENT
BEGIN:VEVENT
UID:uid2
DTSTAMP:20130515T121437Z
DTSTART:20130719T205000
DTEND:20130719T215000
DESCRIPTION:Desc 2
SUMMARY:Sum 2
LOCATION:location
ORGANIZER:mailto:organizer#somedomain
ATTENDEE;RSVP=TRUE;CN=attendee cn:mailto:attendee#email
SEQUENCE:1
STATUS:CONFIRMED
END:VEVENT
END:VCALENDAR

About 1) it is not clear how you communicate the events to the client: is it via iMIP (email) or through an HTTP URL ? In any case, there is no right answer to your question: iTIP is about transport of iCalendar data.
About 2) yes, you can have multiple events in a PUBLISH stream
About 3):
iCalendar has a notion of exception for recurring meetings. Those exceptions are represented by a VEVENT with the same UID and a RECURRENCE-ID indicating the particular instance that shall be considered an exception.
As a consequence, a REQUEST can only be used to transmit a single event (only one UID) but this event itself might be expressed as a set of VEVENT: one for the master (e.g. meeting every friday at 10:00) and one for each exception (e.g. except on Friday 12/12 where it will take place at 09:00).
See for example the last event in https://www.rfc-editor.org/rfc/rfc5546#section-4.4.8

Related

edited ics file does not set an event on phone calendar automatically

I am trying to edit a file that a transport company sent me which automatically set my trip information in my calendar . I want to edit this file so that it can reminds me other events but, when i change the date and send it to myself or another email adress, it doesn't set the event automatically anymore. What is the problem?
Even sending the same file, not even changing the date, gives the same problem.
i tried to read this guide https://www.rfc-editor.org/rfc/rfc5545#page-165 but have not found anything...
BEGIN:VCALENDAR
VERSION:2.0
CALSCALE:GREGORIAN
METHOD:REQUEST
BEGIN:VEVENT
UID:d0b7191f-b3af-419b-af93-b795f0dde86
PRIORITY:1
DTSTART:20190830T142500
DTEND:20190830T173800
LOCATION:Torino Porta Nuova
DESCRIPTION:Torino Porta Nuova-Albenga;
Treno: Regionale Veloce 10113, pa
rtenza da Torino Porta Nuova Ore: 14:25; arrivo a Albenga
Ore: 17:38
Codi
ce Biglietto: 120303025;
ORGANIZER:CN=ORGANIZER:mailto:webmaster#trenitalia.it
SUMMARY:Viaggio Torino Porta Nuova-Albenga, Treno Regionale
Veloce 10113,
Codice Biglietto 120303025 ,
ATTENDEE;ROLE=REQ-PARTICIPANT;CN=BUYER:mailto:MY_EMAIL_ADRESS_REMOVED_FOR_PRIVACY
ATTENDEE;ROLE=REQ-PARTICIPANT;CN=TRAVELLER:MY_EMAIL_ADRESS_REMOVED_FOR_PRIVACY
END:VEVENT
END:VCALENDAR
I would really appreciate some help.
SOLVED!! the voice "organizer" must be the mail who send the event and you have to write the mail of the receivers to the "attedee" voice (i don't know yet if this is strictly necessary)

Outlook not displaying ical RSVP buttons in email body

Outlook 2016 or Outlook 365 is not recognizing attached ics file. The rsvp buttons are not showing in the email body but it does display correctly in gmail. I am able to download the ics file and import it into outlook.
BEGIN:VCALENDAR
PRODID:-//AroFlo PtyLtd
VERSION:2.0
CALSCALE:GREGORIAN
METHOD:REQUEST
BEGIN:VEVENT
UID:eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzY2hlZHVsZV9pZCI6MCwic2NoZWRUe
XBlIjoiZXZlbnQiLCJncm91cGlkIjoxLCJvcmdfaWQiOjEzNywiU1ZBUk1DT05UUk9MSUQiOjM
xMTQ5LCJ1c2VyX2lkIjo3MTk1LCJ3b3JrcmVxdWVzdF9pZCI6MCwiZXZlbnRfaWQiOjU3MTUsI
mFsbG9jYXRpb25faWQiOjAsImNvbnRyb2xsaW5nb3JnaWQiOjEzNywidGVtcGxhdGVfaWQiOjA
sInRzX2dyb3VwX2lkIjowfQ.lVNWzJe1VbKsxdRJ2kCpLFUo2Wb1CqJ5Eom1nTgyewc
DTSTAMP:20180513T230757Z
DTSTART:20180514T050000Z
DTEND:20180514T073000Z
ORGANIZER;CN=Bri-Tech:mailto:test#email.com
CREATED:20180513T230757Z
LAST-MODIFIED:20180513T230757Z
SEQUENCE:0
SUMMARY:test event
DESCRIPTION:
X-ALT-DESC;FMTTYPE=text/html:
STATUS:CONFIRMED
TRANSP:OPAQUE
ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP
=TRUE;CN=test user;X-NUM-GUESTS=0:mailto:test1#test.com
PRIORITY:5
CLASS:PUBLIC
CATEGORIES:AroFlo, event
END:VEVENT
END:VCALENDAR
Here is how the MIME email type is constructed
var m = new mail();
m.setSubject( 'event' );
m.setTo( test#email.com );
m.setFrom( "noreply#email.com" );
m.addPart( type="text/calendar", body="#icalFile#");
m.addParam( type="text/calendar", file="invite.ics", content="#icalFile#");
m.send();
Turns out the email MIME type wasn't added correctly. The code below now displays the RSVP buttons correctly.
In ColdFusion addParam() type can set more than one parameter.
m.addParam( type="text/calendar; charset=utf-8; method=REQUEST;"
, file="invite.ics"
, content="#icalFile#");

unable to delete event on google calendar using ics file

i create event on google calendar using ics file successfully but when i'm trying to delete/cancel this event using ics file its not working.
---Create Ics----
BEGIN:VCALENDAR
VERSION:2.0
METHOD:REQUEST
PRODID:-//ClaryIcon/NONSGML OneScreen//EN
BEGIN:VEVENT
DTSTART:20180222T145000Z
DTEND:20180222T145000Z
SUMMARY:testttt
DESCRIPTION:Meeting Invite from OneScreen Hype\nMeeting Owner: ali\nSip Address: Not Supported\nDail in: \n\n
UID:5a8d8747eebadc109c908e11
DTSTAMP:20180221T145048Z
ORGANIZER;CN=ali:mailto:noreply-hype#onescreensolutions.com
END:VEVENT
END:VCALENDAR
---Cancel Ics----
BEGIN:VCALENDAR
VERSION:2.0
METHOD:CANCEL
PRODID:-//ClaryIcon/NONSGML OneScreen//EN
BEGIN:VEVENT
DTSTART:20180221T145152Z
DTEND:20180221T145152Z
SUMMARY:testttt
DESCRIPTION:
UID:5a8d8747eebadc109c908e11
DTSTAMP:20180221T145152Z
ORGANIZER;CN=ali:mailto:noreply-hype#onescreensolutions.com
END:VEVENT
END:VCALENDAR
mainly i use uid to identity specific event
Try adding status:cancelled as per the RFC5545 spec
https://www.rfc-editor.org/rfc/rfc5545#page-93
Not sure but you may also need a SEQUENCE (check spec for exact syntax ) to indicate which is latest modification.

How to reconstruct conversations or group emails?

I am having a PST files which contains the email history of a user. The task is to read this PST file and reconstruct the email history to display it in a client. This includes the correctly displaying of conversations as you know it from Email clients:
Meeting at 8:00 07:34 am
AW: Meeting at 8:00 09:12 am
AW: AW: Meeting at 8:00 13:45 pm
[Jenkins Build] Success 11:54 am
[Jenkins Build] Failed 12:13 pm
[Jenkins Build] Success 01:12 pm
[Jenkins Build] Success 10:34 am
[Jenkins Build] Failed 12:12 pm
[Jenkins Build] Success 05:12 pm
However, I don't know how I could do this reliably.
I am using java-libpst (see Official Documentation) which provides a PSTMessage object. There is a method getConversationId() but that appears to be just a string of the original subject of that message which means that there might be duplicates (e.g. [Jenkins Build]*).
So, I am not sure how Outlook is able to reconstruct conversations and whether this is trivial but if there is actually a simple method to do this which I am just overlooking I'd be happy if somebody would let me know - otherwise this will end up in me parsing a ton of subject fields, parsing them and trying to match emails by their subject with the danger of missing different conversations which just have the same subject coincidentally.
I think you will need to construct the conversations yourself. You might find the source code referenced on this page about the Netscape Mail message threading algorithm helpful.
I copied the source code to Github. Here's the email Threader.java file.
Here is someone offering an explanation of how Gmail constructs conversations My gist is:
Emails coming after an email with an equivalent subject, from any of the participants in any previous email, are part of the same conversation.
The in-reply-to email field can create participants to an email conversation even if they weren't an explicit participant.
Where:
equivalent subject means either an identical subject, or a subject that would result replying or forwarding. I.e. "FW: X", "RE: X", "Fwd: X", etc.
explicit participants in an email: the sender or any email appearing in a TO: or CC: field. (Maybe a BCC: field too...)
participants in an email: explicit participants in an email or anyone who has sent a later email using the in-reply-to field.
participants in any previous email: the distinct emails that are participants in email with an earlier send date having equivalent subject to a current email.
Here's another exposition of email fields relevant to email threading. What I took from this is that the References header should also be consulted in addition to the in-reply-to header, and that it is more reliable. (Maybe, if present, it should supercede the in-reply-to header.

Changes to recurring allday events not sent from iCal

I'm running a sabre CalDAV server and I'm using iCal on Yosemite as a client. Now, I create an allday recurring event in iCal and use the Charles Proxy to check the body of the request, that is sent from iCal. Creating the event it sends correct data:
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//Apple Inc.//Mac OS X 10.10.1//EN
CALSCALE:GREGORIAN
BEGIN:VEVENT
CREATED:20160404T203206Z
UID:14C144D6-A872-4D24-91C0-783A9979BB9E
RRULE:FREQ=WEEKLY;INTERVAL=1;COUNT=1
DTEND;VALUE=DATE:20160409
TRANSP:TRANSPARENT
SUMMARY:Repeat
DTSTART;VALUE=DATE:20160404
DTSTAMP:20160404T203206Z
SEQUENCE:0
BEGIN:VALARM
X-WR-ALARMUID:A807798B-DE16-4E62-86E9-C204A2B80F76
UID:A807798B-DE16-4E62-86E9-C204A2B80F76
TRIGGER;VALUE=DATE-TIME:19760401T005545Z
ACTION:NONE
END:VALARM
END:VEVENT
END:VCALENDAR
The response:
HTTP/1.1 201 Created
Date: Mon, 04 Apr 2016 20:32:19 GMT
Server: Apache/2.4.10 (Unix) OpenSSL/1.0.1j PHP/5.6.3 mod_perl/2.0.8-dev Perl/v5.16.3
X-Powered-By: PHP/5.6.3
X-Sabre-Version: 3.0.8
Content-Length: 0
ETag: "55c6a353f278653fdd61387395c274df"
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=UTF-8
But if I change a single occurrence of the repeating event and choose to only apply the changes to this occurrence, iCal sends the old calendar-data back to the server without any changes. If I apply the changes to all occurrences, the correct data is sent. If I choose to only apply the changes to future events, it correctly alters the old event and creates a new event for the future occurrences. But then again, no changes on a single occurrence are sent to the server.
This is only happening for allday events. Timed events are working just fine. It also doesn't matter if I create the rrule with "count" or by "until".
If I change a single occurrence and export my calendar from iCal I also get the correct calendar-data, although this data is not sent to the server (different event):
BEGIN:VCALENDAR
METHOD:PUBLISH
VERSION:2.0
X-WR-CALNAME:XXX
X-WR-CALDESC:
X-APPLE-CALENDAR-COLOR:#FF9500
X-WR-TIMEZONE:Europe/Berlin
CALSCALE:GREGORIAN
BEGIN:VEVENT
CREATED:20160405T063102Z
UID:68C23C1E-371C-4799-9139-04F0F8FE6F88
RRULE:FREQ=WEEKLY;INTERVAL=1;COUNT=4
DTEND;VALUE=DATE:20160409
TRANSP:TRANSPARENTSUMMARY:hhhhh
DTSTART;VALUE=DATE:20160404
DTSTAMP:20160405T063102Z
SEQUENCE:0
END:VEVENT
BEGIN:VEVENT
CREATED:20160405T063102Z
UID:68C23C1E-371C-4799-9139-04F0F8FE6F88
DTEND;VALUE=DATE:20160421
TRANSP:TRANSPARENT
SUMMARY:hhhhh
DTSTART;VALUE=DATE:20160418
DTSTAMP:20160405T063102Z
SEQUENCE:0
RECURRENCE-ID;VALUE=DATE:20160418
END:VEVENT
END:VCALENDAR
There, I can finally see the vevent with a correct recurrence-id.
Any ideas? Anyone else ran into a similar problem? I have no idea, what could be causing this...
Thanks in advance!
Okay, this must have been a calendar bug. After enabling debugging I found this error:
Apr 6 12:20:11 XXX.local CalendarAgent[229]: [com.apple.calendar.store.log.ICS] [CaliCalTranslator: Event 97323C3B-753D-46E5-830E-E182BEAA5E0D has invalid instance on date 2016-04-11 00:00:00 +0000. Filtering]
I updated calendar from Version 8.0 (2026) to Version 8.0 (2034.9) and now everything is working as expected.