项目需求:用户会申请参加活动,系统自动给用户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;
}
}
工具: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;
}
}
发表评论
-
单例模式
2014-05-12 22:25 01. public class Singleton { ... -
一些web问题和解决方案
2014-04-26 15:04 0浏览器报错:Uncaught ReferenceError: ... -
上传jar包到maven库
2014-04-24 22:11 2607情形:maven项目中经常会遇到项目需要的jar在中央库中 ... -
从tomcat乱码问题中学习Java编码
2014-04-03 21:35 812项目在jetty中运行正常,打包到tomcat中, ... -
dos批处理命令学习
2014-03-21 13:34 1007最近接手公司一个项目,要将两个xml数据库的项目,打包成一个可 ... -
网络带宽问题ADSL
2014-03-18 14:19 443网络上行即上传,下行即下载。 运营商说的光纤传播速度单位是b/ ... -
CharSequence String StringBuffer StringBuilder StringUtils
2014-03-13 22:00 490CharSequence是一个字符序列接口,只包括length ... -
Linux环境部署
2013-12-30 09:42 683上周四完整地部署了两台Linux机器。在linux上运行需 ... -
谈序列化和transient类型
2013-12-21 17:15 905什么是序列化:很多时候数据要放在网络上传输,或者存到数据库中, ... -
@override报错
2013-12-21 17:08 430@Override 时出现以下错误: The metho ... -
一些总结listener filter interceptor
2013-12-21 17:06 649servlet:运行在Java服务器端的应用程序,工作在客户端 ... -
vi编辑器
2013-12-13 16:46 2vi编辑器 http://man.ddvip.com/sof ... -
vi编辑器
2013-12-13 16:45 591http://man.ddvip.com/soft/viedi ... -
年底任务表
2013-12-04 09:18 598这段时间研究了一些设计模式的东西,以前在学校上UML课程老师讲 ... -
我所理解的maven
2013-11-27 13:26 739maven最常用的功能是作为项目管理工具,可以帮助 ... -
登录后跳转进入登录前的网址
2013-11-18 08:58 843优化系统的时候拿到网址,登录进去只能看到首页,之前的网址还 ... -
登出以后点击浏览器返回按钮,使其不能正常返回
2013-11-13 09:05 1539今天开始优化系统,之前是登出系统以后点击浏览器返回按钮,就会退 ... -
自己动手安装Linux中的JDK\tomcat
2013-11-08 15:46 578今天开始安装tomcat。上一篇文章中JDK安装出现了问题,然 ... -
Ubuntu下安装JDK rpm格式
2013-11-06 16:52 959今天没事就开始捣鼓我的Linux。昨天下班在 http: ... -
Ubuntu权限 普通用户变为超级用户
2013-11-06 15:01 912Ubuntu有$标志表示你现在处于普通用户,#表示超级用户 ...
相关推荐
ical4j是一个强大的Java库,专门用于处理iCalendar(RFC5545)格式的数据,如日历事件、任务和提醒。这个库的核心目标是帮助开发者在Java应用程序中解析、生成和操作iCalendar文件。ical4j-1.0.3-src是一个源代码包...
ical4j是一个强大的Java库,专门用于解析和构建遵循iCalendar标准的数据模型。这个开源项目为开发者提供了处理iCalendar文件(通常以`.ics`扩展名结尾)的能力,这些文件常用于共享日历、事件和任务信息。ical4j库...
ical4j是一个强大的Java库,专门用于解析和构建iCalendar(ICalendar)数据模型。iCalendar是一种标准的数据格式,常用于在不同的日历应用程序之间交换事件、任务、约会和其他时间相关的数据。ical4j库为开发者提供...
2. **创建iCalendar对象**:通过ical4j,你可以创建新的iCalendar对象,定义事件的时间、地点、参与者、描述等信息,并设置提醒规则,如电子邮件通知、弹出提醒等。 3. **序列化和输出**:创建好的iCalendar对象...
ical4j-2.0-beta1.zip 是一个与日历和事件管理相关的开源库,它主要为Java开发者提供了处理iCalendar格式数据的能力。iCalendar是一种标准格式,常用于创建、共享和管理电子日历和事件数据。ical4j库允许程序读取、...
**ical4j用户指南** ical4j是一款强大的Java库,专为处理iCalendar(.ics)格式的文件而设计。这个格式广泛用于日历、事件和任务管理,尤其是在电子邮件系统和在线日历服务中。本指南将深入探讨ical4j库的使用方法...
iCal4j-iCalendar解析器和对象模型目录介绍iCal4j是一个Java库,用于读写定义的iCalendar数据流。 iCalendar标准提供了一种通用数据格式,用于存储有关日历特定数据的信息,例如事件,约会,待办事项等。所有流行的...
iCal4j是一个开源的Java库,专门设计用于处理iCalendar格式的文件,通常扩展名为*.ics。这个库为开发者提供了强大的工具,可以方便地读取、创建、修改和解析iCalendar数据。iCalendar是一种标准的数据交换格式,常...
- 会议管理:对于企业内部,`laravel-ical` 可以帮助管理会议安排,自动同步所有参与者的日历。 - 提醒与通知:结合 Laravel 的任务调度,可以定时发送 iCal 事件提醒,确保用户不会错过任何重要约会。 **总结** `...
ical4j-1.0.jar java 发送邮件日历提醒功能所需jar包
标题 "iCal-like Calendars" 指的是一个模仿苹果公司iCal(iCalendar)风格的日历应用或组件。iCal是苹果操作系统中内置的一款功能强大的日历应用程序,以其直观的用户界面和丰富的功能而闻名。这个项目可能是为了在...
ICS是一种标准的文件格式,用于交换日历和事件数据,常用于日程安排、会议邀请和提醒。它支持包含事件、任务、节假日等多种日历项,并且可以跨多个平台和应用共享。RFC5545是定义这种格式的互联网标准,提供了详细的...
总之,JavaMail和ical4j结合使用,可以实现功能强大的会议提醒系统,不仅能在Outlook等邮件客户端中正常显示,还能在KMail等其他客户端中触发预期的提醒和回复机制。通过仔细调整和测试邮件内容的各个部分,可以确保...
iCal.NET是用于.NET的iCalendar(RFC 5545)类库,旨在提供RFC 5545合规性,同时与流行的日历应用程序和库完全兼容。 获取iCal.NET iCal.NET是作为。 从dday.ical迁移到ical.net 有一个为您提供的指南: 例子 Wiki...
在本文中,我们将深入...总的来说,通过在 Laravel 中集成 eLuceo/iCal,你可以方便地处理与日历相关的功能,例如分享会议安排、活动或提醒。这个库提供了丰富的 API,使得与 iCalendar 格式的数据交互变得简单易行。
ical.js (以前是节点的) javascript / node( )的容忍的,最小的icalendar解析器安装-Node.js ical.js在npm上可用: npm install ical原料药ical.parseICS(str) 用ICS文件解析字符串var data = ical.parseFile&#...
iCal个人日程管理软件可以帮助你合理安排每天、每周、每月的日程,实现时间管理的概念。iCal_1.0.45 ·在自用软件iCal_1.0的基础上进行了以下修改后作为免费共享版推出 1、更换下拉式日历控件 2、更新“日”...