(edit by king)最近要搞个提醒系统,也就是能够设置个时间,在那个时间发封邮件提醒的系统。为了能够更好的起到提醒的效果,暂定的方案是发送会议邀请。
以前知道outlook的会议邀请格式不能仅仅发送ics附件,这样和outlook发送的会议邀请不太一样,不能默认自动加入到本地日历中,需要直接将ics格式当作正文发送。
在网上找了下基于java的ical格式库,ical4j,用这个来创建ics格式文件。这个库的文档还算比较全,也有简单的例子,照着例子(http://wiki.modularity.net.au/ical4j/index.php?title=Examples#Creating_a_meeting_of_four_hour_duration
)抄了一段代码,结果在outlook中显示不支持的ics格式。通过比对outlook发送的会议邀请邮件源代码,添加了icsCalendar.getProperties().add(Method.REQUEST);这个属性之后,终于能够在outlook中正常使用了。
但是这样的会议邀请在我的kmail中,却总是提示不需要应答。在设置参与者的时候,明明已经把我自己的邮箱作为必选者了,但是还是不能对会议邀请进行响应。还是继续对比原来的会议邀请,发现在添加Attendee对象的时候,还可以增加好几个属性,如PARTSTAT,RSVP,经过多次尝试(哈哈,给别人发了n多垃圾邮件)后,终于在设置了RSVP属性(值为TRUE)的时候,kmail终于能够提示“您的应答已被请求”,可以应答这个邀请了。
现在的代码:
public static void sendEventEmail(List<Pair<String, String>> reqs,
List<Pair<String, String>> opts, Date startTime, Date endTime,
String location, String name, String content)
throws IOException, ValidationException, IllegalArgumentException {
if (reqs == null || reqs.isEmpty()) {
throw new IllegalArgumentException(
"Required participant should not be empty!");
}
List<String> tos = new ArrayList<String>();
DateTime start = new DateTime(startTime);
DateTime end = new DateTime(endTime);
VEvent meeting = new VEvent(start, end, name);
TimeZoneRegistry registry = TimeZoneRegistryFactory.getInstance()
.createRegistry();
// 设置时区
TimeZone timezone = registry.getTimeZone("Asia/Shanghai");
VTimeZone tz = timezone.getVTimeZone();
meeting.getProperties().add(tz.getTimeZoneId());
meeting.getProperties().add(new Location(location));
meeting.getProperties().add(new Summary(name));
meeting.getProperties().add(new Description(content));
// 设置uid
UidGenerator ug;
Uid uid;
ug = new UidGenerator("uidGen");
uid = ug.generateUid();
meeting.getProperties().add(uid);
for (Pair<String, String> participant : reqs) {
Attendee attendee = new Attendee(URI.create("mailto:"
+ participant.first()));
attendee.getParameters().add(Role.REQ_PARTICIPANT);
attendee.getParameters().add(PartStat.NEEDS_ACTION);
attendee.getParameters().add(Rsvp.TRUE);
attendee.getParameters().add(new Cn(participant.second()));
meeting.getProperties().add(attendee);
tos.add(participant.first());
}
if (opts != null && !opts.isEmpty()) {
for (Pair<String, String> participant : opts) {
Attendee attendee = new Attendee(URI.create("mailto:"
+ participant.first()));
attendee.getParameters().add(Role.OPT_PARTICIPANT);
attendee.getParameters().add(new Cn(participant.second()));
meeting.getProperties().add(attendee);
tos.add(participant.first());
}
}
Calendar icsCalendar = new Calendar();
icsCalendar.getProperties().add(
new ProdId("-//Events Calendar//iCal4j 1.0//EN"));
icsCalendar.getProperties().add(Version.VERSION_2_0);
icsCalendar.getProperties().add(Method.REQUEST);
icsCalendar.getComponents().add(meeting);
CalendarOutputter co = new CalendarOutputter(false);
Writer wtr = new StringWriter();
co.output(icsCalendar, wtr);
String mailContent = wtr.toString();
sendEmail(tos, name, mailContent);
}
其中sendEmail方法就是通过javamail发送邮件:
public static void sendEmail(List<String> tos, String subject, String content) {
Properties properties = new Properties();
properties.put("mail.transport.protocol", "smtp");
properties.put("mail.smtp.user", "xxx");
properties.put("mail.smtp.host", "xxx");
properties.put("mail.smtp.port", "xxx");
properties.put("mail.smtp.auth", "true");
final String username = "xxx";
final String password = "xxx";
Authenticator authenticator = new Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password);
}
};
Transport transport = null;
try {
Session session = Session.getDefaultInstance(properties,
authenticator);
MimeMessage mimeMessage = new MimeMessage(session);
mimeMessage.setSubject(subject);
for(String to : tos) {
mimeMessage.addRecipient(Message.RecipientType.TO,
new InternetAddress(to));
}
mimeMessage.setFrom(new InternetAddress(
"xxx@xxx.com"));
mimeMessage.setContent(content,
"text/calendar;method=REQUEST;charset=UTF-8");
transport = session.getTransport();
transport.connect(username, password);
transport.sendMessage(mimeMessage, mimeMessage
.getRecipients(javax.mail.Message.RecipientType.TO));
} catch (MessagingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if (transport != null)
try {
transport.close();
} catch (MessagingException logOrIgnore) {
}
}
}
现在还发现的问题是:
- 没有设置组织者,不过这个修改起来还是比较方便的
- 没有增加提醒,这个需要在calendar对象中添加VAlarm,增加提醒
- 还不支持html格式,这个再说了,作为一个提醒,应该不需要很绚的内容
分享到:
相关推荐
完美JavaMail+redis完成邮件发送和邮箱认证,用javaMail发送内嵌图片的html邮件内容
JAVAMail+Ajax+jsp实现邮箱发送验证并验证/发送链接/包含文件发送(包含企业邮箱/163/qq邮箱多种发送方式) 不是单一的一种方式,包含了3-4种java邮件发送的方法有详细说明,满足各种需求,也注明了使用需要注意的点 比较...
用javamail给邮箱推送一条验证码,并用ajax进行验证
在表单中可以动态生成日历。 根据当前的系统时间来动态生成日历和当天星期几。 当选择每一项的什么变色
springboot+amq+javamail+maven的项目,亲测可以用,注意改邮箱地址就行了
包含JavaMail1.4.5、JAF1.1.1、JavaMail API文档英文版,以及JavaMailAPI中文详解
采用JSF+JAVAMail+GoogleMap+MYSQL实现,共9900行代码。本程序来自《Java web项目开发案例导航》,推荐大家购买书籍。配套视频可在优酷找到。播放密码见源程序
内含JavaMail1.4.5官方包、JAF1.1.1官方包和JavaMailAPI详解文档。 !!!若文档有无法打开的情况,请将文档拷贝到C盘根目录再打开。
邮件开发所用到的jar包和开发教程。 javamail发送邮件
真实案例.给公司其他部门制作的一个简易的小软件.选择相应报表 上传附件 生成对应数据库的 excel 表信息,以邮件方式发送到收件方....具体请看 压缩包附带的 txt文件..[里面publicclass中的数据为测试数据..]
java购物网站,结合javamail实现邮件注册,提醒,转发。后台上传下载产品信息。前后台均可独立操作。数据库sql2000.开发环境Eclipse3.2+tomcat5.0+jdk6.0
这是我们学习JSP时~书上介绍的几个组件分别实现文件上传下载,发送EMail,制作图表以及报表!希望对童鞋们有点用!~~
ssm 框架集成javamail 实现系统邮件发送功能
设置smtp 利用java发邮件,多用于用户注册后发确认邮件 有mail.jar 包 导入jar直接可以运行
javamail实现的163邮箱发送到腾讯邮件的示例、 已经javamail的详细API级demo!
JAVAMAIL 实例 + JAVAMAIL支持包 完整可运行实例 把JAR包放到工程WEB-INF的LIB下,JAVA类已经测试通过,可以直接运行即可。
利用jsp和javamail实现电子邮件的发送。适合初学者学习!
javamail发送邮件实例 javamail 发送邮件 文本编辑器 kindeditor
javamail与spring结合的简单入门例子