`
aawty
  • 浏览: 32254 次
  • 性别: Icon_minigender_2
  • 来自: 上海
社区版块
存档分类
最新评论

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

分享到:
评论

相关推荐

    ical4j-1.0.3-src

    ical4j是一个强大的Java库,专门用于处理iCalendar(RFC5545)格式的数据,如日历事件、任务和提醒。这个库的核心目标是帮助开发者在Java应用程序中解析、生成和操作iCalendar文件。ical4j-1.0.3-src是一个源代码包...

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

    ical4j是一个强大的Java库,专门用于解析和构建遵循iCalendar标准的数据模型。这个开源项目为开发者提供了处理iCalendar文件(通常以`.ics`扩展名结尾)的能力,这些文件常用于共享日历、事件和任务信息。ical4j库...

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

    ical4j是一个强大的Java库,专门用于解析和构建iCalendar(ICalendar)数据模型。iCalendar是一种标准的数据格式,常用于在不同的日历应用程序之间交换事件、任务、约会和其他时间相关的数据。ical4j库为开发者提供...

    ical4j-1.0.jar

    2. **创建iCalendar对象**:通过ical4j,你可以创建新的iCalendar对象,定义事件的时间、地点、参与者、描述等信息,并设置提醒规则,如电子邮件通知、弹出提醒等。 3. **序列化和输出**:创建好的iCalendar对象...

    ical4j-2.0-beta1.zip

    ical4j-2.0-beta1.zip 是一个与日历和事件管理相关的开源库,它主要为Java开发者提供了处理iCalendar格式数据的能力。iCalendar是一种标准格式,常用于创建、共享和管理电子日历和事件数据。ical4j库允许程序读取、...

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

    **ical4j用户指南** ical4j是一款强大的Java库,专为处理iCalendar(.ics)格式的文件而设计。这个格式广泛用于日历、事件和任务管理,尤其是在电子邮件系统和在线日历服务中。本指南将深入探讨ical4j库的使用方法...

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

    iCal4j-iCalendar解析器和对象模型目录介绍iCal4j是一个Java库,用于读写定义的iCalendar数据流。 iCalendar标准提供了一种通用数据格式,用于存储有关日历特定数据的信息,例如事件,约会,待办事项等。所有流行的...

    iCal4j-开源

    iCal4j是一个开源的Java库,专门设计用于处理iCalendar格式的文件,通常扩展名为*.ics。这个库为开发者提供了强大的工具,可以方便地读取、创建、修改和解析iCalendar数据。iCalendar是一种标准的数据交换格式,常...

    Laravel开发-laravel-ical

    - 会议管理:对于企业内部,`laravel-ical` 可以帮助管理会议安排,自动同步所有参与者的日历。 - 提醒与通知:结合 Laravel 的任务调度,可以定时发送 iCal 事件提醒,确保用户不会错过任何重要约会。 **总结** `...

    exp4j.jar包下载

    ical4j-1.0.jar java 发送邮件日历提醒功能所需jar包

    iCal-like+Calendars

    标题 "iCal-like Calendars" 指的是一个模仿苹果公司iCal(iCalendar)风格的日历应用或组件。iCal是苹果操作系统中内置的一款功能强大的日历应用程序,以其直观的用户界面和丰富的功能而闻名。这个项目可能是为了在...

    前端项目-ical.js.zip

    ICS是一种标准的文件格式,用于交换日历和事件数据,常用于日程安排、会议邀请和提醒。它支持包含事件、任务、节假日等多种日历项,并且可以跨多个平台和应用共享。RFC5545是定义这种格式的互联网标准,提供了详细的...

    javamail邮件提醒

    总之,JavaMail和ical4j结合使用,可以实现功能强大的会议提醒系统,不仅能在Outlook等邮件客户端中正常显示,还能在KMail等其他客户端中触发预期的提醒和回复机制。通过仔细调整和测试邮件内容的各个部分,可以确保...

    ical.net:ical.NET-.NET的开源iCal库

    iCal.NET是用于.NET的iCalendar(RFC 5545)类库,旨在提供RFC 5545合规性,同时与流行的日历应用程序和库完全兼容。 获取iCal.NET iCal.NET是作为。 从dday.ical迁移到ical.net 有一个为您提供的指南: 例子 Wiki...

    Laravel开发-ical

    在本文中,我们将深入...总的来说,通过在 Laravel 中集成 eLuceo/iCal,你可以方便地处理与日历相关的功能,例如分享会议安排、活动或提醒。这个库提供了丰富的 API,使得与 iCalendar 格式的数据交互变得简单易行。

    ical.js:javascript的ical

    ical.js (以前是节点的) javascript / node( )的容忍的,最小的icalendar解析器安装-Node.js ical.js在npm上可用: npm install ical原料药ical.parseICS(str) 用ICS文件解析字符串var data = ical.parseFile&#...

    iCal个人日程管理软件V1.6.421绿色中文免费版

    iCal个人日程管理软件可以帮助你合理安排每天、每周、每月的日程,实现时间管理的概念。iCal_1.0.45 ·在自用软件iCal_1.0的基础上进行了以下修改后作为免费共享版推出  1、更换下拉式日历控件  2、更新“日”...

Global site tag (gtag.js) - Google Analytics