Outlook-Appointment via Javax

Da wir von unserer Hochschule zu den Präsenzphasen noch immer gute alte Excel-Listen mit Stundenplänen bekommen, setzt sich einer von uns Kommilitonen mit ein wenig Zeit vor sein Outlook und macht daraus Besprechungsanfragen, die wir dann bequem mit unseren mobilen Endgeräten abgleichen können. Da ich mir diese ganze Tipp-Arbeit sparen möchte, habe ich mal nachgeschaut, ob es nicht eine Möglichkeit gibt, eine Art Batch auf eine Datasource, also die Excel-Liste, zu legen und dann daraus via Kommandozeilen-Option von Outlook Besprechungsanfragen zu versenden. Die Kommandozeilen-Parameter sind bei Outlook entweder nicht vorhanden oder mies dokumentiert. Ich kann zwar via /c ipm.appointment einen neuen Termin erstellen, den aber weder füllen noch etwas anderes damit machen.
Na gut, „geht nicht, gibts nicht“… Was also ist eigentlich eine Besprechungsanfrage? Doch auch nur eine Mail mit ics-Content. Nach ein bisschen googlen und diverser Javax-Fragmente hab ich (mit Hilfe : [link] dann folgenden Code gebastelt:

OutlookAppointer.java


package eu.christoph_burmeister;

import org.apache.commons.lang.StringUtils;
import java.util.Properties;
import java.util.TimeZone;
import java.io.*;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.activation.DataHandler;
import javax.activation.DataSource;

public class OutlookAppointer {
	private String outgoingMailServer;
	private String fromEmail;
	private String toEmail;
	private String subject;
	private String rsvpTo;
	private String organizer;
	private TimeZone timezone;
	private String location;
	private String message;
	/**
	 * sessionStart : using 20100226T180000Z for 26.Februar 2010, 18:00
	 */
	private String sessionStart;
	/**
	 * sessionEnd : using 20100226T200000Z for 26.Februar 2010, 20:00
	 */
	private String sessionEnd;

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

		/**
		 * using "normal" t-online-smtp : smtpmail.t-online.de
		 */
		meeting.setOutgoingMailServer("mailserver.tantooine.com");
		/**
		 * sender
		 */
		meeting.setFromEmail("sender@tantooine.com");
		/**
		 * receiver
		 */
		meeting.setToEmail("receiver@tantooine.com");
		/**
		 * subject
		 */
		meeting.setSubject("tantooine-conference");
		/**
		 * outlook-appointment-organizer
		 */
		meeting.setOrganizer("organizer@tantooine.com");
		/**
		 * conference-time (start and stop)
		 */
		meeting.setConferenceSession("20100226T180000Z","20100226T200000Z");
		/**
		 * conference-location
		 */
		meeting.setLocation("Tantooine");
		/**
		 * the message
		 */
		meeting.setMessage("AGENDA");
		/**
		 * grab the timezone
		 */
		meeting.setTimeZone(TimeZone.getDefault());
		/**
		 * send the message
		 */
		meeting.send();
	}

	public void setOutgoingMailServer(String outgoingMailServer) {
		this.outgoingMailServer = outgoingMailServer;
	}

	public void setFromEmail(String fromEmail) {
		this.fromEmail = fromEmail;
	}

	public void setToEmail(String toEmail) {
		this.toEmail = toEmail;
	}

	public void setSubject(String subject) {
		this.subject = subject;
	}

	public void setRsvpTo(String rsvpTo) {
		this.rsvpTo = rsvpTo;
	}

	public void setOrganizer(String organizer) {
		this.organizer = organizer;
	}

	public void setConferenceSession(String sessionStart, String sessionEnd) {
		this.sessionStart = sessionStart;
		this.sessionEnd = sessionEnd;
	}

	public void setTimeZone(TimeZone timezone) {
		this.timezone = timezone;
	}

	public void setLocation(String location) {
		this.location = location;
	}

	public void setMessage(String message) {
		this.message = message;
	}

	public void send() throws Exception {
		try {
			MimeMessage message = new MimeMessage(getSession());
			message.setFrom(new InternetAddress(fromEmail));
			message.addRecipient(Message.RecipientType.TO, new InternetAddress(toEmail));
			message.setSubject(subject);

			String body = "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:"
					+ StringUtils.defaultString(rsvpTo, fromEmail)
					+ "\n"
					+ "ORGANIZER:MAILTO:"
					+ StringUtils.defaultString(organizer, fromEmail)
					+ "\n"
					+ "DTSTART:"
					+ sessionStart + "\n"
					+ "DTEND:"
					+ sessionEnd + "\n"
					+ "LOCATION:"
					+ location
					+ "\n"
					+ "TRANSP:OPAQUE\n"
					+ "SEQUENCE:0\n"
					+ "UID:040000008200E00074C5B7101A82E00800000000002FF466CE3AC5010000000000000000100\n"
					+ " 000004377FE5C37984842BF9440448399EB02\n"
					+ "DTSTAMP:"
					+ "\n"
					+ "CATEGORIES:Meeting\n"
					+ "DESCRIPTION:"
					+ StringUtils.replace(this.message, "\n", "\\n")
					+ "\n\n"
					+ "SUMMARY:"
					+ subject
					+ "\n"
					+ "PRIORITY:5\n"
					+ "CLASS:PUBLIC\n"
					+ "BEGIN:VALARM\n"
					+ "TRIGGER:-PT15M\n"
					+ "ACTION:DISPLAY\n"
					+ "DESCRIPTION:Reminder\n"
					+ "END:VALARM\n" + "END:VEVENT\n" + "END:VCALENDAR";

			// Fill the message
			DataHandler handler = new DataHandler(new OutlookMeetingDataSource(body));
			message.setDataHandler(handler);

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

	class OutlookMeetingDataSource implements DataSource {
		private byte[] data;

		public OutlookMeetingDataSource(String data) {
			try {
				this.data = data.getBytes("UTF-8");
			} catch (UnsupportedEncodingException uex) {
			}
		}

		public InputStream getInputStream() throws IOException {
			return new ByteArrayInputStream(data);
		}

		public OutputStream getOutputStream() throws IOException {
			throw new IOException(
					"Unsupported operation. We can only send Outlook Meeting invites with this handler, not receive them.");
		}

		public String getContentType() {
			return "text/calendar; method=REQUEST; charset=\"UTF-8\"";
		}

		public String getName() {
			return "Microsoft Outlook Calendar Item";
		}
	}

	private Session getSession() {
		Authenticator authenticator = new Authenticator();
		Properties properties = new Properties();
		properties.setProperty("mail.smtp.submitter", authenticator.getPasswordAuthentication().getUserName());
		properties.setProperty("mail.smtp.auth", "true");
		properties.setProperty("mail.smtp.host", outgoingMailServer);
		properties.setProperty("mail.smtp.port", "25");
		return Session.getInstance(properties, authenticator);
	}
}

Authenticator.java



package net.sourceforge.mailer;

import javax.mail.PasswordAuthentication;

public class  Authenticator extends javax.mail.Authenticator {
	private PasswordAuthentication authentication;

	public Authenticator() {
		String username = "anakin.skywalker"; // mail-address without "@t-online"
		String password = "blubb_123";
		authentication = new PasswordAuthentication(username, password);
	}

	protected PasswordAuthentication getPasswordAuthentication() {
		return authentication;
	}
}