Tuesday 24 October 2017

Javamail Content Transfer Encoding Binäroptionen


Handhabung von Binärdaten mit Axis2 (MTOM / SWA) Inhalt Einführung Trotz der Flexibilität, der Interoperabilität und der globalen Akzeptanz von XML gibt es Zeiten, in denen die Serialisierung von Daten in XML nicht sinnvoll ist. Web-Service-Benutzer können binäre Anhänge von verschiedenen Sorten wie Bilder, Zeichnungen, XML-Dokumente, etc. zusammen mit einer SOAP-Nachricht zu übertragen. Solche Daten sind oft in einem bestimmten Binärformat. Herkömmlicherweise wurden zwei Techniken für den Umgang mit undurchsichtigen Daten in XML verwendet. Das Senden von binären Daten durch den Wert wird erreicht, indem opake Daten (natürlich nach irgendeiner Form der Codierung) als Element oder Attributinhalt der XML-Datenkomponente eingebettet werden. Der Hauptvorteil dieser Technik ist, dass sie Anwendungen die Möglichkeit gibt, Daten zu verarbeiten und zu beschreiben, die nur auf der XML-Komponente der Daten basieren. XML unterstützt undurchsichtige Daten als Inhalt durch die Verwendung von base64 oder hexadezimaler Textcodierung. Beide Techniken blasen die Größe der Daten. Für die UTF-8 unterliegende Textcodierung erhöht die base64-Codierung die Größe der Binärdaten um den Faktor 1,33x der Originalgröße, während 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) für diese Formate, insbesondere bei der Decodierung zurück in rohe Binärdateien. Das Senden binärer Daten durch Verweis wird dadurch erreicht, dass reine Binärdaten als externe, nicht geparste allgemeine Entitäten außerhalb des XML-Dokuments angehängt und dann Referenz-URIs als Elemente oder Attributwerte in diese Entitäten eingebettet werden. Dies verhindert das unnötige Aufblasen von Daten und die Verschwendung von Rechenleistung. Das primäre Hindernis für die Verwendung dieser unparsed Entities ist ihre starke Abhängigkeit von DTDs, die Modularität sowie die Verwendung von XML-Namespaces behindert. Es gab mehrere Spezifikationen, die in der Web-Services-Welt eingeführt wurden, um mit diesem binären Bindungsproblem unter Verwendung der quotby-Referenzquot-Technik umzugehen. SOAP mit Attachments ist ein solches Beispiel. Da SOAP DTDs in Nachrichten verbietet, führt 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 Anhänge mit dem Nachrichteninhalt verknüpft sind, befinden sie sich nicht innerhalb der Nachricht. Dies führt 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 Lösung des quotAttachmentsquot Problem konzentriert. MTOM versucht, die Vorteile der beiden obigen Techniken zu nutzen, indem man versucht, die beiden Techniken zusammenzuführen. MTOM ist eigentlich ein quotiertes Referenzquotverfahren. Das Drahtformat einer MTOM-optimierten Nachricht ist dasselbe wie die SOAP mit Attachments-Meldung, die es auch rückwärtskompatibel 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 binären Attachments (externe nicht geparste allgemeine Entitäten) der Nachricht zu verweisen. Durch die Verwendung dieses exklusiven Elements wird der angefügte binäre Inhalt logisch inline (durch Wert) mit dem SOAP-Dokument, obwohl es tatsächlich separat beigefügt ist. Dies vereinigt die beiden Realms, indem es ermöglicht wird, nur mit einem Datenmodell zu arbeiten. Dies ermöglicht es den Anwendungen zu verarbeiten und zu beschreiben, indem man nur den XML-Teil betrachtet, wodurch die Abhängigkeit 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 können diese binären 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 könnte, ist es notwendig, eine Eins-zu-eins-Korrespondenz zwischen XML-Infosets und XOP-Paketen zu haben. Daher ist die konzeptionelle Darstellung derartiger Binärdaten so, als wäre 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 unterstützt Base64-Codierung. SOAP mit Anhängen und MTOM (SOAP Message Transmission Optimization Mechanism). MTOM mit Axis2-Programmiermodell AXIOM ist (und kann das erste) Objektmodell sein, das binäre Daten halten kann. Es hat diese Fähigkeit, wie OMText rohe binäre Inhalte in Form von javax. activation. DataHandler halten kann. OMText wurde dafür aus zwei Gründen ausgewählt. 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 Empfänger erhalten bleiben. (Um den binären Inhalt in der gleichen Art von Objekt zu speichern, unabhängig davon, ob es optimiert ist oder nicht). MTOM ermöglicht es, selektiv Teile der Nachricht zu codieren, die es uns ermöglichen, base64encodierte Daten sowie extern angeschlossene rohe Binärdaten zu senden, auf die durch das in einer SOAP-Nachricht zu sendende "XOPquot-Element (optimierter Inhalt) verwiesen wird. Sie können angeben, ob ein OMText-Knoten, der rohe Binärdaten oder base64encodierte Binärdaten enthält, qualifiziert ist, zum Zeitpunkt des Aufbaus dieses Knotens oder später optimiert zu werden. Für optimale Effizienz von MTOM wird dem Benutzer empfohlen, kleinere binäre Anhänge mit base64encoding (nicht optimierten) und größeren Anhängen als optimierten Inhalt zu versenden. Außerdem kann ein Benutzer einen optimierbaren binären Inhaltsknoten unter Verwendung einer base64-codierten Zeichenfolge erzeugen, die einen codierten binären Inhalt enthält, der mit dem MIME-Typ der tatsächlichen binären Darstellung gegeben ist. Axis2 verwendet javax. activation. DataHandler, um die binären Daten zu verarbeiten. Alle optimierten Binärinhaltsknoten werden als Base64-Strings serialisiert, wenn quotMTOM nicht aktiviert ist. Sie können auch binäre 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-Hüllkurve unabhängig davon, ob sie optimalen Inhalt enthält oder nicht, als MTOM-optimierte MIME-Nachricht serialisiert. Axis2 serialisiert alle Binärinhaltsknoten als Base64-codierte Zeichenfolgen, unabhängig 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 enthält: Include (siehe XML-binäre 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 für ausgehende Nachrichten enableMTOM aktivieren. Um enableMTOM global für alle Dienste zu aktivieren, können 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 binären Daten in den Binärinhaltsknoten als Base64-codierte Zeichenfolgen serialisiert. Diese Konfiguration kann in services. xml auf der Basis von pro Service und pro Operation überschrieben werden. Nach der Einstellung dieses Parameters müssen Sie den Server neu starten. Zugriff auf empfangene Binärdaten (Beispielcode) Im Schreiben eines einfachen Webservers in Python, der es einem Benutzer ermöglicht, eine Datei mit multipart / form-data hochzuladen. Soweit ich sagen kann, müssen Multipart-MIME-Daten line-basiert sein. Zum Beispiel muss die Grenze am Anfang einer Zeile sein. Ich kann nicht herausfinden, wie binäre Daten in dieser Hinsicht behandelt wird. Mein Client (Firefox) ist nicht Kodierung in 7bit ASCII oder etwas, seine nur rohe binäre Daten sein Senden. Gibt es eine maximale Zeilenlänge angegeben für Multipart-Daten Ive versucht, die Suche durch die RFC für 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 Körperteile (d. h. der Körperinhalt eines einzelnen Teils in einer Multipart / Nachricht) müssen nur linienbasiert sein, indem die Grenze am Ende des Teils mit einer CRLF beginnt. Aber sonst müssen die Daten nicht zeilenbasiert sein, und wenn der Inhalt mit Zeilenumbrüchen in es geschieht, gibt es keine maximale Distanz zwischen ihnen, noch müssen sie in irgendeiner Weise entkommen (gut, es sei denn, die Content-Transfer - Encoding ist zitiert-string). Die 7-Bit-, 8-Bit - und Binäroptionen für Content-Transfer-Encoding deuten nicht darauf hin, dass jede Codierung auf den Daten durchgeführt wurde (und daher keine Codierung rückgängig gemacht werden muss), sondern nur die Art der Daten angeben Können Sie erwarten, in der Körperpartie zu sehen. Was ich in meiner schlecht ausgedrückten 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 willkürlich großen Puffer haben musste (zB wenn es nicht passiert war Zeilenumbrüche 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 Länge, so dass der Puffer wäre nie länger als das, sondern würde auch sicher zu beenden, wenn ein Zeilenumbruch angetroffen wurde. Dies stellte sicher, dass, wenn die Grenze kam (nach einer CRLF), es wäre am Anfang des Puffers. Ich musste ein wenig extra monkeying, um sicherzustellen, dass ich nicht enthalten, dass endgültige CRLF in der eigentlichen Körper 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 Überprüfung RFC 2045. Normalerweise wird binärer Inhalt von Ihrer Anwendung in BASE64 konvertiert und in der Multi-Part-Nachricht mit Content-Transfer-Encoding enthalten. Base64. Es gibt andere Mechanismen, um binäre Daten zu übertragen, aber das ist sehr häufig. Binärdaten werden in Bytes konvertiert und in Arbitrationslängen (abhängig von der Kodierungsvariante - siehe BASE64-Link oben) aufgeteilt. Die empfangene Anwendung decodiert sie dann in den ursprünglichen binären Inhalt. Ich bin nicht ein Python-Programmierer, aber ich würde überrascht sein, dass Sie wirklich zu jeder dieser Code. Ich vermute, es gibt vorgebaute Python-Bibliothek Funktionen, dies für 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 Subtilität in diesen RFCs, die durch mich weg: es sagt, dass mehrteilige Meldungen keine anderen Kodierungen als 7-bit, 8-bit und binary haben können (Dh nicht Base-64). Allerdings kann man sagen, dass die einzelnen Teile innerhalb des Multi-Teils eigene Content-Kodierungen haben können, so dass Sie korrekt sind, dass Base-64 möglich ist. Ndash sh1ftst0rm Mar 28 13 um 13:20 Deine Antwort 2016 Stack Exchange, IncGreetings alle. Ich hoffe, jemand kann mir ein paar Lichter über die Frage, die ich habe. Lesen der Javadoc von MimeMessages getInputStream (), heißt es, geben Sie einen decodierten Input-Stream für 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-Zeichensätze. Was habe ich falsch gemacht Wenn ich QPDecoderStream verwendet, um die Ausgabe von m. getInputStream () zu decodieren, dann ist natürlich das Ergebnis korrekt. Jedoch besiegt es den Zweck, weil das Javadoc sagt, daß getInputStream () einen decodierten Eingangsstrom zurückbringt. Wenn ein Content-Transfer-Encoding-Header-Feld erscheint als Teil eines Nachrichten-Header, gilt es für den gesamten Körper dieser Nachricht. Wenn ein Content-Transfer-Encoding-Header-Feld als Teil eines Entitys-Headers angezeigt wird, gilt es nur für den Körper dieser Entität. Wenn eine Entität vom Typ multipart ist, darf die Content-Transfer-Codierung keinen anderen Wert als 7bit, 8bit oder binary haben. Sie könnten 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 können senden oder abrufen E-Mail über 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 veröffentlichen, die NNTP verwenden. Beispielcode zum Versenden von E-Mails Zum Kompilieren und Ausführen benötigen Sie mail. jar (aus dem JavaMail-Download) und activation. jar (aus dem JavaBeans Activation Framework-Download) im Java-Klassenpfad. Sie müssen 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 möglicherweise 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 ausführen zu können, benötigen Sie mail. jar (aus dem JavaMail-Download) und activation. jar (aus dem JavaBeans Activation Framework-Download) im Java-Klassenpfad. Sie müssen 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 Ausführen benötigen Sie mail. jar (aus dem JavaMail-Download) und activation. jar (aus dem JavaBeans Activation Framework-Download) im Java-Klassenpfad. Sie müssen 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. Nützliche 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, können Sie Transport - und Store-Objekte erhalten, die bestimmte Protokolle zum Senden bzw. Abrufen von E-Mails unterstützen. 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 für 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 zurück. MimeMultipart fungiert als Container für 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 zurück. Der Index startet bei 0. Die addBodyPart (.) - Methode fügt 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, überprüfen 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 / enthält, verwenden Sie die MimePart-Methode getContent (). Die getSubType-Methode gibt den Multipart-Message-MIME-Subtyp zurück. Der Subtyp definiert die Beziehung zwischen den einzelnen Körperteilen 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 müssen, 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 können From, To, Subject, Reply-To usw. sein. Sie können auch Nicht-Standardattribute als Header hinzufügen. Ein BodyPart-Objekttyp verfügt nicht über Attribute, die From, To, Subject, ReplyTo oder andere Adressheader-Felder festlegen. Nachrichten werden in Ordnerobjekten gespeichert, die auch Unterordner enthalten können. Alle Mailserver haben den Ordner INBOX. Die Ordner-Klasse deklariert Methoden, die Nachrichten abrufen, anfügen, kopieren und löschen. 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 zurück. Fldr. list gibt alle Unterordner unter diesem Ordner zurück. Fldr. getFolder (folderName) gibt den benannten Unterordner zurück. 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 Löschen und Umbenennen des Ordners, das Auflisten und Erstellen von Unterordnern sowie die Überwachung neuer Nachrichten. Fldr. open öffnet ein Ordner-Objekt (nur wenn es Nachrichten enthalten kann). Sie können nicht öffnen, löschen und renameTo in einem geöffneten Ordner aufrufen. Ordner werden in einer Datenbank gespeichert, auf die von einer Store-Klasse zugegriffen wird, die einen Benutzernamen und ein Kennwort benötigt, 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 für 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 zurück. Sie können eine Nachricht entweder durch ihre Sequenznummer oder durch das entsprechende Message-Objekt selbst verweisen. Wenn Nachrichten, die als gelöscht markiert sind, tatsächlich gelöscht 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 ändern kann, verwenden Sie Referenzen auf Message-Objekte und nicht auf Sequenznummern als zwischengespeicherte Referenzen auf Nachrichten. Verwenden Sie FetchProfile, um selektiv Nachrichtenattribute / Inhalte für die Effizienz abzurufen: Schritte zur Verwendung von JavaMail Zuerst das Session-Objekt abrufen: Die Props Properties-Datei enthält Mail-Protokolle zu verwenden, Mail-Host und Port zu verbinden, username etc., die später verwendet werden Verbindung zum Mail-Server herstellen. Es kann leer sein, obwohl Sie vielleicht mail. store. protocol festlegen möchten. Mail. transport. protocol. Mail. host. Mail. user und mail. from Eigenschaften. Kennwörter können nicht mit Eigenschaften angegeben werden. Hier sind die verschiedenen Eigenschaften, die im Eigenschaften-Objekt sein können 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 nächste). Mail. host. Standard-Mailserver für das Senden und Empfangen von E-Mails. Mail. user. Mail-Server-Benutzername. Standardwert für 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 nächste). Mail. Protokoll. user. Protokollspezifischer Standardbenutzername für die Verbindung zum Mailserver. Defaults zu whats in mail. user-Eigenschaft. Mail. from. Gibt die Rücksendeadresse 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 können es später mit Session. setDebug-Methode überschreiben, 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 müssen Sie zunächst ein MimeMultipart-Objekt instanziieren. Der Standard-Subtyp eines Multipart-Inhalts ist gemischt. Sie können andere Untertypen wie alternative, verwandte, parallele und signierte angeben. Instanzieren und Festlegen von Inhalt von MimeBodyPart-Objekten Hinzufügen 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 möglich, Ereignis-Listener mit dem Transportobjekt zu registrieren. Je nach Adreßtyp des Empfängers 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 für das Sendeprotokoll spezifisch ist (normalerweise smtp) Event-Listener registrieren, wenn Sie möchten: Empfängeradresse erstellen: Nachricht senden: Optional können 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 zurückgeben Nachrichteninhalt: Nachrichtentext erhalten: Der Typ des zurückgesendeten Objekts hängt vom Typ des eigentlichen Inhalts ab. Ein Text / plain-Inhalt gibt normalerweise ein String-Objekt zurück. Ein multipart / ltwhierendes hiergt-Objekt gibt immer ein Multipart-Objekt oder seine Unterklasse zurück. Bei unbekannten Inhaltstypen werden alle Mail-spezifischen Codierungen decodiert und ein InputStream-Objekt zurückgegeben. Wenn Sie fertig sind, schließen Sie alle geöffneten Ordner und dann den Speicher. Utility-Klassen Mit Hilfe der MimeUtility-Klasse können 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 müssen diese Header-Felder vor dem Senden gefaltet (verpackt) werden, wenn sie die Zeilenlängenbegrenzung für den Transport übersteigen (1000 Byte für SMTP). Empfangene Header können gefaltet worden sein. Ihr Antrag ist verantwortlich für 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 zurück, 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 zurück. Sie sollten immer Header-Werte über 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 unterstützt, können Sie beliebige benutzerdefinierbare Flags für jede Nachricht festlegen, die zu diesem Ordner gehört. Andere Flags sind: ANSWERED. Nachricht wurde beantwortet. DRAFT: Die Nachricht ist ein Entwurf. FLAGGED. Markieren Sie eine Nachricht als gekennzeichnet. KÜRZLICH. Diese Nachricht ist neu in diesem Ordner angekommen. Dieses Flag wird gesetzt, wenn die Nachricht zum ersten Mal in den Ordner übertragen und gelöscht wird, wenn der Inhalt des Ordners geschlossen ist. Clients können dieses Flag nicht setzen. SEEN: Markiert eine Nachricht, die geöffnet wurde. Er wird gesetzt, wenn der Nachrichteninhalt abgerufen wird. LÖSCHEN. Ermöglicht undoable Löschen der Nachricht. Wenn Sie dieses Kennzeichen für eine Nachricht festlegen, wird es gelöscht, aber die Nachricht wird nicht physisch aus dem Ordner entfernt. Der Client ruft die Methode expunge auf einem Ordner auf, um alle gelöschten Nachrichten in diesem Ordner zu entfernen. Methoden zum Bedienen von Flags einer Nachricht JavaMail Ereignisse JavaMail verwendet JDK 1.1-Ereignishandhabungsmechanismus. Sie können Ihre Klasse als Zuhörer für 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 ausgelöst. Wenn die Verbindung ausgelöst oder geschlossen ist, wird ConnectionEvent mit dem Typ GESCHLOSSEN generiert. Die sendMessage-Methode eines Transport-Objekts generiert ein TransportEvent, das Informationen über die Methoden Erfolg oder Misserfolg enthält. Das Ereignisobjekt enthält drei Arrays von Adressmatrizen: validSent, validUnsent und ungültig. NACHRICHT ZUGESTELLT. Nachricht an alle Empfänger erfolgreich gesendet. ValidSent enthält alle Adressen. ValidUnsent und ungültig sind null. NACHRICHT NICHT ZUGESTELLT. Wenn ValidSent null ist, wurde die Nachricht nicht erfolgreich an alle Empfänger gesendet. ValidUnsent kann Adressen enthalten, die gültig sind. Ungültig kann ungültige Adressen enthalten. MESSAGEPARTIALLYDELIVERED. Nachricht wurde erfolgreich an einige Empfänger gesendet, aber nicht an alle. ValidSent enthält Adressen von Empfängern, an die die Nachricht gesendet wurde. ValidUnsent hat gültige Adressen, aber die Nachricht wurde nicht an sie gesendet. Ungültig hält ungültige Adressen. Ein Store-Objekt erzeugt ConnectionEvent (erzeugt bei erfolgreicher Verbindung oder Schließen), StoreEvent (event. getMessageType-Methode gibt entweder ALERT oder NOTICE zurück), FolderEvent (bei Erstellung, Löschung oder Umbenennung eines Ordners). Ein Folder-Objekt generiert ConnectionEvent (Ordner wird geöffnet oder geschlossen), FolderEvent (dieser Ordner erstellt, löscht oder umbenennt) und MessageCountEvent (Meldungszählung wurde geändert, ausgelöste Nachrichtenobjekte sind im Ereignis). Mehr zu JavaMails Interne Funktionen JavaMail unterstützt gleichzeitige Mehrfachsitzungen und jede Sitzung kann auf mehrere Nachrichtenspeicher und Transporte zugreifen. In einer JVM können mehrere Anwendungen dieselbe Standard-Mail-Sitzung gemeinsam nutzen. Auf diese Weise muss nur eine Anwendung die Informationen und den Code benötigen, 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 müssen Sie nichts tun, da die Standardanbieter in der mail. jar-Datei ausreichend sind. Die Zeilen in diesen Dateien geben an, welche Java-Klasse für 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 gewünschten 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 gewünschte Protokoll in der obigen Datei nicht gefunden wird, sucht es nach der gewünschten 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 gewünschte Protokoll in der obigen Datei nicht gefunden wird, sucht es nach der gewünschten Protokolleinstellung in der Datei META-INF / javamail. default. providers in der Datei JavaMails mail. jar. Es kann eine solche Datei pro JavaMail-Installation geben. Für ein bestimmtes Protokoll gewinnt der zuerst genannte Anbieter und wird standardmäßig verwendet. Sie können die Voreinstellung ändern, indem Sie die E-Mail-Adresse festlegen. Wenn Sie das Session object. Or erstellen, können Sie es später mit den Sessions getProviders () -, getProvider () - und setProvider () - Methoden ändern. 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 hinzugefügt, die in den Standarddateien von mail. jar kommen. Alle sind aus Ihrem Code über die Methode session. getProviders () verfügbar. JavaMail kann das richtige Transportobjekt instanziieren, das das richtige Protokoll basierend auf der Adresse des Empfängers 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 müssen 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 für die Provider-Datei oben): Zuerst sucht sie mit Hilfe der java. home-Systemeigenschaft nach der gewünschten 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 gewünschte 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 gewünschten Adreßtypzuordnung. Es kann eine solche Datei pro Anwendung. Wenn die obige Datei nicht existiert oder der gewünschte 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 gewünschten Adreßtypzuordnung. Es kann eine solche Datei pro JavaMail-Installation geben. Ordner können auch über URLNames aufgerufen werden, die aus Zeichenfolgen erstellt werden können, die Protokoll, Host, Port, Datei, Benutzername, Passwort angeben. RFC 1738 legt die URL-Syntax für IP-basierte Protokolle wie IMAP4 und POP3 fest. Geben Sie -1 als Portnummer an, um den Standardanschluss zu verwenden. Richtige Möglichkeiten, einen Ordner zu löschen. Erweitern Sie den Ordner, schließen Sie ihn. Öffnet und ändert die Nachrichten aus dem Ordner. Geben Sie die Methode close ein, wenn der Parameter expunge auf true gesetzt ist. .

No comments:

Post a Comment