如何使用 Java Mail 发送 iCal 会议请求并接收响应

新手上路,请多包涵

我正在尝试使用 Java Mail Library 将 iCal 发送到 outlook,我已经阅读了 问题,并且我已经有了一些示例代码

public class SendMeetingRequest {

String host = "" ;
String port = "" ;
String sender = "" ;

public static SimpleDateFormat dateFormat = new SimpleDateFormat( "yyyyMMdd'T'HHmm'00'" ) ;
public static SimpleDateFormat dateParser = new SimpleDateFormat( "dd-MM-yyyy HH:mm" ) ;

public static void main(String[] args) throws Exception {
    SendMeetingRequest sender = new SendMeetingRequest() ;

    sender.sendInvitation( “LogicaCMG Inschrijf Site”
                         , new String[] { “robert<dot>willems<dot>of<dot>brilman<at>logicacmg<dot>com”
                                        }
                         , “Outlook Meeting Request Using JavaMail”
                         , dateParser.parse( “28-08-2006 18:00″ )
                         , dateParser.parse( “28-08-2006 21:00″ )
                         , “LIS-42″
                         , “Bar op scheveningen”
                         , “<font color=\”Red\”>Aanwezigheid verplicht!</font><br>We gaan lekker een biertje drinken met z’n allen.”
                         ) ;
}

void sendInvitation( String organizer
                   , String[] to
                   , String subject
                   , Date start
                   , Date end
                   , String invitationId
                   , String location
                   , String description
                   ) throws Exception {

    try {
        Properties prop = new Properties();
        prop.put(”mail.smtp.port”, port );
        prop.put(”mail.smtp.host”, host );

        Session session = Session.getDefaultInstance(prop);
        session.setDebug(true);

        // Define message
        MimeMessage message = new MimeMessage(session);
        message.setFrom(new InternetAddress(sender));

        // Set TO
        if( to != null && ( to.length > 0 ) ) {
            InternetAddress[] address = new InternetAddress[ to.length ] ;

            for( int i = 0; i < to.length; i++ ) {
                address[ i ] = new InternetAddress( to[ i ] ) ;
            }

            message.setRecipients( Message.RecipientType.TO, address ) ;
        }

        // Set subject
        message.setSubject(subject);

        // Create iCalendar message
        StringBuffer messageText = new StringBuffer();
        messageText.append("BEGIN:VCALENDAR\n" +
                           "PRODID:-//Microsoft Corporation//Outlook 9.0 MIMEDIR//EN\n" +
                           "VERSION:2.0\n" +
                           "METHOD:REQUEST\n" +
                               "BEGIN:VEVENT\n" +
                               "ORGANIZER:MAILTO:" ) ;
        messageText.append( organizer ) ;
        messageText.append( "\n" +
                            "DTSTART:");
        messageText.append( dateFormat.format( start ) ) ;
        messageText.append( "\n" +
                            "DTEND:" ) ;
        messageText.append( dateFormat.format( end ) ) ;
        messageText.append( "\n" +
                            "LOCATION:" ) ;
        messageText.append( location ) ;
        messageText.append( "\n" +
                             "UID:" ) ;
        messageText.append( invitationId ) ;
        messageText.append( "\n" +
                            "DTSTAMP:" ) ;
        messageText.append( dateFormat.format( new java.util.Date() ) ) ;
        messageText.append( "\n" +
                            "DESCRIPTION;ALTREP=\"CID:<eventDescriptionHTML>\”" ) ;
        messageText.append( “\n” +
                                    ”BEGIN:VALARM\n” +
                                    ”TRIGGER:-PT15M\n” +
                                    ”ACTION:DISPLAY\n” +
                                    ”DESCRIPTION:Reminder\n” +
                                    ”END:VALARM\n” +
                               ”END:VEVENT\n” +
                           ”END:VCALENDAR”
                           ) ;

        Multipart mp = new MimeMultipart();

        MimeBodyPart meetingPart = new MimeBodyPart() ;
        meetingPart.setDataHandler( new DataHandler( new StringDataSource( messageText.toString(), “text/calendar”, “meetingRequest” ) ) ) ;
        mp.addBodyPart( meetingPart ) ;

        MimeBodyPart descriptionPart = new MimeBodyPart() ;
        descriptionPart.setDataHandler( new DataHandler( new StringDataSource( description, “text/html”, “eventDescription” ) ) ) ;
        descriptionPart.setContentID( “<eventDescriptionHTML>” ) ;
        mp.addBodyPart( descriptionPart ) ;

        message.setContent( mp ) ;

        // send message
        Transport.send(message);

    } catch (MessagingException me) {
        me.printStackTrace();

    } catch (Exception ex) {
        ex.printStackTrace();

    }
}

private static class StringDataSource implements DataSource {
    private String contents ;
    private String mimetype ;
    private String name ;

    public StringDataSource( String contents
                           , String mimetype
                           , String name
                           ) {
        this.contents = contents ;
        this.mimetype = mimetype ;
        this.name = name ;
    }

    public String getContentType() {
        return( mimetype ) ;
    }

    public String getName() {
        return( name ) ;
    }

    public InputStream getInputStream() {
        return( new StringBufferInputStream( contents ) ) ;
    }

    public OutputStream getOutputStream() {
        throw new IllegalAccessError( “This datasource cannot be written to” ) ;
    }
} }

但它作为 outlook 2007 和 outlook 2003 的附件发送,即使我单击附件查看并接受,我也没有收到答复,这是该应用程序的目的是具有与 outlook 类似的功能。

是否有任何我需要知道的程序,或者是邀请 ID 使事情变得艰难?

原文由 Amr Gawish 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 505
2 个回答

所以我解决了这个问题,这是我发现的:

1 - 您必须更新到 Java Mail API 1.4.2 才能使一切正常

2 - 编写消息的文本/日历部分,如下所示:

 package com.xx.xx;

import java.util.Properties;

import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.util.ByteArrayDataSource;

public class Email {

    public Email() {
    }

    /*
     * @param args
     */
    public static void main(String[] args) {
        try {
            Email email = new Email();
            email.send();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void send() throws Exception {

        try {
            String from = "xx@xx.com";
            String to = "xx@xx.com";
            Properties prop = new Properties();
            prop.put("mail.smtp.host", "mailhost");

            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");

            message.setFrom(new InternetAddress(from));
            message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
            message.setSubject("Outlook Meeting Request Using JavaMail");

            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:VEVENT\n" +
                    "ATTENDEE;ROLE=REQ-PARTICIPANT;RSVP=TRUE:MAILTO:xx@xx.com\n" +
                    "ORGANIZER:MAILTO:xx@xx.com\n" +
                    "DTSTART:20051208T053000Z\n" +
                    "DTEND:20051208T060000Z\n" +
                    "LOCATION:Conference room\n" +
                    "TRANSP:OPAQUE\n" +
                    "SEQUENCE:0\n" +
                    "UID:040000008200E00074C5B7101A82E00800000000002FF466CE3AC5010000000000000000100\n" +
                    " 000004377FE5C37984842BF9440448399EB02\n" +
                    "DTSTAMP:20051206T120102Z\n" +
                    "CATEGORIES:Meeting\n" +
                    "DESCRIPTION:This the description of the meeting.\n\n" +
                    "SUMMARY:Test meeting request\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");

            // 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(buffer.toString(), "text/calendar")));// very important

            // Create a Multipart
            Multipart multipart = new MimeMultipart();

            // Add part one
            multipart.addBodyPart(messageBodyPart);

            // Put parts in message
            message.setContent(multipart);

            // send message
            Transport.send(message);
        } catch (MessagingException me) {
            me.printStackTrace();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}

3 - 替换您的变量,一切顺利!

原文由 Amr Gawish 发布,翻译遵循 CC BY-SA 3.0 许可协议

除了 javamail 之外,您还可以使用 ical4j 库 来构建邮件正文(而不是使用 StringBuffer )。

例子:

 Calendar calendar = new Calendar();
PropertyList calendarProperties = calendar.getProperties();
calendarProperties.add(Version.VERSION_2_0);
calendarProperties.add(Method.REQUEST);
// other properties ...

VEvent vEvent = new VEvent(/*startDate, endDate*/);
PropertyList vEventProperties = vEvent.getProperties();
vEventProperties.add(Priority.MEDIUM);
vEventProperties.add(Clazz.PUBLIC);
// other properties ...

calendar.getComponents().add(vEvent);

messageBodyPart.setDataHandler(new DataHandler(new ByteArrayDataSource(calendar.toString(), "text/calendar")));

原文由 herau 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题