如何使用 BiWeekly 库和 Java Mail API 创建现有事件并发送更新?

2024-03-12

我在用着BiWeekly http://sourceforge.net/projects/biweekly/库来创建 VEVENT,然后使用以下命令发送它Java 邮件 API https://java.net/projects/javamail/pages/Home。一切正常,但如何为现有事件创建更新,即当我收到更新的 VEVENT 时,它不会在日历中创建新事件,但会更新现有事件?

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

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

try {
            String from = "[email protected] /cdn-cgi/l/email-protection";
            String to = "[email protected] /cdn-cgi/l/email-protection";
            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("[email protected] /cdn-cgi/l/email-protection");
            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();
        }

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

  • 2nd: Added LAST-MODIFIED@Michael 建议的财产 http://pastebin.com/2NWhkgZb

先感谢您。

UPDATE 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:[email protected] /cdn-cgi/l/email-protection
LOCATION:room
SEQUENCE:0
DTSTART:20151113T120301Z
DTEND:20151113T120301Z
END:VEVENT
END:VCALENDAR

更新事件 - 仅 VEVENT 数据:

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:[email protected] /cdn-cgi/l/email-protection
LOCATION:room
SEQUENCE:1
DTSTART:20151113T130333Z
DTEND:20151113T130333Z
END:VEVENT
END:VCALENDAR

UPDATE 2:

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

完整的original由于此处的一些隐私问题,已删除跟踪路径的电子邮件内容:

创建事件 - 不含路由部分的完整电子邮件:

Date: Sat, 14 Nov 2015 08:03:47 -0700
From: [email protected] /cdn-cgi/l/email-protection
To: [email protected] /cdn-cgi/l/email-protection
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:[email protected] /cdn-cgi/l/email-protection
STATUS:CONFIRMED
DESCRIPTION:Invitation Description
SUMMARY:Invitation Summary
ORGANIZER:mailto:[email protected] /cdn-cgi/l/email-protection
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: anat[email protected] /cdn-cgi/l/email-protection
To: [email protected] /cdn-cgi/l/email-protection
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:[email protected] /cdn-cgi/l/email-protection
STATUS:CONFIRMED
DESCRIPTION:Invitation Description
SUMMARY:Invitation Summary
ORGANIZER:mailto:[email protected] /cdn-cgi/l/email-protection
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看起来它在 Lotus Notes 上工作正常,但 Google 日历仍然无法识别更新事件。

更新 4 - 解决方案

正如@arnaudq 所写,我错过了ATTENDEE属性使 Google 日历能够识别更新事件。以下是如何执行此操作的示例:

        VEvent event = new VEvent();
        ...
        Attendee attendee = new Attendee("Anatoly Tarnavsky", "[email protected] /cdn-cgi/l/email-protection");
        attendee.setRsvp(true);
        attendee.setRole(Role.CHAIR);
        attendee.setParticipationStatus(ParticipationStatus.CONFIRMED);
        ...
        event.setProperty(attendee);

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 BiWeekly 库和 Java Mail API 创建现有事件并发送更新? 的相关文章

  • 使用谷歌日历 API oauth2 服务帐户(node.js)模拟用户

    我正在尝试通过 google calendar API 使用服务器进行服务器身份验证 他们在文档中提到您可以冒充用户 我已向我想要模拟的帐户添加了所有者权限 并确保启用了域范围的委派 据我所知 user example 应该指定模仿者 但它
  • javamail还提取封装消息的附件内容类型:message/rfc822

    我想提取封装在消息 InputStream 中的 eml 消息的所有附件 内容类型 message rfc822 InputStream is new FileInputStream Path MimeMessage mime new Mi
  • org.springframework.mail 的哪个工件?

    我想使用 spring 支持来发送邮件 我的项目是用 maven 2 构建的 我使用 spring core 2 5 5 我尝试在 maven 中央存储库中查找要包含在我的 pom xml 中的工件 我发现的唯一一个是弹簧支撑 http m
  • Applescript 和 iCal 交互

    我正在尝试编写一个 AppleScript 来查询 iCal 并查找任何日历中给定日期的所有事件 我首先编写一个简单的脚本 对给定日历中的每个事件执行一些简单的操作 tell application iCal tell calendar R
  • iPhone Chrome 上的 ICS 文件下载失败并显示“未知文件类型”

    我有一个 php 脚本 可以为移动网络应用程序自动生成 ics 文件 在我的 Win7 桌面上使用 Chrome ics 文件下载得很好 Outlook 也喜欢它 在我的 iPhone 上使用 Safari ics 文件会按预期打开日历应用
  • Google 关于推送通知的回应

    我正在创建一个用于 Google 日历集成的应用程序 当任何人手动更改 Google 日历事件时 我试图从 Google 获取通知 因此 我们在 Google 和我的应用程序之间创建了一个通道 现在的问题是 当 google 将响应标头发送
  • Icalendar 事件 RSVP 是否有标准和实现

    总结是 我现在正在实现一个事件确认系统 但找不到 ICalendar 回复的正确格式 因此我想知道是否有一个完整的 REPLY 消息的示例 也许还有一个 PHP 库可以包装所有这些消息 现在了解详细信息 我们收到外部电子邮件 包括要求回复的
  • 如何以编程方式使用 ical 从重复集中删除单个事件?

    我在 10 11 日创建了一个重复事件 请参见下文 我想删除第 10 个事件 因此我使用了方法 取消 但由于 UID 相同 两条记录都将被删除 如何只删除一条记录 我应该使用任何其他值 例如 UID 吗 BEGIN VCALENDAR PR
  • 如果 spring.mail.host 不在 application.properties 中,则 JavaMailSenderImpl 自动装配错误

    我在使用 JavaMailSenderImpl 在 Spring Boot 应用程序中发送电子邮件时遇到了一些 问题 我正在尝试动态设置所有属性 我希望将来从数据库中读取它们 但是 由于我不知道的原因 自动装配 JavaMailSender
  • 使用javamail连接到hotmail?

    我想知道是否可以使用JavaMail 连接到Hotmail 我已经尝试过 但它不起作用 连接被拒绝 String host pop3 live com String username email protected cdn cgi l em
  • Android studio中的文件路径

    我正在尝试发送带有附件的电子邮件 除了附加文件之外 一切正常 调用方法时 它显示 java io FileNotFoundException 虽然我手动插入精确路径 文件 存储 模拟 0 Android data com example a
  • 在 Google 日历 API v3 中插入​​新的 calendarEntry 返回 404

    我使用 google api services calendar v3 for java 我毫无问题地列出了我的日历条目 但是插入新的calendarEntry失败 我使用与示例相同的代码 CalendarListEntry newCal
  • 如何使用 javax.mail.internet.MimeBodyPart.setFileName 保留所有字符?

    我需要使用创建邮件javax mail版本 1 6 2 希望尽可能坚持高级方法 并希望避免自己处理字符编码 折叠以及最终获得有效邮件所需的任何内容 我目前正在处理的一个问题是文件名 因为默认情况下javax mail internet Mi
  • Google OAuth2 - 访问令牌和刷新令牌 -> invalid_grant/代码已兑换

    我的目标是拥有某种长期存在的访问令牌 以便我的 Android 应用程序可以读取用户当天的 Google 日历事件 而无需每次都需要用户批准 我能够生成 我认为是 一个一次性授权代码 但是 当我将其发送到我的服务器端应用程序引擎时 我收到以
  • 通过 JavaMail 发送到 Gmail 时的 TLS 问题

    事实证明 JavaMail 比我想象的要令人沮丧一些 我在网上查看了几个有关如何通过 Gmail 服务器 但不通过 SSL 发送简单 SMTP 电子邮件的示例 在尝试了几个不同的代码示例之后 当我调用时 我不断得出相同的示例异常transp
  • GoogleCalendarAPI 接受/拒绝事件

    我正在研究谷歌日历API并使用node js作为构建我的应用程序的平台 我能够使用身份验证过程创建事件 并使用身份验证时生成的访问令牌创建日历事件 我的问题是 假设如果我们有任何参加者参加活动 并且我想使用参加者一方的日历 API 接受 拒
  • JavaMail 连接到 Office 365 XOAUTH2 进行 IMAP 身份验证失败

    使用 OAuth2 0 在线 Office365 面临连接问题 我已经设置了应用程序权限以及 IMAP 和 SMTP 连接 基本身份验证似乎工作正常 我相信 IMAP 已启用 我的应用程序配置为任何组织目录 任何 Azure AD 目录 多
  • 在 Transport.send(message) 上获取 ParseException

    由于某种原因 当我在 MimeMessage 上调用 Transport send 时 出现 javax mail internet ParseException 以前 当它只是一封纯文本电子邮件时 这是有效的 但是当我将其更改为同时包含文
  • IMAPMessage.getUID() 和 Message-ID 标头有什么区别?

    从java邮件的角度来看 这两者有什么区别 我可以看到特定消息的 2 个值不相同 那么我应该如何考虑 IMAP 邮件的唯一 ID 如果我需要从 IMAP 服务器获取与唯一 ID 相对应的消息 我应该使用吗 MessageIDTerm or
  • 将包含多个事件的 ICS 文件保存到我的日历,而不是其他日历

    当我将 Excel 电子表格转换为 CSV 文件时 然后将 CSV 文件转换为 ICS 文件 我可以打开其中包含单个事件的 ICS 文件 并接受会议邀请 然后将其添加到我的日历中 使用此应用程序进行转换 http icsconverterw

随机推荐

  • CSS 背景精灵对于 iPhone 来说太大

    我有一个用于 css 背景的精灵表 尺寸为 2000x2000 像素 在所有桌面浏览器中都可以正常工作 但在 iPhone 版 Safari 上则完全不渲染 将尺寸降低到 1000x1000 可以完美渲染 好吧 除了我现在错过了精灵表的四分
  • 如何设置jquery按钮的活动状态

    我有一个使用 jquery 按钮的正确导航 如果用户点击它 页面就会加载 我需要的是 一旦页面重新加载 按钮应该显示它已被选中 如何使用 jquery 按钮执行此操作 为什么不使用 jQuery UI Tab 小部件 您也可以尝试使用按钮集
  • DataGridView:仅当滚动到底部时自动向下滚动

    我有一个程序 它使用 dataGridView 来显示通过向 dataGridView 添加行来每秒自动更新的数据 当我想在开头阅读一些内容时 我会向上滚动 即使数据更新 滚动条也不会向下滚动 这很好 但我希望滚动条仅在位于 dataGri
  • 如何在 LibreOffice 中运行 python 宏?

    当我去工具 gt 宏 gt 组织宏 gt Python我得到这个对话框 It is 不可能创建新的 Python 宏 显然 LibreOffice 有没有Python编辑器所以我必须在其他地方编写宏 然后执行它们 但是我不知道where放置
  • 我不断收到此错误:“阅读器关闭时调用 Read 的尝试无效”

    这是我的代码 我关闭并打开阅读器 但它仍然无法工作 几个线程可以同时访问这个函数 但是有一个锁 它一开始会工作几次 但迟早我会收到异常 阅读器关闭时调用 Read 的尝试无效 private IList
  • 在 El Capitan 10.11.6 上安装 Tensorflow 1.10

    我试图在我的旧Mac上安装tensorflow 1 10 但每次都会遇到同样的问题 一旦我启动 python shell 我就会收到以下错误 我确实尝试先将其安装在 virtualenv 中 之后 我尝试仅使用 pip 安装它并得到相同的错
  • Tempus Dominus Bootstrap4 需要 moment.js。 (日期时间选择器)

    我正在尝试使用 Tempus Dominus Bootstrap4 添加 DateTimePicker 但我收到以下错误 I use Laravel as a front end So I use laravel mix 我的刀片文件在下面
  • .htaccess 重写规则中的模式干扰

    在 htaccess 中定义重写规则时 我遇到了模式干扰问题 我试图重写的网站链接是 example com item work gt example com work example com item work tile x gt exa
  • 使用 ActiveAdmin 进行多步骤表单?

    是否可以使用 ActiveAdmin 创建多步骤表单 如果没有 是否可以在提交表单后添加另一个重定向到的页面 不是默认索引 显示或表单页面 我自己也一直在苦恼这个问题 我发现您可以使用 ActiveAdmin 文件中的集合操作添加自己的页面
  • Gwt 2.8-rc1 超级开发模式不适用于 IntelliJ IDEA 2016.2.5

    我的项目在超级开发模式下使用 GWT 2 7 和 2 8 beta1 正确启动 不幸的是 自 2 8 rc1 发布以来 它没有启动 看起来 GWT 项目依赖项配置不正确 IDE IntelliJ IDEA 2016 2 5 C Progra
  • 如何在 karma angularjs 中对 setInterval 进行单元测试

    app directive shuffleBlocks function timeout return link function sco ele att if itemCnt lt 1 return Trigger function fu
  • UITableViewCell 布局在重复使用单元格之前不会更新

    我有一个 UITableView 其中填充了自动调整大小的单元格 UITableView设置相当简单 tableView estimatedRowHeight 70 tableView rowHeight UITableViewAutoma
  • 将 angularjs 值传递给 PHP 变量

    我从 AngularJS 和 ngStorage 开始 我可以成功保存并显示数据 我像以前一样显示值 myobj session 我想将任何存储的值传递到 php 变量中 下面显示的是我的想象逻辑 我知道那是行不通的 我的问题是如何以正确的
  • 如何让 jest 使用 ES6 依赖项

    所以我有一个依赖包 我将其拉入我的 node modules 文件夹中 这个包中有一个像这样的导出 Object
  • PHP sleep() 导致 CPU 使用率高

    我正在运行一个大部分时间处于睡眠状态的 CLI 脚本 每隔 10 秒左右 脚本就会执行一些操作 问题是 脚本在睡眠时 CPU 使用率为 94 我设置的方法是 while 1 sleep 10 doStuff 虽然这按预期工作 但存在一个明显
  • 字符+字符=整数?为什么?

    为什么要加两个char在 C 中结果为int type 例如 当我这样做时 var pr R G B Y P the pr变量变成int类型 我希望它是一个string类型值为 RGBYP 为什么C 要这样设计呢 默认实现不是添加两个cha
  • 从Excel VBA的下拉列表中选择特定项目

    我正在为我的办公室设计一个仪表板 这一切都有效 但我想添加一个选项 而不是在下拉列表中搜索 250 多个项目 您还可以单击一个单元格 下拉列表将更改为该值 并且分配的宏将为该下拉列表运行 到目前为止 我不知道如何让 vba 从下拉列表中选择
  • 具有列表视图的 Android 小部件正在刷新具有丑陋的短“闪烁”效果的项目

    我想制作一个带有 ListView 的小部件 您可以在其中添加 listItems 来显示计数器计时器 以查看您有多少时间来处理某个事件 这是我第一次使用小部件 我不知道我的方法是好还是坏 到目前为止我得到了这个 AppWidgetProv
  • Javascript - 所有嵌套的 forEach 循环完成后的回调

    我确信这是一个相当简单的任务 但我现在无法全神贯注 我有一组嵌套的 forEach 循环 当所有循环运行完毕时 我需要一个回调 我愿意使用 async js 这就是我正在处理的 const scanFiles function accoun
  • 如何使用 BiWeekly 库和 Java Mail API 创建现有事件并发送更新?

    我在用着BiWeekly http sourceforge net projects biweekly 库来创建 VEVENT 然后使用以下命令发送它Java 邮件 API https java net projects javamail