如何使用 Java Mail 发送 iCal 会议请求并接收响应 [英] How to send an iCal meeting request using Java Mail, and receive the response
问题描述
我正在尝试使用 Java 邮件库向 Outlook 发送 iCal,我已经阅读了 问题,我已经有了一些示例代码
I'm trying to send an iCal to an outlook, using Java Mail Library, I've read already the Question, and I already have some sample code
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
" +
"PRODID:-//Microsoft Corporation//Outlook 9.0 MIMEDIR//EN
" +
"VERSION:2.0
" +
"METHOD:REQUEST
" +
"BEGIN:VEVENT
" +
"ORGANIZER:MAILTO:" ) ;
messageText.append( organizer ) ;
messageText.append( "
" +
"DTSTART:");
messageText.append( dateFormat.format( start ) ) ;
messageText.append( "
" +
"DTEND:" ) ;
messageText.append( dateFormat.format( end ) ) ;
messageText.append( "
" +
"LOCATION:" ) ;
messageText.append( location ) ;
messageText.append( "
" +
"UID:" ) ;
messageText.append( invitationId ) ;
messageText.append( "
" +
"DTSTAMP:" ) ;
messageText.append( dateFormat.format( new java.util.Date() ) ) ;
messageText.append( "
" +
"DESCRIPTION;ALTREP="CID:<eventDescriptionHTML>"" ) ;
messageText.append( "
" +
"BEGIN:VALARM
" +
"TRIGGER:-PT15M
" +
"ACTION:DISPLAY
" +
"DESCRIPTION:Reminder
" +
"END:VALARM
" +
"END:VEVENT
" +
"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的附件发送,即使我点击附件查看并接受,我也没有收到答复,这是应用程序具有类似功能的目的喜欢展望.
But its being sent as an attachment to the outlook 2007 and outlook 2003, and even If I click the attachment to view and accept, I don't receive the Answer, which is the purpose of the application to have a similar functionality like outlook.
是否有任何我需要知道的程序,或者是邀请 ID 使事情变得粗糙?
Is there any procedure I need to know of, or is it the Invitation ID that makes the thing rough?
推荐答案
所以我解决了这个问题,这是我的发现:
So I solved the problem, and here is what I found:
1 - 您必须更新到 Java Mail API 1.4.2 才能使一切正常
1 - You have to update to Java Mail API 1.4.2 to make everything works fine
2 - 像下面这样编写消息的文本/日历部分:
2 - Write the text/calendar part of your message like the following:
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
" +
"PRODID:-//Microsoft Corporation//Outlook 9.0 MIMEDIR//EN
" +
"VERSION:2.0
" +
"METHOD:REQUEST
" +
"BEGIN:VEVENT
" +
"ATTENDEE;ROLE=REQ-PARTICIPANT;RSVP=TRUE:MAILTO:xx@xx.com
" +
"ORGANIZER:MAILTO:xx@xx.com
" +
"DTSTART:20051208T053000Z
" +
"DTEND:20051208T060000Z
" +
"LOCATION:Conference room
" +
"TRANSP:OPAQUE
" +
"SEQUENCE:0
" +
"UID:040000008200E00074C5B7101A82E00800000000002FF466CE3AC5010000000000000000100
" +
" 000004377FE5C37984842BF9440448399EB02
" +
"DTSTAMP:20051206T120102Z
" +
"CATEGORIES:Meeting
" +
"DESCRIPTION:This the description of the meeting.
" +
"SUMMARY:Test meeting request
" +
"PRIORITY:5
" +
"CLASS:PUBLIC
" +
"BEGIN:VALARM
" +
"TRIGGER:PT1440M
" +
"ACTION:DISPLAY
" +
"DESCRIPTION:Reminder
" +
"END:VALARM
" +
"END:VEVENT
" +
"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 - 替换变量,一切顺利!
3 - Replace your variable, and you are good to go!
这篇关于如何使用 Java Mail 发送 iCal 会议请求并接收响应的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!