Javamail Content Transfer Encoding Binaroptionen




Javamail Content Transfer Encoding BinäroptionenHandhabung von Binardaten mit Axis2 (MTOM / SWA) Inhalt Einfuhrung Trotz der Flexibilitat, der Interoperabilitat und der globalen Akzeptanz von XML gibt es Zeiten, in denen die Serialisierung von Daten in XML nicht sinnvoll ist. Web-Service-Benutzer konnen binare Anhange von verschiedenen Sorten wie Bilder, Zeichnungen, XML-Dokumente, etc. zusammen mit einer SOAP-Nachricht zu ubertragen. Solche Daten sind oft in einem bestimmten Binarformat. Herkommlicherweise wurden zwei Techniken fur den Umgang mit undurchsichtigen Daten in XML verwendet. Das Senden von binaren Daten durch den Wert wird erreicht, indem opake Daten (naturlich nach irgendeiner Form der Codierung) als Element oder Attributinhalt der XML-Datenkomponente eingebettet werden. Der Hauptvorteil dieser Technik ist, dass sie Anwendungen die Moglichkeit gibt, Daten zu verarbeiten und zu beschreiben, die nur auf der XML-Komponente der Daten basieren. XML unterstutzt undurchsichtige Daten als Inhalt durch die Verwendung von base64 oder hexadezimaler Textcodierung. Beide Techniken blasen die Gro?e der Daten. Fur die UTF-8 unterliegende Textcodierung erhoht die base64-Codierung die Gro?e der Binardaten um den Faktor 1,33x der Originalgro?e, wahrend die hexadezimale Codierung Daten um den Faktor 2x erweitert. Die obigen Faktoren werden verdoppelt, wenn UTF-16-Textcodierung verwendet wird. Ebenfalls besorgniserregend ist der Overhead bei den Verarbeitungskosten (sowohl real als auch wahrgenommen) fur diese Formate, insbesondere bei der Decodierung zuruck in rohe Binardateien. Das Senden binarer Daten durch Verweis wird dadurch erreicht, dass reine Binardaten als externe, nicht geparste allgemeine Entitaten au?erhalb des XML-Dokuments angehangt und dann Referenz-URIs als Elemente oder Attributwerte in diese Entitaten eingebettet werden. Dies verhindert das unnotige Aufblasen von Daten und die Verschwendung von Rechenleistung. Das primare Hindernis fur die Verwendung dieser unparsed Entities ist ihre starke Abhangigkeit von DTDs, die Modularitat sowie die Verwendung von XML-Namespaces behindert. Es gab mehrere Spezifikationen, die in der Web-Services-Welt eingefuhrt wurden, um mit diesem binaren Bindungsproblem unter Verwendung der quotby-Referenzquot-Technik umzugehen. SOAP mit Attachments ist ein solches Beispiel. Da SOAP DTDs in Nachrichten verbietet, fuhrt dies zu dem Problem, Daten nicht als Teil des Nachrichteninfosets darzustellen und somit zwei Datenmodelle zu erstellen. Dieses Szenario ist wie das Senden von Anlagen mit einer E-Mail-Nachricht. Obwohl diese Anhange mit dem Nachrichteninhalt verknupft sind, befinden sie sich nicht innerhalb der Nachricht. Dies fuhrt dazu, dass die Technologien, die die Daten auf der Basis der XML-Komponente der Daten zu Fehlfunktionen verarbeiten und beschreiben. Ein Beispiel ist WS-Security. Wo befindet sich MTOM in MTOM (SOAP Message Transmission Optimization Mechanism) ist eine weitere Spezifikation, die auf die Losung des quotAttachmentsquot Problem konzentriert. MTOM versucht, die Vorteile der beiden obigen Techniken zu nutzen, indem man versucht, die beiden Techniken zusammenzufuhren. MTOM ist eigentlich ein quotiertes Referenzquotverfahren. Das Drahtformat einer MTOM-optimierten Nachricht ist dasselbe wie die SOAP mit Attachments-Meldung, die es auch ruckwartskompatibel mit SwA-Endpunkten macht. Das wichtigste Merkmal von MTOM ist die Verwendung des XOP: Include-Elements, das in der XML-Binary-Optimized-Packaging-Spezifikation (XOP) definiert ist, um auf die binaren Attachments (externe nicht geparste allgemeine Entitaten) der Nachricht zu verweisen. Durch die Verwendung dieses exklusiven Elements wird der angefugte binare Inhalt logisch inline (durch Wert) mit dem SOAP-Dokument, obwohl es tatsachlich separat beigefugt ist. Dies vereinigt die beiden Realms, indem es ermoglicht wird, nur mit einem Datenmodell zu arbeiten. Dies ermoglicht es den Anwendungen zu verarbeiten und zu beschreiben, indem man nur den XML-Teil betrachtet, wodurch die Abhangigkeit von DTDs obsolet wird. Auf eine leichtere Notiz hat MTOM den Referenzierungsmechanismus von SwA standardisiert. Das folgende ist ein Auszug aus der XOP-Spezifikation. Auf der konzeptionellen Ebene konnen diese binaren Daten als base64-codiert im XML-Dokument angesehen werden. Da diese Begriffsform bei einer Verarbeitung des XML-Dokuments (z. B. zum Signieren des XML-Dokuments) erforderlich sein konnte, ist es notwendig, eine Eins-zu-eins-Korrespondenz zwischen XML-Infosets und XOP-Paketen zu haben. Daher ist die konzeptionelle Darstellung derartiger Binardaten so, als ware sie base64-codiert unter Verwendung der kanonischen lexikalischen Form des XML Schema base64Binary Datentyps (siehe XML Schema Teil 2: Datentypen Second Edition 3.2.16 base64Binary). In umgekehrter Richtung ist XOP in der Lage, nur base64-codierte Infoset-Daten zu optimieren, die in der kanonischen lexikalischen Form vorliegen. Apache Axis2 unterstutzt Base64-Codierung. SOAP mit Anhangen und MTOM (SOAP Message Transmission Optimization Mechanism). MTOM mit Axis2-Programmiermodell AXIOM ist (und kann das erste) Objektmodell sein, das binare Daten halten kann. Es hat diese Fahigkeit, wie OMText rohe binare Inhalte in Form von javax. activation. DataHandler halten kann. OMText wurde dafur aus zwei Grunden ausgewahlt. Eines davon ist, dass XOP (MTOM) in der Lage ist, nur base64-codierte Infoset-Daten zu optimieren, die sich in der kanonischen lexikalischen Form des XML Schema base64Binary Datentyp befinden. Andererseits soll das Infoset sowohl im Sender als auch im Empfanger erhalten bleiben. (Um den binaren Inhalt in der gleichen Art von Objekt zu speichern, unabhangig davon, ob es optimiert ist oder nicht). MTOM ermoglicht es, selektiv Teile der Nachricht zu codieren, die es uns ermoglichen, base64encodierte Daten sowie extern angeschlossene rohe Binardaten zu senden, auf die durch das in einer SOAP-Nachricht zu sendende "XOPquot-Element (optimierter Inhalt) verwiesen wird. Sie konnen angeben, ob ein OMText-Knoten, der rohe Binardaten oder base64encodierte Binardaten enthalt, qualifiziert ist, zum Zeitpunkt des Aufbaus dieses Knotens oder spater optimiert zu werden. Fur optimale Effizienz von MTOM wird dem Benutzer empfohlen, kleinere binare Anhange mit base64encoding (nicht optimierten) und gro?eren Anhangen als optimierten Inhalt zu versenden. Au?erdem kann ein Benutzer einen optimierbaren binaren Inhaltsknoten unter Verwendung einer base64-codierten Zeichenfolge erzeugen, die einen codierten binaren Inhalt enthalt, der mit dem MIME-Typ der tatsachlichen binaren Darstellung gegeben ist. Axis2 verwendet javax. activation. DataHandler, um die binaren Daten zu verarbeiten. Alle optimierten Binarinhaltsknoten werden als Base64-Strings serialisiert, wenn quotMTOM nicht aktiviert ist. Sie konnen auch binare Inhaltsknoten erstellen, die auf keinen Fall optimiert werden. Sie werden serialisiert und als Base64 Strings gesendet. Aktivieren der MTOM-Optimierung auf der Client-Seite Setzen Sie die quotenableMTOMquot - Eigenschaft in Optionen auf True, wenn Sie Nachrichten senden. Wenn diese Eigenschaft auf True festgelegt ist, wird jede SOAP-Hullkurve unabhangig davon, ob sie optimalen Inhalt enthalt oder nicht, als MTOM-optimierte MIME-Nachricht serialisiert. Axis2 serialisiert alle Binarinhaltsknoten als Base64-codierte Zeichenfolgen, unabhangig davon, ob sie qualifiziert sind, optimiert zu werden, oder nicht, wenn die Eigenschaft quotenableMTOMquot auf False gesetzt ist. Wenn der Umschlag Elementeinheiten des Namens xop enthalt: Include (siehe XML-binare Optimierte Verpackung 3. XOP Infosets-Konstrukte). Der Benutzer muss nichts angeben, damit Axis2 MTOM-optimierte Nachrichten empfangen kann. Axis2 identifiziert und de-serialisiert entsprechend, wenn eine MTOM-Nachricht eintrifft. MTOM-Optimierung auf Server-Seite aktivieren Der Axis 2-Server identifiziert eingehende MTOM-optimierte Meldungen anhand des Content-Typs automatisch und de-serialisiert sie entsprechend. Der Benutzer kann auf der Server-Seite fur ausgehende Nachrichten enableMTOM aktivieren. Um enableMTOM global fur alle Dienste zu aktivieren, konnen Benutzer den Parameter quotenableMTOMquot in der Axis2.xml auf True setzen. Wenn es gesetzt ist, werden alle ausgehenden Nachrichten serialisiert und als MTOM-optimierte MIME-Nachrichten gesendet. Wenn sie nicht gesetzt ist, werden alle binaren Daten in den Binarinhaltsknoten als Base64-codierte Zeichenfolgen serialisiert. Diese Konfiguration kann in services. xml auf der Basis von pro Service und pro Operation uberschrieben werden. Nach der Einstellung dieses Parameters mussen Sie den Server neu starten. Zugriff auf empfangene Binardaten (Beispielcode) Im Schreiben eines einfachen Webservers in Python, der es einem Benutzer ermoglicht, eine Datei mit multipart / form-data hochzuladen. Soweit ich sagen kann, mussen Multipart-MIME-Daten line-basiert sein. Zum Beispiel muss die Grenze am Anfang einer Zeile sein. Ich kann nicht herausfinden, wie binare Daten in dieser Hinsicht behandelt wird. Mein Client (Firefox) ist nicht Kodierung in 7bit ASCII oder etwas, seine nur rohe binare Daten sein Senden. Gibt es eine maximale Zeilenlange angegeben fur Multipart-Daten Ive versucht, die Suche durch die RFC fur Multipart / Form-Daten, aber nicht etwas finden. Gefragt Mar 27 13 am 16:54 Nach dem Graben durch die RFCs, ich glaube, ich endlich habe es alle direkt in meinem Kopf. Die Korperteile (d. h. der Korperinhalt eines einzelnen Teils in einer Multipart / Nachricht) mussen nur linienbasiert sein, indem die Grenze am Ende des Teils mit einer CRLF beginnt. Aber sonst mussen die Daten nicht zeilenbasiert sein, und wenn der Inhalt mit Zeilenumbruchen in es geschieht, gibt es keine maximale Distanz zwischen ihnen, noch mussen sie in irgendeiner Weise entkommen (gut, es sei denn, die Content-Transfer - Encoding ist zitiert-string). Die 7-Bit-, 8-Bit - und Binaroptionen fur Content-Transfer-Encoding deuten nicht darauf hin, dass jede Codierung auf den Daten durchgefuhrt wurde (und daher keine Codierung ruckgangig gemacht werden muss), sondern nur die Art der Daten angeben Konnen Sie erwarten, in der Korperpartie zu sehen. Was ich in meiner schlecht ausgedruckten Frage wirklich war, war, wie man die Daten aus dem Sockel lastet / puffert, so dass ich sicherstellen konnte, dass ich die Grenze fing und ohne einen willkurlich gro?en Puffer haben musste (zB wenn es nicht passiert war Zeilenumbruche in den Inhalt, und so eine Readline endete bis Pufferung der gesamten Sache). Was ich am Ende zu tun war Pufferung aus dem Sockel mit einer readline mit einer maximalen Lange, so dass der Puffer ware nie langer als das, sondern wurde auch sicher zu beenden, wenn ein Zeilenumbruch angetroffen wurde. Dies stellte sicher, dass, wenn die Grenze kam (nach einer CRLF), es ware am Anfang des Puffers. Ich musste ein wenig extra monkeying, um sicherzustellen, dass ich nicht enthalten, dass endgultige CRLF in der eigentlichen Korper Inhalt, weil nach dem RFC seine erforderlich vor der Grenze, und daher nicht Teil des Inhalts selbst. Antwort # 2 am 12:02 Versuchen Sie die Uberprufung RFC 2045. Normalerweise wird binarer Inhalt von Ihrer Anwendung in BASE64 konvertiert und in der Multi-Part-Nachricht mit Content-Transfer-Encoding enthalten. Base64. Es gibt andere Mechanismen, um binare Daten zu ubertragen, aber das ist sehr haufig. Binardaten werden in Bytes konvertiert und in Arbitrationslangen (abhangig von der Kodierungsvariante - siehe BASE64-Link oben) aufgeteilt. Die empfangene Anwendung decodiert sie dann in den ursprunglichen binaren Inhalt. Ich bin nicht ein Python-Programmierer, aber ich wurde uberrascht sein, dass Sie wirklich zu jeder dieser Code. Ich vermute, es gibt vorgebaute Python-Bibliothek Funktionen, dies fur Sie zu tun. Beantwortet Mar 27 13 am 17:43 Danke, ich war auf einen anderen RFC, die nicht so informativ war. Ich fand auch RFC 2046, die spezifisch mehrteilige Meldungen in Abschnitt 5 definiert. Anmerkung there39s ein bisschen eine Subtilitat in diesen RFCs, die durch mich weg: es sagt, dass mehrteilige Meldungen keine anderen Kodierungen als 7-bit, 8-bit und binary haben konnen (Dh nicht Base-64). Allerdings kann man sagen, dass die einzelnen Teile innerhalb des Multi-Teils eigene Content-Kodierungen haben konnen, so dass Sie korrekt sind, dass Base-64 moglich ist. Ndash sh1ftst0rm Mar 28 13 um 13:20 Deine Antwort 2016 Stack Exchange, IncGreetings alle. Ich hoffe, jemand kann mir ein paar Lichter uber die Frage, die ich habe. Lesen der Javadoc von MimeMessages getInputStream (), hei?t es, geben Sie einen decodierten Input-Stream fur diese Nachrichten-Inhalte Dies ist jedoch nicht das, was ich erlebe. Der Ausgang wird nicht decodiert. Zum Beispiel, wenn ich eine Nachricht wie folgt haben Angenommen, ich habe ein Objekt namens m konstruiert mit dem obigen Inhalt, dann aufrufen m. getInputStream () und dump die Ausgabe auf dem Bildschirm zeigt die 3D-Zeichensatze. Was habe ich falsch gemacht Wenn ich QPDecoderStream verwendet, um die Ausgabe von m. getInputStream () zu decodieren, dann ist naturlich das Ergebnis korrekt. Jedoch besiegt es den Zweck, weil das Javadoc sagt, da? getInputStream () einen decodierten Eingangsstrom zuruckbringt. Wenn ein Content-Transfer-Encoding-Header-Feld erscheint als Teil eines Nachrichten-Header, gilt es fur den gesamten Korper dieser Nachricht. Wenn ein Content-Transfer-Encoding-Header-Feld als Teil eines Entitys-Headers angezeigt wird, gilt es nur fur den Korper dieser Entitat. Wenn eine Entitat vom Typ multipart ist, darf die Content-Transfer-Codierung keinen anderen Wert als 7bit, 8bit oder binary haben. Sie konnten wahrscheinlich die Top-Level-MimeMessage s decodiert Content-Stream und Instanziierung eines MimeMultipart aus, aber das ist nur Hacking rund um das grundlegende Problem einer defekten message. JavaMail Sie konnen senden oder abrufen E-Mail uber Ihre Java-Anwendung oder servlet mit dem JavaMail API. Sie verwenden die JavaMail-API, wo als JavaMail-Implementierungsanbieter die JavaMail-API implementieren, um Ihnen einen JavaMail-Client (Java-JAR-Datei) zu geben. Sun gibt Ihnen mail. jar, die Suns SMTP-, POP3- und IMAP-Clientimplementierungen zusammen mit der JavaMail-API hat. Dies ist ausreichend, um E-Mails zu senden und zu empfangen, aber nicht, um neue Gruppen zu lesen oder zu veroffentlichen, die NNTP verwenden. Beispielcode zum Versenden von E-Mails Zum Kompilieren und Ausfuhren benotigen Sie mail. jar (aus dem JavaMail-Download) und activation. jar (aus dem JavaBeans Activation Framework-Download) im Java-Klassenpfad. Sie mussen E-Mail-Adressen und E-Mail-Server mit Ihren Werten, wo angegeben, zu ersetzen. Benutzername und Kennwort sind in der Regel nicht erforderlich, um E-Mails zu senden, obwohl Ihr Internetdienstanbieter sie moglicherweise weiterhin dazu verpflichtet, zu verhindern, dass Spam durch die Systeme geht. Dieser Beispielcode hat Debugging eingeschaltet (mail. debug) zu sehen, was los ist hinter den Kulissen in JavaMail-Code. Beispielcode zum Senden von Multipart-E-Mails, HTML-E-Mails und Dateianlagen Um kompilieren und ausfuhren zu konnen, benotigen Sie mail. jar (aus dem JavaMail-Download) und activation. jar (aus dem JavaBeans Activation Framework-Download) im Java-Klassenpfad. Sie mussen E-Mail-Adressen und E-Mail-Server mit Ihren Werten, wo angegeben, zu ersetzen. Dieser Beispielcode hat Debugging eingeschaltet (mail. debug) zu sehen, was los ist hinter den Kulissen in JavaMail-Code. Beispielcode zum Abrufen von E-Mail Zum Kompilieren und Ausfuhren benotigen Sie mail. jar (aus dem JavaMail-Download) und activation. jar (aus dem JavaBeans Activation Framework-Download) im Java-Klassenpfad. Sie mussen den E-Mail-Server, den Benutzernamen und das Kennwort mit den angegebenen Werten ersetzen. Dieser Beispielcode hat Debugging eingeschaltet (mail. debug) zu sehen, was los ist hinter den Kulissen in JavaMail-Code. Nutzliche Klassen und Interfaces Ein Session-Objekt authentifiziert den Benutzer und steuert den Zugriff auf die Mail-Server. Die Session-Klasse ist eine letzte konkrete Klasse. Es kann nicht unterklassen werden. Wenn Sie die entsprechende Factory-Methode auf einem Session-Objekt aufrufen, konnen Sie Transport - und Store-Objekte erhalten, die bestimmte Protokolle zum Senden bzw. Abrufen von E-Mails unterstutzen. Sie konvertieren E-Mail-Adressstrings wie userdomain in ein InternetAddress-Objekt, um es mit JavaMail zu verwenden. Die Klasse InternetAddress erweitert die abstrakte Adressenklasse, um eine rfc822-Typadresse zu erstellen. Sie erstellen eine E-Mail-Nachricht als ein Objekt der MimeMessage-Klasse. Alle Java-E-Mails sind vom Nachrichtentyp. Jedes Message-Objekt hat einen Inhalt. Der Inhalt kann entweder ein mehrteiliger Inhalt sein oder nicht. Ein einfacher Inhalt ist nur ein einfacher Text, zum Beispiel. Es gibt keine spezielle Klasse fur einfache (nicht-multipart) Inhalte. Sie sagen einfach msg. setText (textString). MimeMultipart-Klasse behandelt Multipart-Inhalte, die den MIME-Spezifikationen entsprechen. Sie erstellen ein neues MimeMultipart-Objekt, indem Sie seinen Standardkonstruktor aufrufen. Wenn Sie Inhalt einer multipart E-Mail erhalten. Es gibt immer ein Objekt dieses Typs zuruck. MimeMultipart fungiert als Container fur mehrere zu versendende Teile in der E-Mail. Jedes Teil ist vom Typ MimeBodyPart. MimeMultiparts Die Methode getBodyPart (int index) gibt das MimeBodyPart-Objekt am angegebenen Index zuruck. Der Index startet bei 0. Die addBodyPart (.) - Methode fugt ein neues MimeBodyPart-Objekt zu einem Schritt hinzu, um eine neue Multipart-MimeMessage zu erstellen. Jedes Objekt vom Typ Bodypart kann entweder ein JAF DataHandler-Objekt oder ein anderes (verschachteltes) Multipart-Objekt enthalten. Also, uberprufen Sie die Inhalt-Typ von jedem BodyPart, bevor Sie es in Ihrem Code. Um ein verschachteltes Multipart-Objekt aus einem MimePart zu extrahieren, das ein ContentType-Attribut auf multipart / enthalt, verwenden Sie die MimePart-Methode getContent (). Die getSubType-Methode gibt den Multipart-Message-MIME-Subtyp zuruck. Der Subtyp definiert die Beziehung zwischen den einzelnen Korperteilen einer Multipart-Nachricht. Wenn der Inhalt eines Message-Objekts eine Instanz der Multipart-Klasse ist, bedeutet dies, dass Sie den Inhalt in eine Multipart-Datei umwandeln und nach BodyPart-Typobjekten innerhalb des resultierenden Objekts suchen mussen, um auf jeden einzelnen Teil zuzugreifen. Ein anderes Message-Objekt kann nicht direkt in einem Multipart-Objekt enthalten sein, es muss zuerst in ein BodyPart eingebettet sein. Jedes Message - oder BodyPart-Objekt hat auch einige Attribute. Eine Message-s-Attribute konnen From, To, Subject, Reply-To usw. sein. Sie konnen auch Nicht-Standardattribute als Header hinzufugen. Ein BodyPart-Objekttyp verfugt nicht uber Attribute, die From, To, Subject, ReplyTo oder andere Adressheader-Felder festlegen. Nachrichten werden in Ordnerobjekten gespeichert, die auch Unterordner enthalten konnen. Alle Mailserver haben den Ordner INBOX. Die Ordner-Klasse deklariert Methoden, die Nachrichten abrufen, anfugen, kopieren und loschen. Ein Folder-Objekt kann auch Ereignisse an Komponenten senden, die als Ereignis-Listener registriert sind. Fldr. getType gibt an, ob ein Ordner Unterordner, Nachrichten oder beides halten kann. Store. getDefaultFolder gibt den Stammordner zuruck. Fldr. list gibt alle Unterordner unter diesem Ordner zuruck. Fldr. getFolder (folderName) gibt den benannten Unterordner zuruck. Dieser Unterordner muss nicht physisch im Laden vorhanden sein. Fldr. exists gibt an, ob dieser Ordner vorhanden ist. Store. create erstellt einen Ordner Ein geschlossenes Ordner-Objekt erlaubt das Loschen und Umbenennen des Ordners, das Auflisten und Erstellen von Unterordnern sowie die Uberwachung neuer Nachrichten. Fldr. open offnet ein Ordner-Objekt (nur wenn es Nachrichten enthalten kann). Sie konnen nicht offnen, loschen und renameTo in einem geoffneten Ordner aufrufen. Ordner werden in einer Datenbank gespeichert, auf die von einer Store-Klasse zugegriffen wird, die einen Benutzernamen und ein Kennwort benotigt, um eine Verbindung zur Datenbank herzustellen. Als Benutzer werden Sie zuerst eine Verbindung zu dem Mail-Server herstellen, indem Sie eine der drei connect (.) - Methoden in einer Store-Klasse aufrufen. Angabe des Servers fur den Zugriff, Benutzername und Passwort. Nachrichten, die in einem Ordnerobjekt gespeichert sind, werden nacheinander numeriert, beginnend bei 1. Der Aufruf von msg. getMessageNumber () gibt die Sequenznummer zuruck. Sie konnen eine Nachricht entweder durch ihre Sequenznummer oder durch das entsprechende Message-Objekt selbst verweisen. Wenn Nachrichten, die als geloscht markiert sind, tatsachlich geloscht werden, werden die verbleibenden Nachrichten neu numeriert. Es gibt also keine Garantie, dass eine Nachricht immer die gleiche Nachrichtennummer in einem Ordner hat. Da sich eine Sequenznummer innerhalb einer Sitzung andern kann, verwenden Sie Referenzen auf Message-Objekte und nicht auf Sequenznummern als zwischengespeicherte Referenzen auf Nachrichten. Verwenden Sie FetchProfile, um selektiv Nachrichtenattribute / Inhalte fur die Effizienz abzurufen: Schritte zur Verwendung von JavaMail Zuerst das Session-Objekt abrufen: Die Props Properties-Datei enthalt Mail-Protokolle zu verwenden, Mail-Host und Port zu verbinden, username etc., die spater verwendet werden Verbindung zum Mail-Server herstellen. Es kann leer sein, obwohl Sie vielleicht mail. store. protocol festlegen mochten. Mail. transport. protocol. Mail. host. Mail. user und mail. from Eigenschaften. Kennworter konnen nicht mit Eigenschaften angegeben werden. Hier sind die verschiedenen Eigenschaften, die im Eigenschaften-Objekt sein konnen und was sie tun: mail. store. protocol. Standardprotokoll zum Abrufen von Nachrichten. Mail. transport. protocol. Standardprotokoll zum Senden von Nachrichten. Mail. Protokoll. host. Protokollspezifischer Standard-Mail-Server wie mail. smtp. hostsmtp2.yourisp. Defaults zu whats in mail. host-Eigenschaft (siehe nachste). Mail. host. Standard-Mailserver fur das Senden und Empfangen von E-Mails. Mail. user. Mail-Server-Benutzername. Standardwert fur die JVM-System-Eigenschaft user. name. Die Methode zum Speichern und Transportieren von Verbindungen connect () verwendet diese Eigenschaft, um den Benutzernamen an den Mail-Server zu senden, wenn die protokollspezifische Benutzername-Eigenschaft nicht vorhanden ist (siehe nachste). Mail. Protokoll. user. Protokollspezifischer Standardbenutzername fur die Verbindung zum Mailserver. Defaults zu whats in mail. user-Eigenschaft. Mail. from. Gibt die Rucksendeadresse des aktuellen Benutzers an. Wird von der Methode InternetAddress. getLocalAddress verwendet, um die aktuelle Benutzer-E-Mail-Adresse anzugeben. Defaults zu usernamehost. Mail. debug. Wenn es als true-Zeichenfolge angegeben ist, werden Nachrichten an System. out ausgegeben, wobei verschiedene Protokollbefehle hinter den Kulissen angezeigt werden. Die Voreinstellung ist false. Sie konnen es spater mit Session. setDebug-Methode uberschreiben, aber dann werden Debug-Nachrichten nur von diesem Punkt an aktiviert und Sie werden die Sitzungserstellungsnachrichten verpassen. Senden von E-Mail Instantiieren einer neuen Nachricht: Festlegen von Nachrichtenattributen: Festlegen von Nachrichteninhalten: Zum Erstellen von MIME-Multipart-Inhalten mussen Sie zunachst ein MimeMultipart-Objekt instanziieren. Der Standard-Subtyp eines Multipart-Inhalts ist gemischt. Sie konnen andere Untertypen wie alternative, verwandte, parallele und signierte angeben. Instanzieren und Festlegen von Inhalt von MimeBodyPart-Objekten Hinzufugen von BodyPart-Objekten zum Multipart-Objekt Schliesslich legen Sie das Multipart-Objekt als Nachrichteninhalt fest Senden Sie die Meldung Automatische Prozedur. Dies ist eine bequeme statische Methode. Es ist nicht moglich, Ereignis-Listener mit dem Transportobjekt zu registrieren. Je nach Adre?typ des Empfangers wird die entsprechende Transport-Unterklasse instanziiert, msg. saveChanges () aufgerufen und transportObject. sendMessage (msg) aufgerufen. Manuelle Vorgehensweise. Sicherstellen, dass korrekte Nachrichtenheader aktualisiert werden: Holen Sie sich ein Transportobjekt, das fur das Sendeprotokoll spezifisch ist (normalerweise smtp) Event-Listener registrieren, wenn Sie mochten: Empfangeradresse erstellen: Nachricht senden: Optional konnen Sie die Nachricht an einen Bytestream schreiben Abrufen von E-Mails Abrufen des E-Mail-E-Mails Holen Sie sich das Store-Objekt: Verbinden mit dem Store: Ordner im Store auflisten und Nachrichten in einem Ordner anzeigen / anzeigen: Get a messages attributes: MIME-Typ zuruckgeben Nachrichteninhalt: Nachrichtentext erhalten: Der Typ des zuruckgesendeten Objekts hangt vom Typ des eigentlichen Inhalts ab. Ein Text / plain-Inhalt gibt normalerweise ein String-Objekt zuruck. Ein multipart / ltwhierendes hiergt-Objekt gibt immer ein Multipart-Objekt oder seine Unterklasse zuruck. Bei unbekannten Inhaltstypen werden alle Mail-spezifischen Codierungen decodiert und ein InputStream-Objekt zuruckgegeben. Wenn Sie fertig sind, schlie?en Sie alle geoffneten Ordner und dann den Speicher. Utility-Klassen Mit Hilfe der MimeUtility-Klasse konnen nicht-US-ASCII-Header und - Inhalte in ein Mail-sicheres Format konvertiert werden. Denken Sie daran, dies zu tun, bevor Sie die Methoden setHeader (), addHeader () und addHeaderLine () aufrufen. Au?erdem mussen diese Header-Felder vor dem Senden gefaltet (verpackt) werden, wenn sie die Zeilenlangenbegrenzung fur den Transport ubersteigen (1000 Byte fur SMTP). Empfangene Header konnen gefaltet worden sein. Ihr Antrag ist verantwortlich fur das Falten und Entfalten der Header entsprechend. Alle Methoden in der MimeUtility-Dienstprogrammklasse sind statische Methoden. GetEncoding () nimmt ein JAF-DataSource-Objekt und gibt die Content-Transfer-Codierung zuruck, die auf die Daten in dem DataSource-Objekt angewendet werden soll, um es als Mail-Safe zu erstellen. Encode () wickelt einen Encoder um den angegebenen Ausgabe-Stream basierend auf der angegebenen Content-Transfer-Encoding. Decode () decodiert den gegebenen Eingabestrom, basierend auf der angegebenen Content-Transfer-Codierung. Seit RFC 822 verbietet nicht US-ASCII-Zeichen in Header. Sollten Sie zuerst die Methode MimeUtility. encodeText () auf die Headernamen und - werte aufrufen und dann setHeader (), addHeader () oder addHeaderLine () auf die codierten Zeichenfolgen aufrufen. Er kodiert Headerwerte nur, wenn sie nicht US-ASCII-Zeichen enthalten. Ebenso rufen Sie MimeUtility. decodeText-Methode auf Header-Werte aus einer MimeMessage oder MimeBodyPart mit dem getHeader-Satz von Methoden erhalten. Diese Methode nimmt einen Header-Wert an, wendet RFC-2047-Decodierungsstandards an und gibt den decodierten Wert als Unicode-String zuruck. Sie sollten immer Header-Werte uber den Decoder, um sicher zu sein. Die ContentType-Klasse ist eine Utility-Klasse, die empfangene MIME-Content-Type-Header analysieren und auch neue MIME-Content-Type-Header generieren kann. Nachrichten-Flags Wenn ein Ordner das spezielle USER-Flag unterstutzt, konnen Sie beliebige benutzerdefinierbare Flags fur jede Nachricht festlegen, die zu diesem Ordner gehort. Andere Flags sind: ANSWERED. Nachricht wurde beantwortet. DRAFT: Die Nachricht ist ein Entwurf. FLAGGED. Markieren Sie eine Nachricht als gekennzeichnet. KURZLICH. Diese Nachricht ist neu in diesem Ordner angekommen. Dieses Flag wird gesetzt, wenn die Nachricht zum ersten Mal in den Ordner ubertragen und geloscht wird, wenn der Inhalt des Ordners geschlossen ist. Clients konnen dieses Flag nicht setzen. SEEN: Markiert eine Nachricht, die geoffnet wurde. Er wird gesetzt, wenn der Nachrichteninhalt abgerufen wird. LOSCHEN. Ermoglicht undoable Loschen der Nachricht. Wenn Sie dieses Kennzeichen fur eine Nachricht festlegen, wird es geloscht, aber die Nachricht wird nicht physisch aus dem Ordner entfernt. Der Client ruft die Methode expunge auf einem Ordner auf, um alle geloschten Nachrichten in diesem Ordner zu entfernen. Methoden zum Bedienen von Flags einer Nachricht JavaMail Ereignisse JavaMail verwendet JDK 1.1-Ereignishandhabungsmechanismus. Sie konnen Ihre Klasse als Zuhorer fur Unterklassen der MailEvent-Klasse registrieren. Die Transport-, Speicher - und Ordner-Klassen erzeugen solche Ereignisse. Ein Transportobjekt generiert ConnectionEvent und TransportEvent. Wenn das Transportobjekt erfolgreich eine Verbindung herstellt, wird das ConnectionEvent mit dem auf OPENED eingestellten Typ ausgelost. Wenn die Verbindung ausgelost oder geschlossen ist, wird ConnectionEvent mit dem Typ GESCHLOSSEN generiert. Die sendMessage-Methode eines Transport-Objekts generiert ein TransportEvent, das Informationen uber die Methoden Erfolg oder Misserfolg enthalt. Das Ereignisobjekt enthalt drei Arrays von Adressmatrizen: validSent, validUnsent und ungultig. NACHRICHT ZUGESTELLT. Nachricht an alle Empfanger erfolgreich gesendet. ValidSent enthalt alle Adressen. ValidUnsent und ungultig sind null. NACHRICHT NICHT ZUGESTELLT. Wenn ValidSent null ist, wurde die Nachricht nicht erfolgreich an alle Empfanger gesendet. ValidUnsent kann Adressen enthalten, die gultig sind. Ungultig kann ungultige Adressen enthalten. MESSAGEPARTIALLYDELIVERED. Nachricht wurde erfolgreich an einige Empfanger gesendet, aber nicht an alle. ValidSent enthalt Adressen von Empfangern, an die die Nachricht gesendet wurde. ValidUnsent hat gultige Adressen, aber die Nachricht wurde nicht an sie gesendet. Ungultig halt ungultige Adressen. Ein Store-Objekt erzeugt ConnectionEvent (erzeugt bei erfolgreicher Verbindung oder Schlie?en), StoreEvent (event. getMessageType-Methode gibt entweder ALERT oder NOTICE zuruck), FolderEvent (bei Erstellung, Loschung oder Umbenennung eines Ordners). Ein Folder-Objekt generiert ConnectionEvent (Ordner wird geoffnet oder geschlossen), FolderEvent (dieser Ordner erstellt, loscht oder umbenennt) und MessageCountEvent (Meldungszahlung wurde geandert, ausgeloste Nachrichtenobjekte sind im Ereignis). Mehr zu JavaMails Interne Funktionen JavaMail unterstutzt gleichzeitige Mehrfachsitzungen und jede Sitzung kann auf mehrere Nachrichtenspeicher und Transporte zugreifen. In einer JVM konnen mehrere Anwendungen dieselbe Standard-Mail-Sitzung gemeinsam nutzen. Auf diese Weise muss nur eine Anwendung die Informationen und den Code benotigen, um eine Verbindung zu einem Mailserver herzustellen und den Benutzer zu authentifizieren. Andere Anwendungen dann einfach anrufen senden oder holen Methoden. Die Session-Objekte getInstance (.), GetDefaultInstance (.), GetStore (.) Und getTransport (.) Suchen nach Ihren konfigurierten javaMail-Implementierungen in zwei Textdateien mit dem Namen javamail. providers und javamail. default. providers. Normalerweise mussen Sie nichts tun, da die Standardanbieter in der mail. jar-Datei ausreichend sind. Die Zeilen in diesen Dateien geben an, welche Java-Klasse fur welches Protokoll verwendet werden soll. Beispiel javamail. providers-Datei: Sie sucht nach konfigurierten Implementierungen wie folgt: Zuerst sucht sie mit der java. home-Systemeigenschaft nach der gewunschten Protokollkonfiguration in der Datei java. home /lib/javamail. providers. Es kann eine solche Datei pro JVM geben. Wenn die obige Datei nicht vorhanden ist oder das gewunschte Protokoll in der obigen Datei nicht gefunden wird, sucht es nach der gewunschten Protokollkonfiguration in der Datei META-INF / javamail. providers in Ihrem Anwendungsverzeichnis oder in der JAR-Datei. Es kann eine solche Datei pro Anwendung. Wenn die obige Datei nicht vorhanden ist oder das gewunschte Protokoll in der obigen Datei nicht gefunden wird, sucht es nach der gewunschten Protokolleinstellung in der Datei META-INF / javamail. default. providers in der Datei JavaMails mail. jar. Es kann eine solche Datei pro JavaMail-Installation geben. Fur ein bestimmtes Protokoll gewinnt der zuerst genannte Anbieter und wird standardma?ig verwendet. Sie konnen die Voreinstellung andern, indem Sie die E-Mail-Adresse festlegen. Wenn Sie das Session object. Or erstellen, konnen Sie es spater mit den Sessions getProviders () -, getProvider () - und setProvider () - Methoden andern. Ein Provider-Objekt kann nicht explizit erstellt werden, es muss mit der Methode session. getProviders () abgerufen werden, und es muss eines der in den Ressourcendateien konfigurierten sein. Die Provider in Ihren Dateien werden vor denjenigen hinzugefugt, die in den Standarddateien von mail. jar kommen. Alle sind aus Ihrem Code uber die Methode session. getProviders () verfugbar. JavaMail kann das richtige Transportobjekt instanziieren, das das richtige Protokoll basierend auf der Adresse des Empfangers implementiert. Wie es funktioniert, dass es sucht Adresse-Typ-to-Protokoll-Mapping in zwei Textdateien mit dem Namen javamail. address. map und javamail. default. address. map. Normalerweise mussen Sie nichts tun, da die Standardzuordnungen in mail. jar-Datei ausreichend sind. Jede Zeile dieser Dateien ordnet einen Adre?typ einem Transportprotokoll zu. Um einen Adresstyp zu bestimmen, verwenden Sie die Methode javax. mail. Address. getType (), um den Adresstyp zu erhalten. Zwei gemeinsame Adre?typen sind z. B. rfc822 (InternetAddress-Klasse) und News (NewsAddress-Klasse). Beispiel javamail. address. map. Es sucht nach konfigurierten Zuordnungen wie folgt (Dies ist die gleiche Suchreihenfolge wie fur die Provider-Datei oben): Zuerst sucht sie mit Hilfe der java. home-Systemeigenschaft nach der gewunschten Adre?typzuordnung im java. home / lib / javamail. Address. map-Datei. Es kann eine solche Datei pro JVM geben. Wenn die obige Datei nicht vorhanden ist oder der gewunschte Adresstyp nicht in der obigen Datei gefunden wird, sucht sie in der META-INF / javamail. address. map-Datei in Ihrem Anwendungsverzeichnis oder in der JAR-Datei nach der gewunschten Adre?typzuordnung. Es kann eine solche Datei pro Anwendung. Wenn die obige Datei nicht existiert oder der gewunschte Adresstyp nicht in der obigen Datei gefunden wird, sucht sie in der Datei META-INF / javamail. default. address. map in der Datei JavaMails mail. jar nach der gewunschten Adre?typzuordnung. Es kann eine solche Datei pro JavaMail-Installation geben. Ordner konnen auch uber URLNames aufgerufen werden, die aus Zeichenfolgen erstellt werden konnen, die Protokoll, Host, Port, Datei, Benutzername, Passwort angeben. RFC 1738 legt die URL-Syntax fur IP-basierte Protokolle wie IMAP4 und POP3 fest. Geben Sie -1 als Portnummer an, um den Standardanschluss zu verwenden. Richtige Moglichkeiten, einen Ordner zu loschen. Erweitern Sie den Ordner, schlie?en Sie ihn. Offnet und andert die Nachrichten aus dem Ordner. Geben Sie die Methode close ein, wenn der Parameter expunge auf true gesetzt ist. .