繁体   English   中英

通过 javamail 和 ical4j 发送的事件邀请在 outlook 365 中显示为纯文本

[英]Event invites sent via javamail and ical4j show as plain text in outlook 365

通过 javax.mail 将日历邀请发送到 Outlook 365 帐户时,我遇到了日历邀请问题。 email 已发送,但 email 的正文只是纯文本的邀请。 我不确定这是否是 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();

这是构建 iCal 主体的 buildCalendarPart function

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 中收到的邮件的屏幕截图 Outlook 365 中收到的消息的屏幕截图

不要使用 addHeaderLine 方法。 您添加的那些字符串不是 header 行。 您需要将这些设置为约会正文部分的 Content-Type 上的参数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM