当前位置: 首页 > 知识库问答 >
问题:

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

祁修平
2023-03-14

首先,我将设置场景。我正在使用双周库创建一个VEvent和一个iCalendar。一切都很好(代码如下)。我可以成功地发送日历邀请到谷歌和适当的‘接受,拒绝,添加到日历’选项可用。

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

框架:

@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", "blank@blank.com");
    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("blank@blank.com");
    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("blank@blank.com");
    message.addRecipient(Message.RecipientType.TO, new InternetAddress("blank@blank.com"));
    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);

}
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:blank@blank.com
SUMMARY:hello
DTSTART:20161228T170000Z
DTEND:20161228T183000Z
DURATION:PT1H
UID:555****
ORGANIZER:mailto:blank@blank.com
LOCATION:Small
BEGIN:VALARM
ACTION:DISPLAY
TRIGGER;RELATED=START:PT15M
END:VALARM
END:VEVENT
END:VCALENDAR

共有1个答案

党权
2023-03-14

我取消了两周一次的图书馆...尽管我觉得解决方案很简单,我可能会重新考虑这个问题。对于在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);

}
 类似资料:
  • 我试图实现一种在outlook中发送html电子邮件(带链接)的方式,同时也发送相关的日历约会,这些约会直接进入用户的日历,而无需他们打开每个单独的。ics附件。 到目前为止,我已经实现了这一点的几个变体,但没有一个是完全需要的。 以HTML形式发送电子邮件,然后使用Exchange Web服务在用户日历中自动创建约会。(我后来被告知,我们将无法访问这些用户的密码,即使我们这样做了,他们也会经常更

  • 我正在尝试使用Java使用IMAP阅读电子邮件和SMTP回复它们来编写Gmail自动回复程序。我使用imap阅读电子邮件,当回复发送电子邮件的人时,我使用SMTP。我希望我发送的电子邮件具有回复格式,与您在gmail中单击回复时获得的格式相同,其中包括日期和发件人最初发送的消息。Javamail中有没有一种方法可以做到这一点?如果没有,最好的方法是什么? 问候!

  • 问题内容: 我正在使用。 使用发送电子邮件(通过)的最佳方法是什么? 问题答案: 有关使用Outlook的解决方案,请参见下面的TheoretiCAL答案。 否则,请使用python随附的smtplib。请注意,这将要求您的电子邮件帐户允许smtp,默认情况下不一定启用此功能。 编辑: 此示例使用保留域,如RFC2606中所述 为了使它真正与gmail配合使用,Doe先生需要进入gmail中的选项

  • 我的VBA代码(工作): 谢谢你在这方面的帮助,蒂姆

  • 我写了一个示例代码,在给定的日期范围内带来Outlook电子邮件帐户的一个文件夹的电子邮件。我正在使用Java邮件API 1.5和Java7。 为了获取消息,我在下面写了自1970年1月1日至2013年10月30日之前搜索电子邮件的代码- 此代码返回的消息长度为零,即自1970年1月1日至2013年10月30日之前未找到任何消息,但我的文件夹包含204封介于此范围的电子邮件。 令人惊讶的是,相同的

  • Im正在尝试分析outlook中的.msg文件以获取MIME内容,以便将该文件另存为EML。我正在使用Exchange Web服务在EML通过Exchange服务器上的日志收件箱时保存EML,但有些电子邮件需要在事后通过outlook add in保存,不过将它们变成EML/MIME格式似乎比较困难。 任何洞察力都是非常有用的。