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

问题描述 投票:0回答:1

当通过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;
}

screenshot of message received in Outlook 365在Outlook 365中收到的邮件的屏幕截图

java outlook office365 javamail ical4j
1个回答
0
投票

请勿使用addHeaderLine方法。您要添加的字符串不是标题行。您需要在约会正文部分的Content-Type上将它们设置为参数。

© www.soinside.com 2019 - 2024. All rights reserved.