ical4j推送会议提醒

项目需求:用户会申请参加活动,系统自动给用户Email发送会议邀请,接受邀请后,会将会议时间添加到Email日历中,并有提醒功能。
工具:ICal4J。
添加到maven库: <dependency>
<groupId>org.mnode.ical4j</groupId>
<artifactId>ical4j</artifactId>
<version>1.0.2</version>
</dependency>
简介:我们一般也可以用普通的发送纯文本格式发送会议邀请,但是显示效果不够美观。ICal4J给我们定义了接口,简单地填写数据就可以给用户发送相对漂亮的会议邀请。
完成状况:Foxmail中还有会议提醒,OutLook提醒功能尚未实现。
过程:一开始都是网上看文档,看别人的代码。但是会议没办法添加到日历中。同事想的办法是查看Foxmail中邮件源码,再用ICal4J实现。个人觉得这是学习新东西的时候一个很好的思路,看官方文档,找代码,如果调不出来再从原点出发,需要什么加什么。
下面就是代码了:

import java.io.ByteArrayOutputStream;
import java.net.URI;
import java.util.HashSet;
import java.util.Properties;
import java.util.Set;
import java.util.Timer;
import java.util.TimerTask;
import javax.mail.Authenticator;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.Multipart;
import javax.mail.PasswordAuthentication;
import javax.mail.SendFailedException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import net.fortuna.ical4j.data.CalendarOutputter;
import net.fortuna.ical4j.model.Calendar;
import net.fortuna.ical4j.model.DateTime;
import net.fortuna.ical4j.model.Dur;
import net.fortuna.ical4j.model.TimeZone;
import net.fortuna.ical4j.model.TimeZoneRegistry;
import net.fortuna.ical4j.model.TimeZoneRegistryFactory;
import net.fortuna.ical4j.model.component.VAlarm;
import net.fortuna.ical4j.model.component.VEvent;
import net.fortuna.ical4j.model.parameter.Cn;
import net.fortuna.ical4j.model.parameter.PartStat;
import net.fortuna.ical4j.model.parameter.Role;
import net.fortuna.ical4j.model.parameter.Rsvp;
import net.fortuna.ical4j.model.property.Action;
import net.fortuna.ical4j.model.property.Attendee;
import net.fortuna.ical4j.model.property.CalScale;
import net.fortuna.ical4j.model.property.Description;
import net.fortuna.ical4j.model.property.Duration;
import net.fortuna.ical4j.model.property.Location;
import net.fortuna.ical4j.model.property.Method;
import net.fortuna.ical4j.model.property.Organizer;
import net.fortuna.ical4j.model.property.ProdId;
import net.fortuna.ical4j.model.property.Repeat;
import net.fortuna.ical4j.model.property.Summary;
import net.fortuna.ical4j.model.property.Version;
import net.fortuna.ical4j.util.UidGenerator;
public class ICal4jEmail2 {
private static String from = "XX@XX.com";
private static String to = "XX@XX.com";//收件人
private static String subject = "test";//标题
private static String content = "关于某某的报告";//邮件内容

public static void main(String []args){
//链接邮件服务器
Properties props = new Properties();
props.put("mail.transport.protocol", "pop3"); //邮件协议
props.put("mail.smtp.host", "XX.XX.com"); //服务器域名
props.put("mail.smtp.auth", "true");
Authenticator auth = new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
String username = "XX"; //大多数是你邮件@前面的部分
String pwd = "XX";
return new PasswordAuthentication(username, pwd);
}
};
Session mailSession = Session.getInstance(props, auth);
//获取Message对象
Message msg = new MimeMessage(mailSession);
try {
//设置邮件基本信息
msg.setFrom(new InternetAddress(from));
msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to));
msg.setSentDate(new java.util.Date());
msg.setSubject(subject);
Multipart mp = getContentText();//获取不同类型的邮件的邮件内容
msg.setContent(mp);
msg.saveChanges();
} catch (Exception ex) {
}
sendEmail(msg);
}

public static Boolean sendEmail(Message msg){
//发送邮件
try {
Transport.send(msg);
return true;
} catch (SendFailedException e) {//邮件地址无效
System.out.println(e);
return false;
} catch (Exception e) {
Timer timer = new Timer();
System.out.println(e);
return false;
}
}
//Mail类,用于重发邮件的类
private class Mail extends TimerTask {
private Timer timer = null;
private Message msg = null;
public Mail(Message msg, Timer timer) {
this.msg = msg;
this.timer = timer;
}
@Override
public void run() {
if (!send()) {//发送失败,重发
timer.schedule(new Mail(msg, timer), 10000);
} else {
timer.cancel();
}
}
private boolean send() {
try {
Transport.send(msg);
return true;
} catch (Exception e) {
System.out.println(e);
return false;
}
}
}

public static Multipart getContentText() throws Exception{
//时区
TimeZoneRegistry registry = TimeZoneRegistryFactory.getInstance().createRegistry();
TimeZone timezone = registry.getTimeZone("Asia/Shanghai");
//会议地点
String location = "21-C2";
//会议时间
java.util.Calendar cal = java.util.Calendar.getInstance();

cal.setTimeZone(timezone);
cal.set(2014, 3-1, 13, 13, 45); //月份是要早一个月
DateTime start = new DateTime(cal.getTime());
cal.set(2014, 3-1, 13, 18, 55);
DateTime end = new DateTime(cal.getTime());

VEvent vevent = new VEvent(start, end, subject);
vevent.getProperties().add(timezone.getVTimeZone().getTimeZoneId());//时区
vevent.getProperties().add(new Location(location));//会议地点
vevent.getProperties().add(new Summary(subject));//邮件主题
vevent.getProperties().add(new Description(content));//邮件内容
vevent.getProperties().add(new UidGenerator("meeting invite").generateUid());// 设置uid
vevent.getProperties().add(new Organizer(URI.create("mailto:" + from)));
//与会人
Set<String> emailSet = new HashSet<String>();
emailSet.add(from);
emailSet.add(to);
int i = 1;
for (String email : emailSet) {
Attendee attendee = new Attendee(URI.create("mailto:" + email));
if(1 == i){
attendee.getParameters().add(Role.REQ_PARTICIPANT);
}else{
attendee.getParameters().add(Role.OPT_PARTICIPANT);
}
attendee.getParameters().add(new Cn("Developer" + i));
vevent.getProperties().add(attendee);
i++;
}
//--------VEvent Over----------
//--------VAlarm Start----------
//提醒,提前10分钟
VAlarm valarm = new VAlarm(new Dur(0, 0, -10, 0));
valarm.getProperties().add(new Repeat(1));
valarm.getProperties().add(new Duration(new Dur(0, 0, 10, 0)));
//提醒窗口显示的文字信息
valarm.getProperties().add(new Summary("Event Alarm"));
valarm.getProperties().add(Action.DISPLAY);
valarm.getProperties().add(new Description("Progress Meeting at 9:30am"));
vevent.getAlarms().add(valarm);//将VAlarm加入VEvent
//--------VAlarm Over-------------
//--------日历对象 Start---------------
Calendar icsCalendar = new Calendar();
icsCalendar.getProperties().add(new ProdId("-//Events Calendar//iCal4j 1.0//EN"));
icsCalendar.getProperties().add(CalScale.GREGORIAN);
icsCalendar.getProperties().add(Version.VERSION_2_0);
icsCalendar.getProperties().add(Method.REQUEST);
icsCalendar.getComponents().add(vevent);//将VEvent加入Calendar
//将日历对象转换为二进制流
CalendarOutputter co = new CalendarOutputter(false);
ByteArrayOutputStream os = new ByteArrayOutputStream();
co.output(icsCalendar, os);
byte[] mailbytes = os.toByteArray();
//--------日历对象 Over------------------
BodyPart mbp = new MimeBodyPart();
mbp.setContent(mailbytes, "text/calendar;method=REQUEST;charset=UTF-8");

MimeMultipart mm = new MimeMultipart();
mm.setSubType("related");
mm.addBodyPart(mbp);
return mm;
}
}
Java日历处理库ical4j-1.0实战指南 iCalendar(.ics)是一种标准化的日历数据交换格式,广泛应用于跨平台日历系统之间的数据同步与共享。其核心目标是通过统一的数据结构描述日历信息,如事件(VEVENT)、任务(VTODO)、日记(VJOURNAL)等。iCalendar格式遵循RFC标准,主要包括DTSTART(开始时间)、DTEND(结束时间)、RRULE(重复规则)等关键字段,以支持复杂的时间安排逻辑。自RFC 2445发布以来,该标准不断演进,最终在RFC 5545中进行了增强与修正,提升了兼容性与扩展性。 阅读详情

相关推荐

ical4j:用于解析和构建iCalendar数据模型的Java库

iCal4j-iCalendar解析器和对象模型 目录 介绍 iCal4j是一个Java库,用于读写定义的iCalendar数据流。 iCalendar标准提供了一种通用数据格式,用于存储有关日历特定数据的信息,例如事件,约会,待办事项等。所有流行的日历工具(例如Lotus Notes,Outlook和Apple的iCal)也支持iCalendar标准。 对于iCal4j的目标和方向的简要描述,请查看。 您将在和整个找到有关如何使用iCal4j的示例。 可以在找到每个版本中包含的更改的详细说明。 iCal4j是在软件的帮助下创建的。 建立 系统要求 3.x版-Java 8或更高版本 2.x版-Java 7或更高版本 依存关系 为了可移植性和与尽可能多的环境的兼容性,iCal4j的依赖库数量应保持最少。 下面介绍了必需的(和可选的)依赖项及其提供的功能。 slf4j-api [必需]-集成到不同日志框架实现的日志记录元库。 在所有需要记录的类中使用。 commons-lang3 [必需]-提供对标准Java库的增强,包括对自定义equals()和hashcode()实现的支持

探秘iCal4j:一个强大的iCalendar处理库

探秘iCal4j:一个强大的iCalendar处理库 ical4jA Java library for parsing and building iCalendar data models项目地址:https://gitcode.com/gh_mirrors/ic/ical4j 项目介绍 iCal4j 是一款用于解析和创建符合RFC2445标准的iCalendar数据流的Java库。iCalen...

gitblog_00015的博客 939

ical4j-用户指南:iCal4j用户文档

ical4j用户指南 iCal4j用户文档

Email发送邮件使用ical4j将时间同步日历中

Email发送邮件使用ical4j将时间同步日历中。

m0_50176078的博客 1084

ical4j,用于解析和构建iCalendar数据模型的Java库.zip

目录

Cadence Virtuoso ADE L保姆级教程:从DC到Noise,一次搞定6种仿真设置

本文提供Cadence Virtuoso ADE L的全面仿真教程,涵盖DC工作点分析、瞬态响应、AC特性、零极点分布和噪声性能等6种仿真设置。通过详细的步骤和实用技巧,帮助工程师高效完成从基础配置到高级后处理的完整工作流,显著提升IC设计效率。

weixin_26841743的博客 600

**深入探索 iCal4j —— 解析与操作日历数据的强大工具**

在现代信息社会中,时间管理变得尤为重要,而日历应用程序则是我们日常安排不可或缺的一部分。无论是会议的安排还是个人事务的提醒,都需要一种统一的数据格式来存储和交换这些信息。**iCal4j** 正是为解决这一需求应运而生——一个强大的Java库,它遵循 iCalendar 标准 ([RFC2445](https://tools.ietf.org/html/rfc2445)),使得开发人员能够轻松地处...

gitblog_00452的博客 562

PRD撰写效率翻倍秘籍:我是如何用大模型+飞书文档搭建自动化工作流的

本文分享了如何利用大模型与飞书文档构建自动化工作流,以大幅提升PRD撰写效率。通过结构化需求输入、设计模块化提示词模板,并借助自动化脚本桥接数据与文档,产品经理可将繁琐的文档撰写工作自动化,从而将精力聚焦于产品战略与用户洞察。

weixin_28520495的博客 405

iCal4j 开源项目教程

在iCal4j项目中,我们通常不会找到一个标准的应用程序目录结构,因为它是一个库而非完整的应用程序。但是,它的主要目录包括: - `src/main/java`: 包含所有的Java源代码,按包组织。 - `src/main/resources`: 可能存放一些静态资源,如配置文件或非Java的二进制数据。 - `pom.xml`: Maven构建文件,用于定义依赖和构建过程。 - `build...

gitblog_00109的博客 508

大疆OcuSync vs 传统2.4GHz:深度拆解无人机图传射频模块的硬件差异

本文深度对比了大疆OcuSync与传统2.4GHz无人机图传射频模块的硬件差异,涵盖芯片组、天线系统、PCB设计、散热方案及生产测试等核心环节。重点解析OcuSync的全定制SoC芯片、智能MIMO天线阵列及精密PCB布局如何实现革命性性能提升,为无人机图传技术发展提供专业参考。

u5v6w7的博客 806

利用 Openocd 和 FT2232H 实现 ARMv8(Coretex-A53)高效调试方案

本文详细介绍了如何利用开源工具OpenOCD与高性能USB转接芯片FT2232H,构建一套针对ARMv8架构(如Cortex-A53)的高效、低成本调试方案。内容涵盖从环境搭建、驱动配置、核心调试架构解析到实战问题排查的全过程,帮助开发者实现对多核处理器的透明、可控调试,是嵌入式Linux及底层开发的实用指南。

weixin_29163581的博客 280

从零构建私人智能助手:QClaw模块化配置与自动化实战

自动化与效率提升是现代软件开发和个人工作流优化的核心诉求。其基本原理在于通过预设规则和触发条件,让系统自动执行重复性任务,从而解放人力、减少错误。在技术实现上,模块化架构和低代码配置是关键,前者通过插件化设计保证系统的可维护性和可扩展性,后者则降低了自动化流程的构建门槛,让开发者能快速组合触发器、条件和动作。这种技术组合的价值在于能深度定制个性化工作流,实现信息聚合与智能响应。典型的应用场景包括自动生成每日简报、基于上下文的智能提醒以及跨应用的工作流串联。本文将以QClaw框架为例,具体演示如何利用其模块化

425

iOS反编译-hook微信之艾特所有人

all。

2501_90243249的博客 759

Muse桌面AI Agent:边缘智能硬件范式与DDL抽象层实践

AI Agent不再只是云端服务或手机应用,而是可部署于ESP32、树莓派等异构硬件的本地化智能体。其核心在于边缘智能调度能力与跨平台硬件抽象层(DDL)——通过设备能力契约统一传感器、执行器与计算单元的语义接口,实现同一份Agent逻辑在MCU与Linux设备间的无缝迁移。这种设计显著降低嵌入式AI落地门槛,支撑离线邮件解析、行程规划、智能家居控制等真实场景。尤其适合需要低延迟、高可靠、强隐私保护的桌面级自动化工作流,如实验室数据采集、家庭健康监护与会议纪要生成。

weixin_34332905的博客 332

寻路最终版哦

相信大家用unity3d寻路的时候,一定会碰到多人

yxriyin的专栏 6955

TOGAF架构内容—TOGAF 内容框架和企业元模型

TOGAF架构内容—TOGAF 内容框架和企业元模型

深圳市多克创新科技有限公司 1664

iCalendar 编程基础:了解和使用 iCal4j

https://www.docin.com/p-507897851.html&amp;isPay=1

wintersweetforever的博客 774

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

利用javamail、ical4j发送会议邀请(日历)邮件、注意ical4j需要修改

一、pom添加依赖 <dependency> <groupId>org.mnode.ical4j</groupId> <artifactId>ical4j</artifactId> <version>2.2.6</version> </dependency> 二、修改ical4j 直接通过maven下载...

xjmfc的博客 4333

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

使用ical4j和javamail发送会议邀请

最近项目在做会议日程时需要发送邮件提醒,并要能把日程以会议邀请的方式显示在日历中(邮件通过邮件客户端接收如outlook、Foxmail等),利用ical4j可以读写iCalendar 数据流,把日程信息作为邮件正文发送会议邀请。(了解更多iCal4j信息(http://www.ibm.com/developerworks/cn/java/j-lo-ical4j/)) 好了,贴上代码:

为了明天的美好 8142

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

ical4j 开源项目常见问题解决方案

ical4j 开源项目常见问题解决方案 ical4j A Java library for parsing and building iCalendar data models 项目地址: https://gitcode.com/...

gitblog_00027的博客 776

javamail+iCal4j实现发送邮件会议

javamail+iCal4j实现发送邮件会议

人,一定要有激情 6443

maven仓库

查找一个maven的仓库jar包 &lt;dependency&gt;                &lt;groupId&gt;net.fortuna.ical4j&lt;/groupId&gt;                &lt;artifactId&gt;ical4j&lt;/artifactId&gt;                &lt;version&gt;${ical4j....

weixin_33755649的博客 176

iCal4j 项目推荐

iCal4j 项目推荐 ical4j A Java library for parsing and building iCalendar data models 项目地址: https://gitcode.com/gh_mirro...

gitblog_00487的博客 298
上一篇: 百度云推送
下一篇: 网络带宽问题ADSL
weitingyu
博客等级 码龄15年 2粉丝 31原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值