2009-07-13 56 views
8

我試圖使用Java郵件庫發送iCal到Outlook,我已經閱讀了Question,並且我已經有一些示例代碼如何使用Java Mail發送iCal會議請求並接收回復

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使事情變得粗糙?

回答

18

所以,我解決了這個問題,這裏是我發現:

1 - 你必須更新到Java郵件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 = "[email protected]"; 
      String to = "[email protected]"; 
      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:[email protected]\n" + 
        "ORGANIZER:MAILTO:[email protected]\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 - 替換你的變量,你很好走!

1

沒有跡象表明你曾經將發件人地址設置爲實際地址,所以沒有地方可以回覆。

這可能不是問題,你生產代碼,但它看起來像一個問題在這裏...

+0

實際上我的生產代碼從和回覆到指定 – 2009-07-13 20:30:59

+0

除了message.setFrom(新網際地址(發件人));指定From,只有它在這個例子中是空的! – 2009-07-13 20:33:14

4

您可以使用ical4j library加上javamail來構建郵件正文(而不是使用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"))); 
相關問題