У меня проблема с приглашениями в календарь при отправке через javax.mail в учетную запись Outlook 365. Письмо отправлено, но тело письма - это просто текстовое приглашение. Я не уверен, является ли это известной проблемой с Outlook 365 или я делаю что-то не так, но я попытался изучить оба варианта, и у меня не получается. Надеюсь, кто-то здесь может указать мне правильное направление. '' '
Properties prop = new Properties();
prop.put("mail.smtp.host", ResourceBundle.getBundle("system").getString("email.host"));
Session session = Session.getDefaultInstance(prop, null);
session.setDebug(true); // Verbose!
MimeMessage message = new MimeMessage(session);
message.addHeaderLine("method=REQUEST");
message.addHeaderLine("charset=UTF-8");
message.addHeaderLine("component=VEVENT");
message.setFrom(new InternetAddress(fromAddress));
message.setSubject(frame.getEventTitle());
message.setRecipients(Message.RecipientType.TO, recipientAddress);
// Create an alternative Multipart
Multipart multipart = new MimeMultipart("alternative");
// build and add the calendar
BodyPart calendarPart = buildCalendarPart(frame, recipientList, securityString);
calendarPart.setHeader("Content-Class", "urn:content- classes:calendarmessage");
calendarPart.setHeader("Content-ID", "calendar_message");
multipart.addBodyPart(calendarPart);
// Put the multipart in message
message.setContent(multipart);
// send the message
Transport transport = session.getTransport("smtp");
transport.connect();
transport.sendMessage(message, message.getAllRecipients());
transport.close();
и вот вызываемая мной функция buildCalendarPart, которая создает тело iCal
private BodyPart buildCalendarPart(DynamicFrame frame, List<String> recipientList, String securityString) throws Exception {
BodyPart calendarPart = new MimeBodyPart();
StringBuilder sb = new StringBuilder();
for(String recipient : recipientList) {
sb.append(recipient + ";");
}
String status = "";
// Create a TimeZone
TimeZoneRegistry registry = TimeZoneRegistryFactory.getInstance().createRegistry();
TimeZone timezone = registry.getTimeZone("America/Mexico_City");
VTimeZone tz = timezone.getVTimeZone();
Calendar startDate = new GregorianCalendar();
startDate.setTimeZone(timezone);
startDate.set(java.util.Calendar.MONTH, frame.getEventDate().getMonth());
startDate.set(java.util.Calendar.DAY_OF_MONTH, frame.getEventDate().getDay());
startDate.set(java.util.Calendar.YEAR, frame.getEventDate().getYear());
startDate.set(java.util.Calendar.HOUR_OF_DAY, frame.getEventDate().getHours());
startDate.set(java.util.Calendar.MINUTE, frame.getEventDate().getMinutes());
startDate.set(java.util.Calendar.SECOND, frame.getEventDate().getSeconds());
Calendar endDate = new GregorianCalendar();
endDate.setTimeZone(timezone);
endDate.set(java.util.Calendar.MONTH, frame.getEventDate().getMonth());
endDate.set(java.util.Calendar.DAY_OF_MONTH, frame.getEventDate().getDay());
endDate.set(java.util.Calendar.YEAR, frame.getEventDate().getYear());
endDate.set(java.util.Calendar.HOUR_OF_DAY, frame.getEventDate().getHours());
endDate.set(java.util.Calendar.MINUTE, frame.getEventDate().getMinutes());
endDate.set(java.util.Calendar.SECOND, frame.getEventDate().getSeconds());
// Create the event
String eventName = "Progress Meeting";
DateTime start = new DateTime(startDate.getTime());
DateTime end = new DateTime(endDate.getTime());
VEvent meeting = new VEvent(start, end, eventName);
// add timezone info..
meeting.getProperties().add(tz.getTimeZoneId());
// generate unique identifier..
meeting.getProperties().add(new Uid(frame.getWebcastId()));
String uri = "mailto:"+sb.toString();
// add attendees..
Attendee dev1 = new Attendee(URI.create(uri));
dev1.getParameters().add(Role.REQ_PARTICIPANT);
meeting.getProperties().add(dev1);
meeting.getProperties().add(Priority.MEDIUM);
meeting.getProperties().add(Clazz.PUBLIC);
// Create a calendar
net.fortuna.ical4j.model.Calendar icsCalendar = new net.fortuna.ical4j.model.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.getProperties().add(CalScale.GREGORIAN);
// Add the event
icsCalendar.getComponents().add(meeting);
// Fill the message
calendarPart.setContent(icsCalendar.toString(), "text/calendar");// very important
return calendarPart;
}
снимок экрана сообщения, полученного в Outlook 365