当通过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;
}
请勿使用addHeaderLine方法。您要添加的字符串不是标题行。您需要在约会正文部分的Content-Type上将它们设置为参数。