本篇讲述小编在使用ical4j时对其的理解与使用,留作笔记的同时希望能帮助到大家!

初学者可以先了解下ical4j的基本信息:

iCalender编程基础,了解与使用ical4j:https://www.ibm.com/developerworks/cn/java/j-lo-ical4j/index.html

废话不多说直接进入题

maven

<!-- 导入ical4j库 -->
<dependency>
<groupId>org.mnode.ical4j</groupId>
<artifactId>ical4j</artifactId>
<version>1.0.2</version>
</dependency> <!-- 邮件start -->
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4.7</version>
</dependency>

  

在通过ical4j与javamail实现会议邀请的时候,过程如下

1、通过ical4j创建一个Calendar(日历),这个Calendar中可以包括VEvent(事件)、VAlarm(提醒)、TODO(待办事项)等多项内容。而会议邀请则必须要包含VEvent,如果需要提醒,则可以包含VAlarm。

public static Multipart getContentText() throws Exception {
// 时区
TimeZoneRegistry registry = TimeZoneRegistryFactory.getInstance().createRegistry();
TimeZone timezone = registry.getTimeZone("Asia/Shanghai");
// 会议地点
String location = "安徽省合肥市";
// 会议时间
java.util.Calendar cal = java.util.Calendar.getInstance(); cal.setTimeZone(timezone);
//会议启动时间
cal.set(2018, 2 - 1, 13, 13, 45); // 月份是要早一个月
DateTime start = new DateTime(cal.getTime());
//会议结束时间
cal.set(2018, 2 - 1, 13, 18, 55);
DateTime end = new DateTime(cal.getTime()); // --------事件(VEvent start)----------
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;
}

  2、事件创建之后,通过javamail发送邮件

    private static String from = "***@126.com";
private static String to = "***@126.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", "smtp"); // 邮件协议
props.put("mail.smtp.host", "smtp.126.com"); // 服务器域名
props.put("mail.smtp.auth", "true");
//账号密码认证
Authenticator auth = new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
String username = "***@126.com"; // 大多数是你邮件@前面的部分
String pwd = "******";
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) {
}
System.out.println(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;
}
}

  

使用javamail发送邮件时,需要连接邮件服务器,根据不同的邮箱填写不同的邮箱服务器域名及协议,具体可百度搜索相关邮箱网站即可查询

例:

 网易126免费邮箱相关服务器服务器信息:

 邮件服务器名称 服务器地址  端口号
  POP3服务器 pop.126.com  110
  SMTP服务器 smtp.126.com  25
  IMAP服务器 imap.126.com  143

 qq免费邮箱相关服务器服务器信息:

邮件服务器名称 服务器地址  端口号
  POP3服务器 pop.qq.com 465
  SMTP服务器 smtp.qq.com 587

在账号密码认证时,需要开通对应邮箱的授权码使用授权码代替邮箱密码

qq开通授权码流程:https://jingyan.baidu.com/article/fedf0737af2b4035ac8977ea.html

网易开通授权码流程:https://jingyan.baidu.com/article/9faa72318b76bf473c28cbf7.html

最后附加几条可能遇到的错误信息:

  1、553 Mail from must equal authorized user:这个错误网上搜都说是System Admin e-main Address 没有设置,不过我后来解决是因为设置该属性的时候没有配置正确

    mimeMessage.setFrom(new InternetAddress("***@126.com"));

  2、535 Error: authentication failed:这个问题就是上面所说的授权码的问题了,如果你的pwssword 使用的是邮箱的登录密码就会报这个错误,需要获取邮箱的授权码才可以

  3、javax.mail.NoSuchProviderException: No provider for pop:邮件协议与服务器域名冲突了,smtp => smtp.126.com,pop => pop.126.com

  4、javax.mail.AuthenticationFailedException: 550 Óû§ÎÞȨµÇ½:用户名密码错误

5、com.sun.mail.smtp.SMTPSendFailedException: 554 DT:SPM 126 smtp1:如果出现改错误,那么可能是标题或内容中出现了test或helloword等,被网易认为邮件内容不合法。

    把各项内容按正常的内容填写之后发送就正常使用了

    具体可参考:http://blog.csdn.net/yiyihuazi/article/details/53671791

    企业退信的常见问题:http://help.163.com/09/1224/17/5RAJ4LMH00753VB8.html

javamail+ical4j发送会议提醒的更多相关文章

  1. PHP实现RTX发送消息提醒

    RTX是腾讯公司推出的企业级即时通信平台,大多数公司都在使用它,但是我们很多时候需要将自己系统或者产品的一些通知实时推送给RTX,这就需要用到RTX的服务端SDK,建议先去看看RTX的SDK开发文档( ...

  2. javamail插件发送不同类型邮件方式

    一.RFC882文档简单说明 RFC882文档规定了如何编写一封简单的邮件(纯文本邮件),一封简单的邮件包含邮件头和邮件体两个部分,邮件头和邮件体之间使用空行分隔. 邮件头包含的内容有: from字段 ...

  3. Android Java使用JavaMail API发送和接收邮件的代码示例

    JavaMail是Oracle甲骨文开发的Java邮件类API,支持多种邮件协议,这里我们就来看一下Java使用JavaMail API发送和接收邮件的代码示例 使用Javamail发送邮件,必需的j ...

  4. RTX发送消息提醒实现以及注意事项

    一.RTX简介 RTX是腾讯公司推出的企业级即时通信平台.该平台定位于降低企业通信费用,增强企业内部沟通能力,改善企业与客户之间的沟通渠道,创造新兴的企业沟通文化,提高企业生产力.RTX平台的主要功能 ...

  5. JavaMail 邮件发送

    jar包部署 /** * 通过SMTP进行邮件集成 */ public class CmpSendMail { // 邮件发送服务器主机 private final static String HOS ...

  6. 应用层之E-mail服务及javaMail邮件发送的知识总结

    关于Email服务你需要知道的知识点: 概述: 今天来介绍一下应用层的电子邮件服务,我们每天几乎都在用,电子邮件(email)服务也是一种基于C/S模式的服务,它采用的是一种"存储-转发&q ...

  7. javamail邮件发送例子

    public class EmailTask{        // Session used by the javamail classes    private Session session;   ...

  8. Spring的javaMail邮件发送(带附件)

    项目中经常用到邮件功能,在这里简单的做一下笔记,方便日后温习. 首先需要在配置文件jdbc.properties添加: #------------ Mail ------------ mail.smt ...

  9. javaMail邮件发送的简单实现

    package com.test.mail; import java.util.Properties; import javax.mail.Message; import javax.mail.Ses ...

随机推荐

  1. PHP $_SERVER['HTTP_REFERER'] 获取前一页面的 URL 地址

    转载:http://www.5idev.com/p-php_server_http_referer.shtml 使用 $_SERVER['HTTP_REFERER'] 将很容易得到链接到当前页面的前一 ...

  2. sql子查询

    一.子查询入门: 1.单值子查询: 单值子查询的唯一限制:子查询的返回值必须只有一行记录,而且只能有一列(又被称为标量子查询). 可以使用在select语句的列表.表达式中,以及where语句中等. ...

  3. Weblogic新建域,Weblogic新建部署环境,Weblogic重新构建域

    Weblogic新建域,Weblogic新建部署环境,Weblogic重新构建域 ======================== 蕃薯耀 2018年1月29日 http://www.cnblogs. ...

  4. intent详解(一)

    摘录自:http://blog.csdn.net/harvic880925/article/details/38399723 前言:通过重新翻看Android入门书籍,才发现原来自己露掉了那么多基础知 ...

  5. myeclipse10不用打开myeclipse configuration center安装插件的方法

    我使用myeclipse10,网上找了一大堆的插件安装方法,全部都是要通过help->myeclipse configuration center进行安装 不用打开myeclipse  conf ...

  6. 用jquery怎么删除<table>的一行

    摘录网址:用jquery怎么删除<table>的一行 思路:获取<table>的一行,然后使用 remove() 方法删除之.实例演示如下: 1.HTML结构 <tabl ...

  7. 2017年 JavaScript 框架回顾 -- 后端框架

    本文是2017年 JavaScript 框架回顾系列的最后的一篇文章,主要介绍 JavaScript 的后端框架情况. 从上图中可以看到,Express 作为用 JavaScript 编写的后端服务的 ...

  8. Spring-AOP标签scoped-proxy

    <aop:scoped-proxy/>介绍: Spring的Bean是有scope属性的,表示bean的生存周期.scope的值有prototype.singleton.session.r ...

  9. linux_http协议

    什么是http协议? 超文本传输协议 最流行www服务,是http协议的实现 ssh,nfs,rsync客户端(Client)和服务端(Server),C/S架构,局域网内部用,胖客户端 http协议 ...

  10. @media 针对不同的屏幕尺寸设置不同的样式

    @media screen and (max-width: 800px) {    #yanandownload .close input {    margin-right: 40px ;    } ...