Ранее работавшее приглашение календаря перестало работать для почтового клиента Outlook, но работает для клиента Gmail.

Я использую Sendgrid для отправки электронных писем и библиотеку Ical4j для создания приглашения в календаре. Приведенный ниже код работал нормально несколько месяцев назад, и все отправленные приглашения календаря также отображали все необходимые вещи, такие как; Кнопка «Принять/Отклонить», даты начала и окончания и т. д. после получения через любой почтовый клиент (в основном Outlook и Gmail). Но теперь я могу отправлять приглашения календаря через этот код, но как только он будет получен через почтовый клиент Outlook (он отлично работает через Gmail); он отображается как вложение (.ics) вместо всех необходимых элементов управления приглашением календаря.

Я пробовал несколько подходов, но ни один из них не работал.

Ссылки, используемые для ознакомления

Ниже приведен код Java для отправки приглашения календаря с использованием API sendgrid.

public Response sendCalendarInvite(Show show, List<String> tos, String cc, String subject, String body,
      Calendar calendarEvent) {
    Response response = new Response();
    log.debug(
        "Sending Calendar Invite tos : {}, CC: {}, Subject : {}, Body : {}, calendarEvent : {}",
        tos, cc, subject, body, calendarEvent);
    if (!ApplicationConfig.isEmailEnabled()) {
      log.warn("Email not enabled. Check property [email.enabled] in application.properties");
      return response;
    }
    try {
      CalendarOutputter calendarOutputter = new CalendarOutputter();
      Writer wtr = new StringWriter();
      calendarOutputter.setValidating(true);
      calendarOutputter.output(calendarEvent, wtr);
      StringBuffer buffer = ((StringWriter) wtr).getBuffer();

      Mail mail = new Mail();
      mail.setFrom(
          new Email("[email protected]", "test name"));
      mail.setSubject(subject);

      Content content = new Content("text/calendar", String.valueOf(buffer).intern());
      mail.addContent(content);

      Personalization personalization = new Personalization();
      personalization.addHeader("charset", "utf-8");
      personalization.addHeader("method", calendarEvent.getMethod().getValue());
      for (String to : tos) {
        personalization.addTo(new Email(to));
      }
      mail.addPersonalization(personalization);

      Request request = new Request();
      request.setMethod(Method.POST);
      request.setEndpoint(END_POINT);
      request.setBody(mail.build());

      response = sg.api(request);
      log.debug("{}, {}, {}", response.getStatusCode(), response.getBody(), response.getHeaders());
    } catch (IOException ex) {
      log.error("Calendar invite Exception", ex);
      response.setBody(ex.getMessage());
      throw new CustomException(CustomError.INTERNAL_SERVER_ERROR,
          "Error occurred while sending Calendar invite");
    } finally {
      return response;
    }
  }
}

Приглашение календаря, которое я пытаюсь отправить

BEGIN:VCALENDAR
PRODID:-//XYZ//iCal4j 2.1//EN
VERSION:2.0
CALSCALE:GREGORIAN
METHOD:REQUEST
BEGIN:VTIMEZONE
TZID:Etc/GMT
TZURL:http://tzurl.org/zoneinfo/Etc/GMT
X-LIC-LOCATION:Etc/GMT
BEGIN:STANDARD
TZOFFSETFROM:+0000
TZOFFSETTO:+0000
TZNAME:GMT
DTSTART:16010101T000000
RDATE:16010101T000000
END:STANDARD
END:VTIMEZONE
BEGIN:VEVENT
DTSTAMP:20180820T091756Z
TZID:Etc/GMT
STATUS:CONFIRMED
ORGANIZER;CN=XXXX:mailto:[email protected]
UID:00803a42-e17d-41a9-b552-036f14c7799e
DTSTART:20180820T153000Z
DTEND:20180820T163000Z
LOCATION:Test Subject
SUMMARY:Test Summary
DESCRIPTION:Test Desc
LAST-MODIFIED:20180820T091756Z
SEQUENCE:0
TRANSP:OPAQUE
CLASS:PUBLIC
PRIORITY:5
ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP=
 TRUE;X-NUM-GUESTS=0;CN=XYZ:mailto:[email protected]
ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP=
 TRUE;X-NUM-GUESTS=0;CN=XYZ:mailto:[email protected]
END:VEVENT
END:VCALENDAR

person Prasanna    schedule 20.08.2018    source источник


Ответы (2)


У меня нет объяснения, почему раньше у вас что-то работало, но структура MIME электронной почты, которую вы используете, действительно находится в зачаточном состоянии. См. Многостраничное электронное письмо с текстом и календарем: Outlook не распознает ics для структуры MIME, которая работает для большинства клиентов.

person Arnaud Quillaud    schedule 21.08.2018

SendGrid больше не разрешает файлы вложений .ics, содержащие следующую строку:

CALSCALE:GREGORIAN
person niltoid    schedule 13.09.2019