2013-08-17 41 views
0

我试图使用iCalendar和Java邮件API及其工作正常发送关于Lotus Notes的会议邀请,除了在邮件内容中的附件即将到来,甚至打开。我检查了我的代码,并可以确认代码中没有包含这样的附件。有人能解释我为什么会发生这种情况吗?这里是我的一段代码:附件在Lotus Notes上发送会议邀请时即将到来

public void postMail(String meetingId, List<String> ToList, 
     List<String> existingAttendeeList, String subject, String message, 
     Date startDate, Date endDate, String from, boolean isMeetingInvite) 
     throws UtilException { 
    String[] recipients = null; 
    if ((ToList == null || ToList.size() == 0)) { 

     log.error("Both recipients and recipientCC are null"); 

     throw new UtilException("Both recipients and recipientCC are null"); 
    } else { 
     recipients = new String[ToList.size()]; 
     recipients = (String[]) ToList.toArray(recipients); 
    } 

    boolean debug = false; 


     Properties props = new Properties(); 
     props.put("mail.smtp.host", SMTP_HOST_NAME); 
     props.put("mail.smtp.auth", "false"); 
     Authenticator auth = new SMTPAuthenticator(); 
     Session session = Session.getInstance(props, auth); 
     session.setDebug(debug); 
     MimeMessage mimeMessage = new MimeMessage(session); 
     InternetAddress addressFrom = new InternetAddress(from); 
     mimeMessage.setFrom(addressFrom); 
     if (!(recipients == null)) { 
      InternetAddress[] addressTo = new InternetAddress[recipients.length]; 
      for (int i = 0; i < recipients.length; i++) { 
       addressTo[i] = new InternetAddress(recipients[i]); 

      } 
      mimeMessage.setRecipients(Message.RecipientType.TO, addressTo); 
     } 
     Multipart multipart = new MimeMultipart(); 
     MimeBodyPart iCalAttachment = new MimeBodyPart(); 
     TimeZone tz = TimeZone.getDefault(); 
     byte[] invite = createICalInvitation(meetingId, subject, message, 
       startDate, endDate, tz, from, isMeetingInvite, 
       existingAttendeeList); 
     iCalAttachment.setDataHandler(new DataHandler(
       new ByteArrayDataSource(new ByteArrayInputStream(invite), 
         "text/calendar;method=REQUEST;charset=\"UTF-8\""))); 
     multipart.addBodyPart(iCalAttachment); 
     mimeMessage.setContent(multipart); 
     Transport.send(mimeMessage); 
    } throw new UtilException(e.toString()); 
    } 

} 

private byte[] createICalInvitation(String _meetingID, String _subject, 
     String _content, Date _start, Date _end, TimeZone _tz, 
     String mailToAddress, boolean isMeetingInvite, 
     List<String> existingAttendeeList) throws Exception { 
    CompatibilityHints.setHintEnabled(
      CompatibilityHints.KEY_OUTLOOK_COMPATIBILITY, true); 
    DateTime start = new DateTime(_start); 
    DateTime end = new DateTime(_end); 
    VEvent vEvent = new VEvent(start, end, _subject); 
    vEvent.getProperties().add(new Uid(_meetingID)); 
    vEvent.getProperties().add(new Description(_content)); 
    vEvent.getProperties().add(new XProperty("X-LOTUS-BROADCAST", "false")); 
    Attendee dev = new Attendee(URI.create("mailto:" + mailToAddress)); 
    vEvent.getProperties().add(dev); 
    Organizer organizer = new Organizer(URI.create(mailToAddress)); 
    vEvent.getProperties().add(organizer); 
    if (existingAttendeeList != null && existingAttendeeList.size() != 0) { 
     for (String index : existingAttendeeList) { 
      Attendee existingAttendee = new Attendee(index); 
      vEvent.getProperties().add(existingAttendee); 
     } 
    } 
    net.fortuna.ical4j.model.Calendar cal = new net.fortuna.ical4j.model.Calendar(); 
    cal.getProperties() 
      .add(new ProdId(
        "//Lotus Development Corporation//NONSGML Notes 8.5.2//EN_C")); 
    cal.getProperties().add(
      net.fortuna.ical4j.model.property.Version.VERSION_2_0); 
    cal.getProperties().add(CalScale.GREGORIAN); 
    if (isMeetingInvite) { 
     cal.getProperties().add(
       net.fortuna.ical4j.model.property.Method.REQUEST); 
    } else { 
     cal.getProperties().add(
       net.fortuna.ical4j.model.property.Method.CANCEL); 
    } 
    TimeZoneRegistry registry = TimeZoneRegistryFactory.getInstance() 
      .createRegistry(); 
    VTimeZone tz = registry.getTimeZone(_tz.getID()).getVTimeZone(); 
    cal.getComponents().add(tz); 
    cal.getComponents().add(vEvent); 
    ByteArrayOutputStream bout = new ByteArrayOutputStream(); 
    CalendarOutputter outputter = new CalendarOutputter(); 
    outputter.output(cal, bout); 
    return bout.toByteArray(); 
} 

下面是主要的方法从我运行这段代码:

public static void main(String[] args) { 
    List a = new ArrayList(); 
    a.add("[email protected]"); 
    Calendar c = Calendar.getInstance(); 
    c.roll(Calendar.DATE, 5); 
    Date d1 = c.getTime(); 
    c.add(Calendar.HOUR, 1); 
    Date d2 = c.getTime(); 
    SendMail s = new SendMail(); 
    String id = "" + System.currentTimeMillis(); 
    try { 
     s.postMail("212", a, null, "Hel22lo", "hel22lo", d1, d2, 
       "[email protected]", true); 

} 

回答

1

你发送一个多部分消息只有一个身体部位。大多数邮件阅读器都会假设第一个文本(纯文本或html)正文是主体,其余都是附件。你的信息没有主要的正文部分,所以邮件阅读器很可能假设你发送的正文部分是附件。

+0

是的,但是因为我已经在网上搜索,要在邮件中附加icalendar附件(要与Lotus Notes兼容),我必须发送多部分类型。是否有我丢失的东西? – Tushar

+0

尝试添加主体文本部分,然后查看icalendar附件是否正确处理。 –

相关问题