如何通过uisng BiWeekly库和Java Mail API创建和发送对现有事件的更新? [英] How to create and send update to existing event by uisng BiWeekly library and Java Mail API?

查看:145
本文介绍了如何通过uisng BiWeekly库和Java Mail API创建和发送对现有事件的更新?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用 BiWeekly 库创建VEVENT,然后使用 Java Mail API .一切正常,但是如何为现有事件创建更新,即当我收到更新的VEVENT时,它不会在日历中创建新事件,而是会更新现有事件?

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?

我尝试以以下方式设置顺序event.setSequence(2),但是它不起作用.收到电子邮件代理Lotus Notes后,Google邮件始终会创建新事件.

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();
        }

在这里,我将放置用于发送邀请的代码的迭代:

谢谢.

更新1 :

这是我的代码和BiWeekly库生成的第一个和第二个VEVENT:

This is first and second VEVENT as generated by my code and BiWeekly library:

仅创建事件-事件数据:

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

更新事件-仅事件数据:

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

更新2 :

当我发送第一邀请和第二邀请时,我会在gmail上收到以下电子邮件:

When I send first and second invitation I get the following email on gmail:

完整的原始电子邮件内容,其中由于某些隐私问题而删除了tracerout路径:

The full original email content with removed tracerout path due to some privacy issues here:

创建事件-完整电子邮件,没有路由部分:

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--

更新事件-全电子邮件,没有路由部分:

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--

更新3 看起来它可以在Lotus Notes上正常工作,但Google日历仍然无法识别更新事件.

UPDATE 3 It looks that it works correctly on a Lotus Notes but Google Calendar still doesn't recognize an update event.

更新4-解决方案

正如@arnaudq所写,我错过了ATTENDEE属性来制作Google日历来识别更新事件.这是一个示例如何做:

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);

推荐答案

您的代码似乎未明确设置UID属性.因此,该库可能会为您生成一个新库.

Your code does not seem to explicitely set the UID property. As a consequence, the library probably generates a new one for you.

UID属性是识别此VEVENT的对象. 因此,您的更新应包含与先前发送的原始事件相同的UID值.

The UID property is what identifies this VEVENT amongst others. As a consequence, your update shall contain the same UID value as the original event that was sent earlier.

您还缺少至少一个ATTENDEE属性.参与者之一应将其值设置为与接收邀请的gmail电子邮件地址相对应的mailto uri.

You are also missing at least one ATTENDEE property. One of the ATTENDEE should have its value set as a mailto uri corresponding to the gmail email address that is receiving the invite.

这篇关于如何通过uisng BiWeekly库和Java Mail API创建和发送对现有事件的更新?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆