Приглашения на мероприятия, отправленные через javamail и ical4j, отображаются в виде обычного текста в outlook 365 - PullRequest
0 голосов
/ 14 апреля 2020

У меня проблема с приглашениями в календарь при отправке через 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

1 Ответ

0 голосов
/ 17 апреля 2020

НЕ используйте метод addHeaderLine. Те строки, которые вы добавляете, не являются строками заголовков. Вам необходимо установить их в качестве параметров в Content-Type части тела встречи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...