工具:ICal4J。
添加到maven库:
简介:我们一般也可以用普通的发送纯文本格式发送会议邀请,但是显示效果不够美观。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 = "[email protected]";
private static String to = "[email protected]";//收件人
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
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;
}
}