javamail+ical4j发送会议提醒
本篇讲述小编在使用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发送会议提醒的更多相关文章
- PHP实现RTX发送消息提醒
RTX是腾讯公司推出的企业级即时通信平台,大多数公司都在使用它,但是我们很多时候需要将自己系统或者产品的一些通知实时推送给RTX,这就需要用到RTX的服务端SDK,建议先去看看RTX的SDK开发文档( ...
- javamail插件发送不同类型邮件方式
一.RFC882文档简单说明 RFC882文档规定了如何编写一封简单的邮件(纯文本邮件),一封简单的邮件包含邮件头和邮件体两个部分,邮件头和邮件体之间使用空行分隔. 邮件头包含的内容有: from字段 ...
- Android Java使用JavaMail API发送和接收邮件的代码示例
JavaMail是Oracle甲骨文开发的Java邮件类API,支持多种邮件协议,这里我们就来看一下Java使用JavaMail API发送和接收邮件的代码示例 使用Javamail发送邮件,必需的j ...
- RTX发送消息提醒实现以及注意事项
一.RTX简介 RTX是腾讯公司推出的企业级即时通信平台.该平台定位于降低企业通信费用,增强企业内部沟通能力,改善企业与客户之间的沟通渠道,创造新兴的企业沟通文化,提高企业生产力.RTX平台的主要功能 ...
- JavaMail 邮件发送
jar包部署 /** * 通过SMTP进行邮件集成 */ public class CmpSendMail { // 邮件发送服务器主机 private final static String HOS ...
- 应用层之E-mail服务及javaMail邮件发送的知识总结
关于Email服务你需要知道的知识点: 概述: 今天来介绍一下应用层的电子邮件服务,我们每天几乎都在用,电子邮件(email)服务也是一种基于C/S模式的服务,它采用的是一种"存储-转发&q ...
- javamail邮件发送例子
public class EmailTask{ // Session used by the javamail classes private Session session; ...
- Spring的javaMail邮件发送(带附件)
项目中经常用到邮件功能,在这里简单的做一下笔记,方便日后温习. 首先需要在配置文件jdbc.properties添加: #------------ Mail ------------ mail.smt ...
- javaMail邮件发送的简单实现
package com.test.mail; import java.util.Properties; import javax.mail.Message; import javax.mail.Ses ...
随机推荐
- ArcGIS中实现指定面积蜂窝(正六边形)方法
本篇博文为博主(whgiser)原创,转载请注明. 空间聚集研究中,地理尺度大多数都是基于格网构建的,只需fishnet下就行了.也常有使用社区.交通小区(TZ)作为研究单元的.直到发现蜂窝网络做出的 ...
- 根据PV统计出前三的热门板块,并统计出热门板块下的用户数--方式一
根据PV统计出前三的热门板块,并统计出热门板块下的用户数--方式一 测试数据 java代码 package com.hzf.spark.study; import java.util.ArrayLis ...
- 【JDBC】Java 连接 MySQL 基本过程以及封装数据库工具类
一. 常用的JDBC API 1. DriverManager类 : 数据库管理类,用于管理一组JDBC驱动程序的基本服务.应用程序和数据库之间可以通过此类建立连接.常用的静态方法如下 static ...
- ip 淘宝ip库 精简版
<?php header('Content-type: text/html; charset=utf-8'); //根据ip获取城市.网络运营商等信息 function findCityByIp ...
- 深入理解:Linear Regression及其正则方法
这是最近看到的一个平时一直忽略但深入研究后发现这里面的门道还是很多,Linear Regression及其正则方法(主要是Lasso,Ridge, Elastic Net)这一套理论的建立花了很长一段 ...
- iOS开发中一些有用的小代码
1.判断邮箱格式是否正确的代码: //利用正则表达式验证 -(BOOL)isValidateEmail:(NSString *)email { NSString *emailRegex = @&q ...
- xmind2013激活
参考链接:http://blog.163.com/m15999573195_1/blog/static/248705063201542622112823/
- PowerDesigner设置null约束
在PDM的表属性的字段列表中每行最后的P,F,M中的M(Mandatory)打勾就可以了,这样在生成的SQL中会变成not NULL Mandatory:强制的,不知道是不是可以理解为必须赋值的
- 懒人小技巧, Toad 常用偷懒方法
用toad很久了, 感叹它的功能强大的同时整理了一些相关技巧, 有以前在网上看到的也有自己平时用的时候偶尔发现的, 分享一下, 它对用户体验方面做的真的很到位, 通过各种方式来方便用户的操作. 菜鸟 ...
- LINUX下文件编译
body, table{font-family: 微软雅黑} table{border-collapse: collapse; border: solid gray; border-width: 2p ...