Я использую Sendgrid для отправки электронных писем и библиотеку Ical4j для создания приглашения в календаре. Приведенный ниже код работал нормально несколько месяцев назад, и все отправленные приглашения календаря также отображали все необходимые вещи, такие как; Кнопка «Принять/Отклонить», даты начала и окончания и т. д. после получения через любой почтовый клиент (в основном Outlook и Gmail). Но теперь я могу отправлять приглашения календаря через этот код, но как только он будет получен через почтовый клиент Outlook (он отлично работает через Gmail); он отображается как вложение (.ics) вместо всех необходимых элементов управления приглашением календаря.
Я пробовал несколько подходов, но ни один из них не работал.
Ссылки, используемые для ознакомления
- Отправить электронное письмо как приглашение/назначение календаря в SendGrid C# а>
- Приглашение календаря получено в виде файла ICS в Outlook - Laravel< /а>
- https://github.com/ical4j/ical4j/issues/236
Ниже приведен код 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