![]() |
|
|
Um Abhilfe zu schaffen, wurde MIME im RFC 1341 und RFC 1521 vorgeschlagen. Um ASCII-fremde Nachrichten zu kodieren, werden fünf Nachrichten-Header definiert und die Binärdateien nach base64-Encoding umgesetzt. Für Nachrichten, die fast nur aus ASCII-Zeichen bestehen, wäre dies aber zu großer Overhead, so dass Quoted Printing Encoding eingesetzt wird. Dies definiert lediglich alle Zeichen über 127 durch zwei hexadezimale Zeichen. Dieses Kodierungsverfahren entdecken wir oft in URLs, welche von Formularen erzeugt werden, etwa http://www.google.de/search?q=r%FCssel. Probleme mit SMTPSMTP bereitet den Anwendern und Systemverwaltern einige Kopfzerbrechen. So müssen sie sich mit dem Versand von gefälschten E-Mails herumschlagen (Mail-Spoofing), zudem ist unerbetene kommerzielle Werbung (Unsolicited Commercial E-Mail, kurz UCE) und UBE (Unsolicited Bulk E-Mail), besser bekannt als Spam, ein wirtschaftlich negativer Faktor. Das Ursprungs-SMTP wird mit diesen Problemen nicht fertig, da der Einsatz für ein überschaubares Netz gedacht war, dessen Teilnehmer sich kennen. Viele SMTP-Server sind so brav, dass sie eine E-Mail von jedem beliebigen Absender zu jedem beliebigen Adressaten schicken. Auch andere Probleme sind noch nicht gelöst. Dazu gehören zum Beispiel eine Einlieferungsbestätigung (Proof of Submission). Zwar lässt sendmail das Senden von Empfangsbestätigungen mit einem speziellen Return-Receipt-To-Feld zu, doch dieses ist bisher nicht offiziell im RFC 822 standardisiert. 16.11.3 POP (Post Office Protocol)
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Hinweis Falls das Senden nicht funktioniert, kann es daran, liegen, dass der Server mit einer »POP before send« Authentifizierung arbeitet. Das heißt, der Anwender muss erst mit POP die EMail erfragen und kann dann eine neue EMail senden. |
Neben den klassischen MIME-Typen application, audio, image, message und video zur Beschreibung der Datentypen einer E-Mail dient der Typ multipart dazu, in einer E-Mail mehrere Teile mit (in der Regel) unterschiedlichen MIME-Teilen zu kodieren. Die JavaMail-API bietet für diesen Fall die Klasse (Mime)Multipart an; eine Containerklasse, der mit addBodyPart() diverse (Mime)BodyPart-Objekte hinzugefügt werden können. Zum Schluss – sind die Köper aufgebaut – setzt auf dem Message-Objekt setContent() nun nicht mehr das einfache MimeMessage-Objekt mit einem expliziten MIME-Typ, sondern das MimeMultipart-Objekt.
Das nachfolgende Beispiel zeigt ein Message-Objekt mit zwei Teilen. Einmal eine normale text/plain-Nachricht und zum anderen eine text/html-Nachricht. Der Konstruktor eines MimeMultipart-Objekts gibt der mehrtyp-Nachricht einen Namen. Ist dieser mit dem String »alternative«, so heißt das für den Mail-Client, dass es verschiedene Versionen desselben Textes enthält. Standardmäßig versendet so zum Beispiel Microsoft Outlook die E-Mails. Sie werden als reiner Text und als HTML verschickt.
MimeMultipart content = new MimeMultipart( "alternative" ); MimeBodyPart text = new MimeBodyPart(); MimeBodyPart html = new MimeBodyPart(); text.setText( "Text als normaler String" ); text.setHeader( "MIME-Version" , "1.0" ); text.setHeader( "Content-Type" , text.getContentType() ); html.setContent( "<html>Text als <b>HTML</b></html>", "text/html"); html.setHeader( "MIME-Version" , "1.0" ); html.setHeader( "Content-Type" , html.getContentType() ); content.addBodyPart( text ); content.addBodyPart( html ); Message msg = ... msg.setContent( content ); msg.setHeader( "MIME-Version" , "1.0" ); msg.setHeader( "Content-Type" , content.getContentType() ); msg.setHeader( "X-Mailer", "Java-Mailer V 1.60217733" ); msg.setSentDate( new Date() );
Anhänge kodiert die JavaMail API über DataSource-Objekte; FileDataSource steht etwa für ein Datei-Anhang.
DataSource fileDataSource = new FileDataSource( dateiname );
Soll dieser Anhang an die Nachricht (MimeBodyPart) angehängt werden, ist setDataHandler() zu verwenden:
BodyPart messageBodyPart = new MimeBodyPart(); messageBodyPart.setDataHandler( new DataHandler(fileDataSource) ); messageBodyPart.setFileName( dateiname ); // gibt dem Anhang einen Namen multipart.addBodyPart( messageBodyPart );
Es ist sinnvoll mit setFileName() einen Namen für den Anhang zu vergeben, damit der Empfänger der EMail diesen Anhang einfach unter diesen Namen speichern kann.
Die andere Seite soll ebenso betrachtet werden. Sie ist ein klein wenig aufwändiger, da die Nachrichten (Message-Objekte) erst dekodiert werden müssen. Dennoch geht die Arbeitsweise leicht aus dem Programm hervor.
Listing 16.18 SendJavaMail.java
package javamail; import java.util.*; import java.io.*; import javax.mail.*; import javax.mail.internet.*; public class GetEMails { public static void getMail( String host, String user, String passwd ) throws Exception { Session session = Session.getDefaultInstance( new Properties() ); Store store = session.getStore( "pop3" ); store.connect( host, user, passwd ); Folder folder = store.getFolder( "INBOX" ); folder.open( Folder.READ_ONLY ); Message message[] = folder.getMessages(); for ( int i = 0; i < message.length; i++ ) { Message m = message[i]; System.out.println( "Nachricht: " + i ); System.out.println( "From: " + m.getFrom()[0] ); System.out.println( "Subject: " + m.getSubject() ); Multipart mp = (Multipart) m.getContent(); for ( int j = 0; j < mp.getCount(); j++ ) { Part part = mp.getBodyPart( j ); String disposition = part.getDisposition(); if ( disposition == null ) { MimeBodyPart mimePart = (MimeBodyPart)part; if ( mimePart.isMimeType("text/plain") ) { BufferedReader in = new BufferedReader( new InputStreamReader(mimePart.getInputStream()) ); for ( String line; (line=in.readLine()) != null; ) System.out.println( line ); } } } } folder.close( false ); store.close(); } public static void main( String args[] ) throws Exception { getMail( "pop.t-online.de", "12345678–0001@t-online.de", "passwd" ); } }
Das Programm listet alle E-Mails vom Server auf und schreibt die Inhalte auf den Bildschirm. Die Nachrichten werden aber nicht vom Server gelöscht. In dem oberen Beispiel ist das Passwort natürlich anzupassen. Um eine Nachricht vom Server zu löschen, darf der Ordner nicht mit READ_ONLY geöffnet werden, sondern mit Folder.READ_WRITE. Anschließend lässt sich einer Nachricht, repräsentiert durch ein Message-Objetkt, mit setFlag() ein Lösch-Hinweis geben.
message.setFlag( Flags.Flag.DELETED, true );
Die Daten werden jedoch nur dann vom Server gelöscht, wenn zum Schluss folder.close(true) aufgerufen wird. Ohne den Aufruf von close() mit dem Argument true bleiben die Nachrichten erhalten.
| Beispiel Um herauszufinden, ob überhaupt Nachrichten auf dem Server liegen, lässt sich auf dem aktuellen folder-Objekt die Methode getMessageCount() nutzen. |
Die JavaMail-API bietet einige Glanzstücke, unter ihnen ein System für verschiedene Ereignisse:
| Listener | Angewendet auf | Aufgaben |
| MessageCountListener | Folder | Findet, wenn neue Nachrichten kommen. (Bei POP3 muss Postfach geschlossen sein.) |
| ConnectionListener | Service (Store, Transport), Folder | Benachrichtigung beim Öffnen, Schließen, Zwangstrennung |
| FolderListener | Folder | Ordner angelegt, umbenannt, gelöscht |
| MessageChangedListener | Folder | Änderung, etwa am Folder oder Headern |
| StoreListener | Store | Nachricht mit Wichtigkeit ALERT oder NOTICE |
| TransportListener | Transport | Zugestellt, nicht zugestellt, zum Teil zugestellt |
Das zweite ist ein Suchsystem, den JavaMail über das Paket javax.mail.search definiert. Zunächst wird ein Suchterm aus SearchTerm-Objekten aufgebaut. Diese abstrakte Basisklasse definiert eine Methode match(), die von Unterklassen passende implementiert wird:
| AddressTerm und Unterlassen FromTerm, RecipientTerm vergleichen javax.mail.Address-Objekte. Address besitzt Unterklassen InternetAddress und NewsAddress |
| StringTerm. Sucht nach Teilzeichenketten. Interessant sind die Unterklassen AddressStringTerm (mit Unterklassen FromStringTerm, RecipientStringTerm), BodyTerm, HeaderTerm, MessageIDTerm, SubjectTerm |
| FlagTerm. Testet, ob Nachrichten gewisse Flags besitzen |
| ComparisonTerm. Vergleiche durch die Unterklassen DateTerm, IntegerComparisonTerm. Ein Datum ist durch die Unterklassen ReceivedDateTerm und SentDateTerm weiter gegliedert, ein IntegerComparisonTerm besitzt die Unterklassen MessageNumberTerm und SizeTerm. |
| AndTerm, NotTerm, OrTerm. Verknüpfungen zwischen Termen |
Die nächsten Anweisungen bauen ein Such-Objekt auf, das im Betreff ein »Re:« erkennt und auf die Zeichenkette »Nigeria-Connection« im Körper reagiert. search() durchsucht einen Folder und liefert die Nachrichten, die auf dieses Muster passen.
SearchTerm st = new AndTerm( new SubjectTerm( "Re:" ), new BodyTerm("Nigeria-Connection") ); Message[] msgs = folder.search( st );
1 Der E-Mail-Client von Microsoft zieht Probleme mit sich, denen die meisten von uns lieber aus dem Weg gehen würden. Als in der Fernsehwerbung zwischen 1996 und 1997 der Internet Explorer beworben wurde, spielte im Hintergrund die Musik vom Wolfgang Amadeus Mozart (1756–1791). In Mozarts Requiem, welches geschichtlich gesehen schon mit Verwunderungen verbunden war, taucht am Ende der Werbung der Choral »Confutatis maledictis, flammis acribus addictis« auf. Zeitgleich folgt der Microsoft-Slogan »Where do you want to go today?«. Für die Nicht-Lateiner wird es erst bei der Übersetzung lustig: »Die Verdammten und Angeklagten, die in den Flammen der Hölle verurteilt sind«.
2 Zu beziehen unter http://java.sun.com/products/javabeans/glasgow/jaf.html.
| << zurück |
Copyright © Galileo Press GmbH 2004
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.