簡體   English   中英

如何通過java發送日歷邀請,這樣我們就不需要打開.ics文件了

[英]How to send a calendar invite through java , so that we don't need to open .ics file

如何通過java發送日歷邀請,這樣我們就不用打開.ics文件添加到日歷了。 當我們向 outlook 發送郵件時,它應該作為直接會議邀請附加,我不想打開 .ics 文件並明確添加到日歷中。 是否可以在 java 中做到這一點。 即使我們使用 ICal4J,這些.ics 文件也不會自動添加到日歷中。

public void send(Appointment appointment, String host) throws Exception {

        try {

            Properties prop = new Properties();
            prop.put("mail.smtp.host", host);
            prop.put("mail.smtp.port", "25");
            prop.put("mail.smtp.auth", "false");
            prop.put("mail.smtp.starttls.enable", "false");

            Session session = Session.getDefaultInstance(prop, null);
            // Define message
            MimeMessage message = new MimeMessage(session);

            String toMa = StringUtils.getCommaDelimitedStringfromStringList(appointment.getTo());
            String ccMa = null;
            if(Objects.nonNull(appointment.getCc())) {
             ccMa = StringUtils.getCommaDelimitedStringfromStringList(appointment.getCc());
            }

            message.setFrom(new InternetAddress(appointment.getFrom()));
            message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(toMa));
            message.setRecipients(Message.RecipientType.CC, InternetAddress.parse(ccMa));
            message.setSubject(appointment.getSubject());
            message.setHeader("Content-class", "urn:content-classes:calendarmessage");

            String content = getBufferString(appointment);
            // Create the message part
            BodyPart messageBodyPart = new MimeBodyPart();

            // Fill the message
            messageBodyPart.setHeader("Content-class", "urn:content-  classes:calendarmessage");
            messageBodyPart.setContent(appointment.getContent(),"mailBody");
            messageBodyPart.setDataHandler(new DataHandler(new ByteArrayDataSource(content, "text/calendar; charset=utf-8; method=REQUEST'")));// very
                                                                                                                // important
            // new
            MimeBodyPart bc = new MimeBodyPart();
            bc.setContent(appointment.getContent(),"text/html");
            BodyPart messageBody = bc;
            Multipart multipart = new MimeMultipart();
            multipart.addBodyPart(messageBody);
            multipart.addBodyPart(messageBodyPart);
            message.setContent(multipart);
            // send message
            Transport.send(message);
        }
        catch (Exception ex) {
            log.error("exception", ex);
        }
        
    }


private String getBufferString(Appointment appointment) {
        
        StringBuffer sb = new StringBuffer();

        StringBuffer buffer = sb.append("BEGIN:VCALENDAR\n"+
        "PRODID:-Asset View 2.0\n"+
        "VERSION:2.0\n" +
        "METHOD:REQUEST\n" +
        "BEGIN:VEVENT\n" +
        "DTSTAMP:"+extracted(FORMATED_DATE_TIME, 0, null)+"\n" +
        "LOCATION:"+appointment.getLocation()+"\n" +
        extractDstartDend(appointment)+
        createRecurring(appointment)+"\n"+
        "UID:"+UUID.randomUUID().toString()+"\n" +
        "DESCRIPTION:"+appointment.getContent().substring(3, appointment.getContent().length() - 4)+"\n" +
        "SUMMARY:"+appointment.getSubject()+"\n" +
        "ORGANIZER:MAILTO:"+appointment.getFrom()+"\n" +
        "X-MS-OLK-FORCEINSPECTOROPEN:TRUE\n"+
        "X-WR-RELCALID:{0000002E-9CDF-9CE8-AD4C-66FC0A5A25F7}\n"+
        String.format("ATTENDEE;CN=%s;RSVP=TRUE:mailto:%s",
                appointment.getTo().stream().findFirst().orElse(null),
                appointment.getTo().stream().findFirst().orElse(null))+"\n"+        
        "X-MICROSOFT-CDO-BUSYSTATUS:FREE"+"\n"+
        "BEGIN:VALARM\n" +
        "ACTION:DISPLAY\n" +
        "DESCRIPTION:Reminder\n" +
        "TRIGGER:-P1D\n" +
        "END:VALARM\n" +
        "END:VEVENT\n" +
        "END:VCALENDAR");
        
        return buffer.toString();
    }

我在我的代碼中找到了缺失的部分並刪除了不必要的代碼,這是最重要的。 方法=請求

    public void send(Appointment appointment, String host) throws Exception {

        try {

            Properties prop = new Properties();
            prop.put("mail.smtp.host", host);

            Session session = Session.getDefaultInstance(prop, null);
            // Define message
            MimeMessage message = new MimeMessage(session);
            message.addHeaderLine("method=REQUEST");
            message.addHeaderLine("charset=UTF-8");
            message.addHeaderLine("component=VEVENT");

            String toMa = StringUtils.getCommaDelimitedStringfromStringList(appointment.getTo());
            String ccMa = null;
            if (Objects.nonNull(appointment.getCc())) {
                ccMa = StringUtils.getCommaDelimitedStringfromStringList(appointment.getCc());
                message.setRecipients(Message.RecipientType.CC, InternetAddress.parse(ccMa));
            }

            message.setFrom(new InternetAddress(appointment.getFrom()));
            message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(toMa));
            
            message.setSubject(appointment.getSubject());
            message.setHeader("Content-class", "urn:content-classes:calendarmessage");

            String content = getBufferString(appointment);
            // 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(content, "text/calendar;method=REQUEST")));// very
                                                                                                                // important
            // new
            MimeBodyPart bc = new MimeBodyPart();
            bc.setContent(appointment.getContent(), "text/html");
            Multipart multipart = new MimeMultipart();
            multipart.addBodyPart(bc);
            multipart.addBodyPart(messageBodyPart);
            message.setContent(multipart);
            // send message
            Transport.send(message);
        }
        catch (Exception ex) {
            log.error("exception", ex);
        }

    }

    private String getBufferString(Appointment appointment) {

        StringBuilder sb = new StringBuilder();

        StringBuilder buffer = sb.append(
                "BEGIN:VCALENDAR\n" 
                + "PRODID: Asset View 2.0\n" 
                + "VERSION:2.0\n"
                + "METHOD:REQUEST\n" 
                + "BEGIN:VEVENT\n" 
                + "DTSTAMP:" + extracted(FORMATED_DATE_TIME, 0, null) + "\n"
                + "LOCATION:" + appointment.getLocation() + "\n" 
                + extractDstartDend(appointment)
                + createRecurring(appointment) 
                + "UID:" + UUID.randomUUID().toString() + "\n" 
                + "DESCRIPTION:"+ appointment.getContent() +"\n"
                + "X-ALT-DESC;FMTTYPE=text/html:"+ appointment.getContent() + "\n" 
                + "SUMMARY:"+ appointment.getSubject() + "\n"
                + "ORGANIZER:MAILTO:" + appointment.getFrom() + "\n"
                + String.format("ATTENDEE;CN=%s;RSVP=TRUE:mailto:%s",
                        appointment.getTo().stream().findFirst().orElse(null),
                        appointment.getTo().stream().findFirst().orElse(null))+ "\n" 
                + "X-MICROSOFT-CDO-BUSYSTATUS:FREE" + "\n"
                + "BEGIN:VALARM\n"
                + "ACTION:DISPLAY\n"
                + "DESCRIPTION:Reminder\n"
                + "TRIGGER:-P1D\n"
                + "END:VALARM\n" 
                + "END:VEVENT\n" 
                +"END:VCALENDAR");

        return buffer.toString();
    }

    private String createRecurring(Appointment appointment) {

        String res = "";
        if (appointment.getRecurringFrequency() != null && appointment.getRecurringFrequency().intValue() != 0) {

            String frequency = getFrequencyString(appointment.getRecurringFrequency().intValue());

            if (appointment.getRecurringEndDate() == null) {
                res = "RRULE:FREQ=" + frequency + "\n";
            }

            else {
                String date = extracted(FORMATED_DATE_TIME, 0, appointment.getRecurringEndDate());
                res = "RRULE:FREQ=" + frequency + ";UNTIL=" + date + "\n";
            }
        }

        return res;
    }

    private String extractDstartDend(Appointment appointment) {
        StringBuilder res = new StringBuilder();
        if (appointment.isIsAllDayEvent()) {

            res.append("DTSTART:" + extracted(FORMATED_DATE, 0, appointment.getStartDate()) + "\n");
            res.append("DTEND:" + extracted(FORMATED_DATE, 1, appointment.getStartDate()) + "\n");

        }
        else {
            res.append("DTSTART:" + extracted(FORMATED_DATE_TIME, 0, appointment.getStartDate()) + "\n");
            res.append("DTEND:" + extracted(FORMATED_DATE_TIME, 0, appointment.getEndDate()) + "\n");
        }
        return res.toString();
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM