/**
* 发送邀请
* @param cycleModel*/
protected voidsendEmail(CycleMailModel cycleModel) {
Properties properties= newProperties();
properties.put("mail.transport.protocol", "smtp");
properties.put("mail.smtp.user", "smtp.XXX.com");
properties.put("mail.smtp.host", cycleModel.getEmailHost());
properties.put("mail.smtp.port", "25");
properties.put("mail.smtp.auth", "true");
final String username=cycleModel.getEmailAddress();
final String password=cycleModel.getEmailPass();
Authenticator authenticator= newAuthenticator() {protectedPasswordAuthentication getPasswordAuthentication() {return newPasswordAuthentication(username, password);
}
};
Transport transport= null;try{
Session session=Session.getDefaultInstance(properties,
authenticator);
MimeMessage mimeMessage= newMimeMessage(session);
mimeMessage.setSubject(cycleModel.getSubject());if(null != attendee && attendee.size() > 0){for (int i = 0; i < attendee.size(); i++) {
JSONObject mail=attendee.getJSONObject(i);if(mail.containsKey("address")){
mimeMessage.addRecipient(javax.mail.Message.RecipientType.TO,new InternetAddress(mail.getString("address")));
}
}
}
mimeMessage.setFrom(newInternetAddress(username));//method=REQUEST;
mimeMessage.setSentDate(newDate());
mimeMessage.setContent(getContentText(cycleModel));/*if(cycleModel.getMethodType() == 1){
}else{
mimeMessage.setContent(cancelVEvent(cycleModel));
}*/mimeMessage.saveChanges();
transport= session.getTransport("smtp");
transport.connect("mail.sfsctech.com",username, password);
transport.sendMessage(mimeMessage, mimeMessage.getAllRecipients());
}catch(MessagingException e) {//TODO Auto-generated catch block
JSONObject exception =JSONObject.fromObject(e);//异常邮箱
if(exception.containsKey("invalidAddresses")){
JSONArray invalidAddresses= exception.getJSONArray("invalidAddresses");if(null != invalidAddresses && invalidAddresses.size() > 0){for (int i = 0; i < invalidAddresses.size(); i++) {//修改发送失败状态
JSONObject mailObject =invalidAddresses.getJSONObject(i);this.dao.updateInvalidAddressesState(cycleModel.getPrimaryKey(), mailObject.getString("address"),2,2);
}
logger.error("异常邮箱:"+invalidAddresses.toString());
}
}//被退回邮箱
if(exception.containsKey("validUnsentAddresses")){
JSONArray validUnsentAddresses= exception.getJSONArray("validUnsentAddresses");if(validUnsentAddresses.size() > 0){this.attendee=validUnsentAddresses;
sendEmail(cycleModel);
System.out.println("会议邮件 发送失败,再次发送");
}
}
}catch(Exception e) {//TODO Auto-generated catch block
e.printStackTrace();
}finally{if (transport != null)try{
transport.close();
}catch(MessagingException logOrIgnore) {
}
}
}/**
* 邀请内容
* @param cycleModel
* @return
* @throws Exception*/
protectedMultipart getContentText(CycleMailModel cycleModel) throws Exception {//时区
/** TimeZoneRegistry registry = TimeZoneRegistryFactory.getInstance()
* .createRegistry(); TimeZone timezone =
* registry.getTimeZone("Asia/Shanghai"); // 会议地点 // 会议时间
* java.util.Calendar cal = java.util.Calendar.getInstance();
*
* cal.setTimeZone(timezone); cal.set(2015, 6, 2, 14, 0); // 月份是要早一个月
* DateTime start = new DateTime(cal.getTime()); cal.set(2015, 6, 2, 14,
* 30); DateTime end = new DateTime(cal.getTime());*/Calendar calendar= newCalendar();
calendar.getProperties().add(new ProdId("-//Ben Fortuna//iCal4j 1.0//EN"));
calendar.getProperties().add(Version.VERSION_2_0);
calendar.getProperties().add(CalScale.GREGORIAN);
DateTime start= new DateTime(format.parse(cycleModel.getBeginTime().substring(0, 16)).getTime());
DateTime end= new DateTime(format.parse(cycleModel.getEndTime().substring(0, 16)).getTime());
VEvent vevent= newVEvent(start, end, cycleModel.getSubject());
vevent.getProperties().add(new Location(cycleModel.getLocation()));//会议地点
vevent.getProperties().add(newUid(cycleModel.getEventUid()));
Organizer org= new Organizer(URI.create("mailto:" +cycleModel.getEmailAddress()));
vevent.getProperties().add(org);//主键
Sequence sequence = newSequence(cycleModel.getSequenceId());
vevent.getProperties().add(sequence);if(cycleModel.getEventType() == 2){
String endTime= cycleModel.getBeginTime().substring(0, 10) + " " + cycleModel.getEndTime().substring(11, 16);
vevent.getEndDate().setDate(newDateTime(format.parse(endTime)));//添加事件规则 天、周
vevent.getProperties().add(getRRule(cycleModel));
}//与会人
int i = 1;for (int j = 0; j < this.attendee.size(); j++) {
JSONObject emailObject= this.attendee.getJSONObject(j);if(emailObject.containsKey("address")){
Attendee attendee= new Attendee(URI.create("mailto:" + emailObject.getString("address")));
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"));//--------VAlarm Over-------------//--------日历对象 Start---------------
Calendar icsCalendar = newCalendar();
icsCalendar.getProperties().add(new ProdId("-//Events Calendar//iCal4j 1.0//EN"));
icsCalendar.getProperties().add(CalScale.GREGORIAN);
icsCalendar.getProperties().add(Version.VERSION_2_0);
String method= "REQUEST";//新增或者编辑
if(cycleModel.getMethodType().equals(1)){
vevent.getAlarms().add(valarm);//将VAlarm加入VEvent
icsCalendar.getProperties().add(Method.REQUEST);
}else{
icsCalendar.getProperties().add(Method.CANCEL);
method= "CANCEL";
}
icsCalendar.getComponents().add(vevent);//将VEvent加入Calendar
icsCalendar.validate();//将日历对象转换为二进制流
CalendarOutputter co = new CalendarOutputter(false);
ByteArrayOutputStream os= newByteArrayOutputStream();
co.output(icsCalendar, os);byte[] mailbytes =os.toByteArray();//--------日历对象 Over------------------
BodyPart mbp = newMimeBodyPart();
mbp.setContent(mailbytes,"text/calendar;method="+method+";charset=UTF-8");
System.out.println("会议邮件 method ="+method);
BodyPart content= newMimeBodyPart();
content.setContent(cycleModel.getBody(),"text/html;charset=UTF-8");
System.out.println("会议邮件 Body ="+cycleModel.getBody());
MailcapCommandMap mc=(MailcapCommandMap) CommandMap
.getDefaultCommandMap();
mc
.addMailcap("text/html;; x-java-content-handler=com.sun.mail.handlers.text_html");
mc
.addMailcap("text/xml;; x-java-content-handler=com.sun.mail.handlers.text_xml");
mc
.addMailcap("text/plain;; x-java-content-handler=com.sun.mail.handlers.text_plain");
mc
.addMailcap("multipart/*;; x-java-content-handler=com.sun.mail.handlers.multipart_mixed");
mc
.addMailcap("message/rfc822;; x-java-content-handler=com.sun.mail.handlers.message_rfc822");
CommandMap.setDefaultCommandMap(mc);
MimeMultipart mm= newMimeMultipart();
mm.setSubType("related");
mm.addBodyPart(mbp);
mm.addBodyPart(content);returnmm;
}