2009-07-13 38 views
8

Tôi đang cố gắng gửi iCal đến một triển vọng, sử dụng Thư viện Thư viện Java, tôi đã đọc Question và tôi đã có một số mã mẫuCách gửi yêu cầu họp iCal bằng cách sử dụng Java Mail và nhận được phản hồi

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”) ; 
    } 
} } 

Nhưng nó được gửi dưới dạng đính kèm đối với triển vọng năm 2007 và triển vọng năm 2003, và thậm chí nếu tôi nhấp vào tập tin đính kèm để xem và chấp nhận, tôi không nhận được trả lời, đó là mục đích của ứng dụng có một chức năng tương tự như triển vọng.

Có bất kỳ thủ tục nào tôi cần biết hay là ID lời mời khiến mọi thứ trở nên khó khăn?

Trả lời

18

Vì vậy, tôi đã giải quyết được vấn đề, và đây là những gì tôi thấy:

1 - bạn phải cập nhật để Java mail API 1.4.2 để làm cho mọi thứ hoạt động tốt

2 - Viết văn bản/dương lịch là một phần của thông điệp của bạn như sau:

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 - Thay thế biến của bạn, và bạn tốt để đi!

+0

Hi Amr, tôi đang làm việc với cùng một loại dự án cho học tập của mình, tôi cần phải nâng cao cảnh báo và phần còn lại của cuộc họp, tôi đang sử dụng java để phát triển tất cả thiết kế của mình là tối đa đánh dấu triển vọng là khó khăn để làm như vậy bạn có thể xin vui lòng giúp tôi ra trong việc này! – 09Q71AO534

+0

Hi @ user2561626 Nếu bạn sử dụng mã ở đây bạn sẽ có thể nâng cao cảnh báo và nhắc nhở chỉ là chức năng cho Outlook chính nó, do đó, không có kiểm soát nó. –

+0

tôi đã tải xuống ical4j, tôi nên thay đổi bất kỳ phương pháp nào trong đó, để làm cho mã này hoạt động ở đây, để tăng các cảnh báo và phần còn lại. – 09Q71AO534

1

Không có dấu hiệu cho thấy bạn đã từng đặt địa chỉ từ địa chỉ thực tế, vì vậy không có nơi nào cho thư trả lời đến.

Điều đó có thể không phải là vấn đề trong sản xuất mã của bạn, nhưng có vẻ như một vấn đề ở đây ...

+0

thực sự mã sản xuất của tôi từ và reply-to được quy định –

+0

ngoài message.setFrom (mới InternetAddress (người gửi)); chỉ định từ, chỉ trống trong ví dụ này! –

4

Bạn có thể sử dụng ical4j library ngoài javamail để tạo nội dung thư (thay vì sử dụng StringBuffer).

Ví dụ:

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"))); 
Các vấn đề liên quan