1

我正在使用 Sendgrid 发送电子邮件和 Ical4j 库来创建日历邀请。下面提到的代码几个月前运行良好,所有发送的日历邀请也显示了所有必需的东西,例如;接受/拒绝按钮、开始和结束日期等,一旦通过任何电子邮件客户端(主要是 Outlook 和 Gmail)接收。但是现在我可以通过此代码发送日历邀请,但是一旦通过 Outlook 电子邮件客户端收到它(它在 Gmail 上运行良好);它显示为 (.ics) 附件,而不是所有必需的日历邀请控件。

我确实尝试了几种方法,但都没有奏效。

用于参考的链接

下面是使用 sendgrid api 发送日历邀请的 java 代码

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("testfrom@test.com", "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:donotreply@xxxx.com
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:xxxx.xxxx@yyyy.com
ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP=
 TRUE;X-NUM-GUESTS=0;CN=XYZ:mailto:xxxxxxxx@gmail.com
END:VEVENT
END:VCALENDAR
4

2 回答 2

0

SendGrid 似乎不再允许包含以下行的 .ics 附件文件:

CALSCALE:GREGORIAN
于 2019-09-13T21:17:14.357 回答
0

我无法解释为什么过去对您有用,但您使用的电子邮件 MIME 结构确实很简陋。请参阅包含文本和日历的多部分电子邮件:Outlook 无法识别适用于大多数客户端的 MIME 结构的 ics。

于 2018-08-21T08:02:19.497 回答