【问题标题】:How to create and send update to existing event by uisng BiWeekly library and Java Mail API?如何使用 BiWeekly 库和 Java Mail API 创建和发送现有事件的更新?
【发布时间】:2016-02-14 00:44:16
【问题描述】:

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

我尝试按以下方式设置序列 event.setSequence(2) ,但它不起作用。在收到电子邮件代理 Lotus Notes 后,谷歌邮件总是会创建新事件。

这是我创建和发送事件的代码:

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:

仅创建事件 - 事件数据

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 上收到以下电子邮件:

由于此处存在一些隐私问题,完整的原始电子邮件内容已删除 tracerout 路径:

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

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 日历仍然无法识别更新事件。

更新 4 - 解决方案

正如@arnaudq 所写,我错过了ATTENDEE 属性来制作谷歌日历来识别更新事件。下面是一个例子:

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

【问题讨论】:

    标签: google-calendar-api jakarta-mail icalendar ical4j rfc2445


    【解决方案1】:

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

    UID 属性用于识别此 VEVENT 等。 因此,您的更新应包含与之前发送的原始事件相同的 UID 值。

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

    【讨论】:

    • 抱歉,从我发布问题开始,我添加了常量UID,但没有在此处更新代码。添加UID 没有帮助。我现在更新了问题中的代码示例。
    • 是的,在我设置了 ATTENDEE 属性后,它开始按预期工作!非常感谢!
    • arnaudq 看起来您已经在 11 月 16 日编辑了您的问题,但是当有人编辑他的答案并且我几乎错过了您的解决方案时,SO 不会向主题所有者发送通知。您应该在编辑自己的答案时发表评论。再次感谢您的解决方案。
    • 您现在可以使用event.addAttendee(new Attendee(participant.getName(), participant.getEmail()));) 代替setProperty 添加与会者,看起来更清晰。
    【解决方案2】:

    尝试将 LAST-MODIFIED 属性添加到 VEVENT 组件。您似乎在做其他所有事情 - 保持 UID 一致并递增 SEQUENCE。

    【讨论】:

    • 不,它不起作用。我在我的问题上添加了一些额外的信息,可以帮助调试我的问题。提前谢谢你。
    • 嗨迈克尔,我错过了@amaudq 所说的 ATTENDEE 属性。我还有一个问题,是否可以参与开发您的图书馆?例如,向其中添加构建器模式会很酷,如下所述:javaworld.com/article/2074938/core-java/… 为什么你不使用 github 而不是 sourceforge?人们将更容易为您的图书馆做出贡献。
    • @Anatoly 我一直在考虑迁移到 Github。如果有帮助,我的 SourceForge 项目会使用 git。
    猜你喜欢
    • 2019-12-13
    • 2020-02-12
    • 1970-01-01
    • 2019-10-28
    • 1970-01-01
    • 2020-01-13
    • 2016-10-28
    • 2011-09-03
    • 2023-03-10
    相关资源
    最近更新 更多