【问题标题】:Previously working Calendar Invite has stopped working for outlook email client but working for Gmail client以前工作的日历邀请已停止为 Outlook 电子邮件客户端工作,但为 Gmail 客户端工作
【发布时间】:2019-01-26 06:15:26
【问题描述】:

我正在使用 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

【问题讨论】:

    标签: java outlook sendgrid ical4j outlook-calendar


    【解决方案1】:

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

    CALSCALE:GREGORIAN
    

    【讨论】:

      【解决方案2】:

      我无法解释为什么过去对您有用,但您使用的电子邮件 MIME 结构确实很简陋。请参阅Multipart email with text and calendar: Outlook doesn't recognize ics 了解适用于大多数客户端的 MIME 结构。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-04-24
        • 1970-01-01
        • 2017-07-04
        • 1970-01-01
        • 2016-08-14
        • 1970-01-01
        • 2011-10-24
        • 2018-07-15
        相关资源
        最近更新 更多