`
aawty
  • 浏览: 30928 次
  • 性别: 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;
  }
}

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics