I'm using BiWeekly library to create VEVENT and then send it by using Java Mail API. Everything work fine but how can I create an update for an existing event, i.e. when I receive VEVENT which is update it won't create a new event in a calendar but will update an existing event?
I've tried to set sequence in the following way event.setSequence(2)
, but it doesn't work. Upon receive email agent, Lotus Notes, google mail always creates new event.
This is my code of creating and sending event:
try {
String from = "email@example.com";
String to = "email@example.com";
Properties prop = new Properties();
prop.setProperty("mail.transport.protocol", "smtp");
prop.setProperty("mail.host", "smtp.example.com");
prop.setProperty("mail.user", "email");
prop.setProperty("mail.password", "");
Session session = Session.getDefaultInstance(prop, null);
// Define message
MimeMessage message = new MimeMessage(session);
message.addHeaderLine("method=REQUEST");
message.addHeaderLine("charset=UTF-8");
message.addHeaderLine("component=VEVENT");
message.setFrom(new InternetAddress(from));
message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
message.setSubject("Message Subject");
StringBuffer sb = new StringBuffer();
/*EVENT START*/
VEvent event = new VEvent();
event.setUid("ANATOLYTARNAVSKY123");
event.setDescription("Invitation Description");
event.setSummary("Invitation Description");
event.setOrganizer("anatolyt@gmail.com");
event.setLocation("room");
event.setSequence(sequence);
Calendar start = Calendar.getInstance();
start.add(Calendar.HOUR_OF_DAY, sequence + 2);
Calendar end = Calendar.getInstance();
end.add(Calendar.HOUR_OF_DAY, sequence + 2);
event.setDateStart(start.getTime());
event.setDateEnd(end.getTime());
icals.addEvent(event);
WriterChainText text = Biweekly.write(icals);
String result = text.go();
System.out.println(result);
/*EVENT END*/
StringBuffer buffer = sb.append(result);
// Create the message part
BodyPart messageBodyPart = new MimeBodyPart();
// Fill the message
messageBodyPart.setHeader("Content-Class", "urn:content-classes:calendarmessage");
messageBodyPart.setHeader("Content-ID", "calendar_message");
messageBodyPart.setDataHandler(new DataHandler( new ByteArrayDataSource(buffer.toString(), "text/calendar")));// very important
// Create a Multipart
Multipart multipart = new MimeMultipart();
// Add part one
multipart.addBodyPart(messageBodyPart);
// Put parts in message
message.setContent(multipart);
// send message
Transport.send(message);
} catch (MessagingException me) {
me.printStackTrace();
} catch (Exception ex) {
ex.printStackTrace();
}
Here I'll place iterations of the code which I use to send the invitations:
- 2nd: Added
LAST-MODIFIED
property as advised by @Michael
Thank you in advance.
UPDATE 1:
This is first and second VEVENT as generated by my code and BiWeekly library:
CREATE EVENT- VEVENT DATA ONLY:
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//Michael Angstadt//biweekly 0.4.3//EN
METHOD:REQUEST
BEGIN:VEVENT
DTSTAMP:20151113T100301Z
UID:ANATOLYTARNAVSKY123
DESCRIPTION:Invitation Description
SUMMARY:Invitation Description
ORGANIZER:mailto:anatolyt@example.com
LOCATION:room
SEQUENCE:0
DTSTART:20151113T120301Z
DTEND:20151113T120301Z
END:VEVENT
END:VCALENDAR
UPDATE EVENT - VEVENT DATA ONLY:
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//Michael Angstadt//biweekly 0.4.3//EN
METHOD:REQUEST
BEGIN:VEVENT
DTSTAMP:20151113T100333Z
UID:ANATOLYTARNAVSKY123
DESCRIPTION:Invitation Description
SUMMARY:Invitation Description
ORGANIZER:mailto:anatolyt@example.com
LOCATION:room
SEQUENCE:1
DTSTART:20151113T130333Z
DTEND:20151113T130333Z
END:VEVENT
END:VCALENDAR
UPDATE 2:
When I send first and second invitation I get the following email on gmail:
The full original email content with removed tracerout path due to some privacy issues here:
CREATE EVENT - FULL EMAIL without routing part:
Date: Sat, 14 Nov 2015 08:03:47 -0700
From: anatolyt@example.com
To: anatolyt@gmail.com
Message-ID: *****
Subject: Escape Room Invitation
MIME-Version: 1.0
Content-Type: multipart/mixed;
boundary="----=_Part_0_451111351.1447513426727"
X-TM-AS-MML: disable
X-Content-Scanned: Fidelis XPS MAILER
x-cbid: 15111415-0021-0000-0000-000004CDC424
method=REQUEST
charset=UTF-8
component=VEVENT
------=_Part_0_451111351.1447513426727
Content-Type: text/calendar; charset=us-ascii
Content-Transfer-Encoding: 7bit
Content-Class: urn:content-classes:calendarmessage
Content-ID: calendar_message
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//Michael Angstadt//biweekly 0.4.3//EN
METHOD:REQUEST
CALSCALE:GREGORIAN
BEGIN:VEVENT
DTSTAMP:20151114T150346Z
UID:anatolyt@example.com
STATUS:CONFIRMED
DESCRIPTION:Invitation Description
SUMMARY:Invitation Summary
ORGANIZER:mailto:anatolyt@example.com
LOCATION:Escape room
TRANSP:OPAQUE
CREATED:20151114T150346Z
LAST-MODIFIED:20151114T150346Z
SEQUENCE:0
DTSTART:20151114T170346Z
DTEND:20151114T170346Z
END:VEVENT
END:VCALENDAR
------=_Part_0_451111351.1447513426727--
UPDATE EVENT - FULL EMAIL without routing part:
Date: Sat, 14 Nov 2015 08:05:06 -0700
From: anatolyt@example.com
To: anatolyt@gmail.com
Message-ID: *****
Subject: Escape Room Invitation
MIME-Version: 1.0
Content-Type: multipart/mixed;
boundary="----=_Part_0_451111351.1447513506015"
X-TM-AS-MML: disable
X-Content-Scanned: Fidelis XPS MAILER
x-cbid: 15111415-0029-0000-0000-000004D409DF
method=REQUEST
charset=UTF-8
component=VEVENT
------=_Part_0_451111351.1447513506015
Content-Type: text/calendar; charset=us-ascii
Content-Transfer-Encoding: 7bit
Content-Class: urn:content-classes:calendarmessage
Content-ID: calendar_message
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//Michael Angstadt//biweekly 0.4.3//EN
METHOD:REQUEST
CALSCALE:GREGORIAN
BEGIN:VEVENT
DTSTAMP:20151114T150505Z
UID:anatolyt@example.com
STATUS:CONFIRMED
DESCRIPTION:Invitation Description
SUMMARY:Invitation Summary
ORGANIZER:mailto:anatolyt@example.com
LOCATION:Escape room
TRANSP:OPAQUE
CREATED:20151114T150505Z
LAST-MODIFIED:20151114T150505Z
SEQUENCE:1
DTSTART:20151114T180505Z
DTEND:20151114T180505Z
END:VEVENT
END:VCALENDAR
------=_Part_0_451111351.1447513506015--
UPDATE 3 It looks that it works correctly on a Lotus Notes but Google Calendar still doesn't recognize an update event.
UPDATE 4 - SOLUTION
As @arnaudq wrote I've missed ATTENDEE
property to make a Google Calendar to recognise update event. Here is an example how to do it:
VEvent event = new VEvent();
...
Attendee attendee = new Attendee("Anatoly Tarnavsky", "anatolyt@gmail.com");
attendee.setRsvp(true);
attendee.setRole(Role.CHAIR);
attendee.setParticipationStatus(ParticipationStatus.CONFIRMED);
...
event.setProperty(attendee);