Outlook电子邮件和ICS格式 - 奇怪的行为

问题描述:

首先,我将设置场景。我正在使用双周库创建一个VEvent和一个ICalendar。一切工作正常(下面的代码)。我可以成功向Google发送日历邀请,并提供相应的“接受,拒绝,添加到日历”选项。Outlook电子邮件和ICS格式 - 奇怪的行为

当我向Outlook发送相同的邮件时,我没有收到正确的邀请。邮件的格式要求收件人发送邀请 - 不会被邀请,也不会添加到他/她的日历中。

框架:

的Java - JavaMailSender - 弹簧引导 - 双周

的代码运行。问题在于Outlook处理日历邀请的区别。

这里是Java代码...

@Service 
public class CalendarEvent { 

private JavaMailSender javaMailSender; 

@Autowired 
public CalendarEvent(JavaMailSender javaMailSender) { 
    this.javaMailSender = javaMailSender; 
} 

public void createCal() throws MessagingException, ParseException, IOException { 

    ICalendar ical = new ICalendar(); 

    VEvent event = new VEvent(); 

    Attendee attendee = new Attendee("Juniper", "[email protected]"); 
    attendee.setRsvp(true); 
    attendee.setRole(Role.ATTENDEE); 
    attendee.setParticipationStatus(ParticipationStatus.NEEDS_ACTION); 
    attendee.setParticipationLevel(ParticipationLevel.REQUIRED); 

    event.addAttendee(attendee); 

    event.setSummary("hello"); 

    DateTime dt = new DateTime(2016, 12, 28, 12, 0); 
    DateTime et = new DateTime(2016, 12, 28, 13, 30); 
    Date starts = (Date) dt.toDate(); 
    Date ends = (Date) et.toDate(); 

    DateStart thisStart = new DateStart(starts, true); 
    DateEnd dateEnd = new DateEnd(ends, true); 

    event.setDateStart(thisStart); 
    event.setDateEnd(dateEnd); 

    Duration reminder = new Duration.Builder().minutes(15).build(); 
    Trigger trigger = new Trigger(reminder, Related.START); 
    Action action = new Action("DISPLAY"); 
    VAlarm valarm = new VAlarm(action, trigger); 
    event.addAlarm(valarm); 

    Duration duration = new Duration.Builder().hours(1).build(); 
    event.setDuration(duration); 

    event.setUid("555xxx"); 
    event.setOrganizer("[email protected]"); 
    event.setLocation("Small"); 

    ical.addEvent(event); 

    String str = Biweekly.write(ical).go(); 

    MimeMessage message = javaMailSender.createMimeMessage(); 
    message.addHeaderLine("charset=UTF-8"); 
    message.addHeaderLine("component=VEVENT"); 
    message.addHeaderLine("method=REQUEST"); 

    message.setFrom("[email protected]"); 
    message.addRecipient(Message.RecipientType.TO, new InternetAddress("[email protected]")); 
    message.setSubject("You're Invited to a Meeting"); 

    // Create the message part 
    BodyPart messageBodyPart = new MimeBodyPart(); 

    // Fill the message 
    messageBodyPart.setHeader("Content-Class", "urn:content-classes:calendarmessage"); 
    messageBodyPart.setHeader("Content-ID", "calendar_message"); 
    messageBodyPart.setDataHandler(new DataHandler(new ByteArrayDataSource(str, "text/calendar")));// very important 


    Multipart multipart = new MimeMultipart(); 


    multipart.addBodyPart(messageBodyPart); 


    message.setContent(multipart); 

    javaMailSender.send(message); 

} 

}

这里是ICS ...

BEGIN:VCALENDAR 
VERSION:2.0 
PRODID:-//Michael Angstadt//biweekly 0.6.0//EN BEGIN:VEVENT 
DTSTAMP:20161223T203840Z ATTENDEE;RSVP=TRUE;ROLE=REQ- 
PARTICIPANT;PARTSTAT=NEEDS-ACTION;CN=Juniper:mail 
to:[email protected] 
SUMMARY:hello 
DTSTART:20161228T170000Z 
DTEND:20161228T183000Z 
DURATION:PT1H 
UID:555**** 
ORGANIZER:mailto:[email protected] 
LOCATION:Small 
BEGIN:VALARM 
ACTION:DISPLAY 
TRIGGER;RELATED=START:PT15M 
END:VALARM 
END:VEVENT 
END:VCALENDAR 

这里是打开Outlook电子邮件(注意它是如何构成的信息)...

enter image description here

这里是开启Gmail电子邮件...

enter image description here

我发现的文件是有限的,希望有人可以有/遇到/ ecountering相同问题。谢谢阅读。

+1

是你的展望地址与ics文件中的组织者相同吗?这可能是一个问题 – adekcz

+0

你是对的,那会造成问题。但是,这不是我所面临的问题。我回到了创建.ics的手动方式,并发布了下面的代码。适用于Gmail和Outlook(我会想象其他人)。 – ClickerTweeker

我放弃了双周图书馆...虽然我觉得解决方案很简单,我可能会重新讨论这个问题。为了纪录,双周刊是一个伟大的图书馆,帮助在Java内部创建VEVENTS和VCALENDARS。

我回过头来手动制作ics。这种格式功能齐全,适用于Gmail和Outlook。

StringBuffer sb = new StringBuffer(); 

    StringBuffer buffer = sb.append(
      "BEGIN:VCALENDAR\n" 
      + "PRODID:-//Microsoft Corporation//Outlook 9.0 MIMEDIR//EN\n" 
      + "VERSION:2.0\n" 
      + "METHOD:REQUEST\n" 
      + "BEGIN:VTIMEZONE\n" 
      + "TZID:America/New_York\n" 
      + "X-LIC-LOCATION:America/New_York\n" 
      + "BEGIN:STANDARD\n" 
      + "DTSTART:20071104T020000\n" 
      + "TZOFFSETFROM:-0400\n" 
      + "TZOFFSETTO:-0500\n" 
      + "TZNAME:EST\n" 
      + "END:STANDARD\n" 
      + "BEGIN:DAYLIGHT\n" 
      + "DTSTART:20070311T020000\n" 
      + "TZOFFSETFROM:-0500\n" 
      + "TZOFFSETTO:-0400\n" 
      + "TZNAME:EDT\n" 
      + "END:DAYLIGHT\n" 
      + "END:VTIMEZONE\n" 
      + "BEGIN:VEVENT\n" 
      + "ATTENDEE;ROLE=REQ-PARTICIPANT;RSVP=TRUE:MAILTO:" + email + "\n" 
      + "ORGANIZER:MAILTO:hockeyonicethricewastoldcold?.com\n" 
      + "DTSTART;TZID=America/New_York:" + invite.getDateStart() + "\n" 
      + "DTEND;TZID=America/New_York:" + invite.getDateEnd() + "\n" 
      + "LOCATION:Conference room\n" 
      + "TRANSP:OPAQUE\n" 
      + "SEQUENCE:0\n" 
      + "UID:" + invite.getUID() + "\n" 
      + "DTSTAMP:20051206T120102Z\n" 
      + "CATEGORIES:Meeting\n" 
      + "DESCRIPTION:" + invite.getDescription() + "\n" 
      + "SUMMARY:" + invite.getDescription() + "\n" 
      + "PRIORITY:5\n" 
      + "CLASS:PUBLIC\n" 
      + "BEGIN:VALARM\n" 
      + "TRIGGER:PT1440M\n" 
      + "ACTION:DISPLAY\n" 
      + "DESCRIPTION:Reminder\n" 
      + "END:VALARM\n" 
      + "END:VEVENT\n" 
      + "END:VCALENDAR"); 

    MimeMessage message = javaMailSender.createMimeMessage(); 
    message.addHeaderLine("charset=UTF-8"); 
    message.addHeaderLine("component=VEVENT"); 
    message.addHeaderLine("method=REQUEST"); 

    message.setFrom(invite.getUserID()); 
    message.addRecipient(Message.RecipientType.TO, new InternetAddress(email)); 
    message.setSubject(invite.getSubject()); 

    BodyPart messageBodyPart = new MimeBodyPart(); 

    messageBodyPart.setHeader("Content-Class", "urn:content-classes:calendarmessage"); 
    messageBodyPart.setHeader("Content-ID", "calendar_message"); 
    messageBodyPart.setDataHandler(new DataHandler(new ByteArrayDataSource(buffer.toString(), "text/calendar"))); 

    Multipart multipart = new MimeMultipart(); 

    multipart.addBodyPart(messageBodyPart); 

    message.setContent(multipart); 

    javaMailSender.send(message); 

} 

我有同样的问题。添加ical.setMethod("REQUEST");为我解决了它。