Multipart Content Transfer Encoding Binär Optionen


Ich schreibe einen einfachen Webserver in Python, der es einem Benutzer ermöglicht, eine Datei mit Multipartform-Daten hochzuladen. Soweit ich sagen kann, werden Multipart-MIME-Daten linienbasiert sein. Zum Beispiel muss die Grenze am Anfang einer Linie sein. Ich kann nicht herausfinden, wie Binärdaten in dieser Hinsicht behandelt werden. Mein Client (Firefox) kodiert es nicht in 7bit ASCII oder irgendetwas, seine nur rohen Binärdaten sein Senden. Ist es aufgeteilt die Daten in Zeilen an beliebigen Orten Gibt es eine maximale Zeilenlänge für Multipart-Daten angegeben Ive versucht, durch die RFC für Multipartform-Daten suchen, aber nichts gefunden. Fragte Mar 27 13 um 16:54 Nach dem Graben durch die RFCs, ich glaube ich habe es endlich alles in meinem Kopf. Die Körperteile (d. h. der Körpergehalt eines einzelnen Teils in einer mehrteiligen Nachricht) müssen nur so sein, daß die Grenze am Ende des Teils mit einer CRLF beginnt. Andernfalls müssen die Daten nicht linienbasiert sein, und wenn der Inhalt in diesem Fall Zeilenumbrüche hat, gibt es keinen maximalen Abstand zwischen ihnen, noch müssen sie in irgendeiner Weise entkommen sein (gut, wenn nicht vielleicht die Content-Transfer - Encoding ist zitiert-String). Die 7-Bit-, 8-Bit - und Binäroptionen für Content-Transfer-Encoding zeigen nicht wirklich an, dass irgendeine Codierung auf den Daten durchgeführt wurde (und daher keine Codierung rückgängig gemacht werden muss), sie sind nur dazu gedacht, die Art der Daten anzugeben Sie können erwarten, im Körperteil zu sehen. Was ich in meiner schlecht ausgedrückten Frage wirklich bekam, war, wie man die Daten aus der Steckdose lernte, damit ich sicher sein konnte, dass ich die Grenze erwischte und ohne einen beliebig großen Puffer zu haben musste (zB wenn es keine Zeilenumbrüche gab Der Inhalt, und so eine readline bis zum Pufferung der ganzen Sache). Was ich am Ende tat, war die Pufferung aus der Steckdose mit einer Leseleitung mit einer maximalen Länge, so dass der Puffer würde nie länger als das sein, aber würde auch sicherstellen, zu beenden, wenn ein Zeilenumbruch angetroffen wurde. Dies stellte sicher, dass, wenn die Grenze kam (nach einem CRLF), wäre es am Anfang des Puffers. Ich musste ein bisschen extra monkeying herum, um sicherzustellen, dass ich nicht enthalten, dass endgültige CRLF in den tatsächlichen Körper Inhalt, weil nach dem RFC seine erforderlich vor der Grenze, und daher nicht Teil des Inhalts selbst. Beantwortet Apr 5 13 um 12:02 Versuchen Sie, RFC 2045 zu überprüfen. Typischerweise wird binärer Inhalt von Ihrer Anwendung in BASE64 umgewandelt und in der Multi-Part-Nachricht mit Content-Transfer-Encoding aufgenommen. Base64 Es gibt andere Mechanismen, um binäre Daten zu übertragen, aber das ist ziemlich häufig. Binäre Daten werden in Oktette umgewandelt und in beliebigen Längenfolgen ausgeteilt (abhängig von der Codierungsvariante - siehe BASE64 Link oben). Die empfangende Anwendung decodiert sie dann in den ursprünglichen Binärinhalt. Ich bin kein Python-Programmierer, aber ich wäre überrascht, dass du das wirklich selbst beherrschen musst. Ich vermute, es gibt vorgebaute Python-Bibliotheksfunktionen, um dies für Sie zu tun. Antwortete Mar 27 13 um 17:43 Danke, ich war auf der Suche nach einem anderen RFC, die nicht so informativ war. Ich habe auch gefunden RFC 2046, die spezifisch definiert mehrteilige Nachrichten in Abschnitt 5. Notieren Sie dort39s ein bisschen eine Subtilität in diesen RFCs, die durch mich aus: es heißt, multipart Nachrichten können keine anderen Kodierungen als 7-Bit, 8-Bit und binär (Dh nicht Base-64). Allerdings geht es weiter darauf hin, dass die einzelnen Teile innerhalb des Multi-Parts dort eigene Content-Codierungen haben können, also sind Sie richtig, dass Base-64 möglich ist. Ndash brianmearns Mar 29 13 bei 13:20 Ihre Antwort 2017 Stack Exchange, Inc5 Das Content-Transfer-Encoding Header-Feld Viele Content-Typen, die sinnvoll per E-Mail transportiert werden können, sind in ihrem natürlichen Format als 8-Bit-Zeichen oder Binär dargestellt Daten. Solche Daten können nicht über einige Transportprotokolle übertragen werden. Beispielsweise beschränkt RFC 821 Mailnachrichten auf 7-Bit-US-ASCII-Daten mit 1000 Zeichenzeilen. Es ist daher notwendig, einen Standardmechanismus für die erneute Codierung solcher Daten in ein 7-Bit-Kurzzeilenformat zu definieren. Dieses Dokument legt fest, dass solche Codierungen durch ein neues Content-Transfer-Encoding-Header-Feld angezeigt werden. Das Feld Content-Transfer-Encoding wird verwendet, um die Art der Transformation anzuzeigen, die verwendet wurde, um den Körper in einer akzeptablen Weise für den Transport darzustellen. Im Gegensatz zu Content-Typen ist eine Proliferation von Content-Transfer-Codierungswerten unerwünscht und unnötig. Allerdings ist es nicht möglich, nur einen einzigen Content-Transfer-Encoding-Mechanismus zu schaffen. Es besteht ein Kompromiss zwischen dem Wunsch nach einer kompakten und effizienten Codierung von weitgehend binären Daten und dem Wunsch nach einer lesbaren Codierung von Daten, die meist, aber nicht ganz, 7-Bit-Daten sind. Aus diesem Grund sind mindestens zwei Kodierungsmechanismen notwendig: eine lesbare Codierung und eine dichte Codierung. Das Feld Content-Transfer-Encoding ist so ausgelegt, dass es eine invertierbare Abbildung zwischen der nativen Repräsentation eines Datentyps und einer Repräsentation spezifiziert, die mit 7-Bit-Mail-Transportprotokollen, wie z. B. von RFC 821 (SMTP), leicht ausgetauscht werden kann. Dieses Feld wurde nicht von einem früheren Standard definiert. Der Feldwert ist ein einzelnes Token, das den Typ der Codierung angibt, wie unten aufgezählt. Formell: Diese Werte sind nicht zwischen Groß - und Kleinschreibung unterschieden. Das heißt, Base64 und BASE64 und bAsE64 sind alle äquivalent. Eine Kodierung von 7BIT erfordert, dass der Körper bereits in einer sieben-Bit-Mail-Ready-Darstellung ist. Dies ist der Standardwert - das heißt Content-Transfer-Encoding: 7BIT wird angenommen, wenn das Content-Transfer-Encoding-Header-Feld nicht vorhanden ist. Die Werte 8bit, 7bit und binär alle implizieren, dass keine Kodierung durchgeführt wurde. Allerdings sind sie potentiell als Anhaltspunkte für die Art der in dem Objekt enthaltenen Daten und daher für die Art der Kodierung nützlich, die möglicherweise für die Übertragung in einem gegebenen Transportsystem durchgeführt werden muss. 7bit bedeutet, dass die Daten alle als kurze Zeilen von US-ASCII-Daten dargestellt werden. 8bit bedeutet, dass die Zeilen kurz sind, aber es können nicht-ASCII-Zeichen (Oktette mit dem höherwertigen Bit gesetzt) ​​sein. Binär bedeutet, dass nicht nur Nicht-ASCII-Zeichen vorhanden sein können, sondern auch, dass die Zeilen nicht unbedingt kurz genug für den SMTP-Transport sind. Der Unterschied zwischen 8bit (oder irgendeinem anderen denkbaren Bitbreiten-Token) und dem Binär-Token besteht darin, dass die Binärdatei keine Einhaltung von Grenzen auf der Zeilenlänge oder der SMTP-CRLF-Semantik erfordert, während die Bit-Breiten-Token eine solche Adhärenz erfordern. Wenn der Körper Daten in einer beliebigen Bitbreite außer 7-Bit enthält, muss das entsprechende Bit-Breite-Content-Transfer-Encoding-Token verwendet werden (z. B. 8bit für nichtcodierte 8-Bit-weite Daten). Wenn der Körper Binärdaten enthält, muss das Binär-Content-Transfer-Encoding-Token verwendet werden. Die Unterscheidung zwischen den Content-Transfer-Encoding-Werten von Binär, 8bit usw. mag unwichtig erscheinen, da sie alle wirklich keine bedeuten - das heißt, es gab keine Verschlüsselung der Daten für den Transport. Allerdings wird eine klare Etikettierung von enormen Werten für Gateways zwischen zukünftigen Mail-Transportsystemen mit unterschiedlichen Fähigkeiten beim Transport von Daten, die nicht die Beschränkungen von RFC 821 Transport erfüllen. Ab der Veröffentlichung dieses Dokuments gibt es keine standardisierten Internet-Transporte, für die es legitim ist, unverschlüsselte 8-Bit - oder Binärdaten in Postkörperschaften einzuschließen. So gibt es keine Umstände, in denen die 8bit oder binäre Content-Transfer-Encoding ist eigentlich legal im Internet. Für den Fall jedoch, dass 8-Bit - oder Binär-Mail-Transport in Internet-Mail Realität wird oder wenn dieses Dokument in Verbindung mit einem anderen 8-Bit - oder binärfähigen Transportmechanismus verwendet wird, sollten 8-Bit - oder Binärkörper markiert werden Als solche mit diesem Mechanismus. Die fünf für das Content-Transfer-Encoding-Feld definierten Werte beinhalten nichts über den anderen Content-Type als den Algorithmus, mit dem er codiert wurde, oder die Transportsystemanforderungen, wenn er nicht codiert wurde. Implementoren können ggf. neue Content-Transfer-Encoding-Werte definieren, müssen aber ein x-Token verwenden, das ein Name ist, der von X - vorangestellt ist, um seinen Nicht-Standardstatus anzugeben, z. B. Content-Transfer-Encoding: x-my-new-encoding. Im Gegensatz zu Content-Typen und Subtypen ist die Erstellung neuer Content-Transfer-Encoding-Werte jedoch explizit und stark entmutigt, da es wahrscheinlich ist, die Interoperabilität mit wenig potenziellen Nutzen zu behindern. Ihre Verwendung ist nur als Ergebnis einer Vereinbarung zwischen kooperierenden User Agenten erlaubt. Wenn ein Content-Transfer-Encoding-Header-Feld als Teil eines Message-Headers erscheint, gilt es für den gesamten Körper dieser Nachricht. Wenn ein Content-Transfer-Encoding-Header-Feld als Teil eines Body-Parts-Headers erscheint, gilt es nur für den Körper dieses Body-Parts. Wenn eine Entität vom Typ multipart oder Nachricht ist, ist der Content-Transfer-Codierung nicht erlaubt, einen anderen Wert als eine Bitbreite (z. B. 7bit, 8bit usw.) oder binär zu haben. Es ist anzumerken, dass E-Mail charakterorientiert ist, so dass die hier beschriebenen Mechanismen Mechanismen zur Kodierung von beliebigen Byte-Streams, nicht Bit-Streams sind. Wenn ein Bitstrom über einen dieser Mechanismen codiert werden soll, muss er zunächst mit dem Netzwerk-Standard-Bit-Befehl (Big-Endian) in einen 8-Bit-Byte-Stream konvertiert werden, bei dem die früheren Bits in einem Stream die höher - Bits in einem Byte bestellen Ein Bitstrom, der nicht an einer 8-Bit-Grenze endet, muss mit Nullen gefüllt werden. Dieses Dokument bietet einen Mechanismus für die Feststellung der Hinzufügung solcher Polsterung im Falle der Anwendung Content-Type, die einen Padding-Parameter hat. Die hier definierten Codierungsmechanismen kodieren explizit alle Daten in ASCII. So heißt es beispielsweise, dass eine Entität Header-Felder wie: Dies sollte interpretiert werden, um zu bedeuten, dass der Körper eine base64 ASCII-Codierung von Daten ist, die ursprünglich in ISO-8859-1 war, und wird in diesem Zeichen wieder nach der Decodierung gesetzt . In den folgenden Abschnitten werden die beiden Standardcodierungsmechanismen definiert. Die Definition neuer Content-Transfer-Codierungen ist ausdrücklich entmutigt und sollte nur dann auftreten, wenn dies unbedingt erforderlich ist. Alle Content-Transfer-Encoding-Namespace außer dem, der mit X - beginnt, ist für die zukünftige Verwendung explizit für die IANA reserviert. Private Vereinbarungen über Content-Transfer-Codierungen werden ebenfalls explizit entmutigt. Bestimmte Content-Transfer-Encoding-Werte dürfen nur bei bestimmten Content-Typen verwendet werden. Insbesondere ist es ausdrücklich verboten, andere Codierungen außer 7bit, 8bit oder binär mit jedem Content-Type zu verwenden, der rekursiv andere Content-Type-Felder enthält, insbesondere die Multipart - und Message-Content-Typen. Alle Kodierungen, die für Körper vom Typ multipart oder Nachricht gewünscht werden, müssen auf der innersten Ebene durchgeführt werden, indem der eigentliche Körper, der codiert werden muss, kodiert. ANMERKUNG ZUM ENCODIEREN VON BESCHRÄNKUNGEN: Obwohl das Verbot der Verwendung von Content-Transfer-Codierungen auf Daten vom Typ Multipart oder Meldung übermäßig restriktiv erscheinen mag, ist es notwendig, verschachtelte Codierungen zu verhindern, in denen Daten mehrfach über einen Codierungsalgorithmus übergeben werden und sein müssen Mehrfach decodiert, um ordnungsgemäß zu sehen. Verschachtelte Codierungen verleihen den Agenten eine beträchtliche Komplexität: Abgesehen von den offensichtlichen Effizienzproblemen mit solchen Mehrfachkodierungen können sie die Grundstruktur einer Nachricht verdecken. Insbesondere können sie implizieren, dass mehrere Decodierungsoperationen notwendig sind, um einfach herauszufinden, welche Art von Objekten eine Nachricht enthält. Das Verbieten von verschachtelten Verschlüsselungen kann den Job von bestimmten Mail-Gateways komplizieren, aber das scheint weniger ein Problem zu sein als die Wirkung von verschachtelten Codierungen auf Benutzeragenten. ANMERKUNG ZUR BEZIEHUNG ZWISCHEN INHALT-TYP UND INHALT - TRANSFER-ENKODIERUNG Es scheint, dass die Content-Transfer-Encoding aus den Merkmalen des zu codierenden Content-Typs oder zumindest jener gewidmet werden könnte Content-Transfer-Codierungen können für die Verwendung mit bestimmten Content-Typen beauftragt werden. Es gibt mehrere Gründe, warum dies nicht der Fall ist. Erstens, da die verschiedenen Arten von Transporten für Post verwendet werden, können einige Codierungen für einige Content-Typetransport-Kombinationen und nicht für andere geeignet sein. (Z. B. bei einem 8-Bit-Transport wäre keine Kodierung für Text in bestimmten Zeichensätzen erforderlich, während solche Codierungen eindeutig für 7-Bit-SMTP erforderlich sind.) Zweitens können bestimmte Content-Typen unterschiedliche Arten von Transfercodierungen unter Verschiedene Umstände. Zum Beispiel könnten viele PostScript-Gremien vollständig aus kurzen Zeilen von 7-Bit-Daten bestehen und benötigen daher wenig oder keine Codierung. Andere PostScript-Felder (insbesondere solche, die den Binärcodierungsmechanismus von Level 2 PostScripts verwenden) können nur mit einer binären Transportcodierung vernünftigerweise dargestellt werden. Schließlich, da Content-Type ein offener Spezifikationsmechanismus sein soll, verbindet die strikte Spezifikation einer Assoziation zwischen Content-Typen und Codierungen effektiv die Spezifikation eines Anwendungsprotokolls mit einem bestimmten untergeordneten Transport. Dies ist nicht wünschenswert, da die Entwickler eines Content-Type nicht alle bewährten Transporte und deren Einschränkungen kennen müssen. HINWEIS ÜBER DIE ÜBERSETZUNG VON KODEN Die zitiert-bedruckbaren und base64-Kodierungen sind so ausgelegt, dass eine Umwandlung zwischen ihnen möglich ist. Das einzige Problem, das bei einer solchen Umwandlung entsteht, ist die Handhabung von Zeilenumbrüchen. Beim Umwandeln von quoted-printable zu base64 muss ein Zeilenumbruch in eine CRLF-Sequenz umgewandelt werden. Ähnlich sollte eine CRLF-Sequenz in base64-Daten in einen zitierten druckbaren Zeilenumbruch konvertiert werden, aber nur bei der Umwandlung von Textdaten. ANMERKUNG ÜBER KANONISCHES KODIERMODELL: In früheren Entwürfen dieses Memos gab es einige Verwirrung hinsichtlich des Modells, wann E-Mail-Daten in kanonische Form umgewandelt und verschlüsselt werden sollten, und insbesondere, wie sich dieser Prozess auf die Behandlung von CRLFs auswirken würde Die Darstellung von Newlines variiert stark von System zu System. Aus diesem Grund wird ein kanonisches Modell für die Codierung als Anhang H dargestellt. 5.1 Quoted-Printable Content-Transfer-Encoding Die Quoted-Printable-Codierung soll Daten darstellen, die weitgehend aus Oktetten bestehen, die mit druckbaren Zeichen im ASCII-Zeichensatz übereinstimmen. Es kodiert die Daten so, dass die resultierenden Oktette unwahrscheinlich sind, dass sie per Post transportiert werden. Wenn die zu codierenden Daten meist ASCII-Text sind, bleibt die codierte Form der Daten von Menschen weitgehend erkennbar. Ein Körper, der ganz ASCII ist, kann auch in Quoted-Printable codiert werden, um die Integrität der Daten zu gewährleisten, falls die Nachricht durch ein Zeichen-übersetzendes und ein Line-Wrapping-Gateway geht. In dieser Kodierung sollen die Bytes durch die folgenden Regeln bestimmt werden: Regel 1: (Allgemeine 8-Bit-Darstellung) Jedes Oktett, mit Ausnahme derjenigen, die einen Zeilenumbruch nach dem Zeilenumbruch der kanonischen Form der zu codierenden Daten angeben, Kann durch eine gefolgt von einer zweistelligen hexadezimalen Darstellung des Oktettswertes dargestellt werden. Die Ziffern des hexadezimalen Alphabets sind zu diesem Zweck 0123456789ABCDEF. Großbuchstaben müssen beim Senden von hexadezimalen Daten verwendet werden, obwohl eine robuste Implementierung die Auswahl von Kleinbuchstaben beim Empfang auswählen kann. So kann beispielsweise der Wert 12 (ASCII-Formularvorschub) durch 0C dargestellt werden und der Wert 61 (ASCII EQUAL SIGN) kann durch 3D dargestellt werden. Außer wenn die folgenden Regeln eine alternative Kodierung zulassen, ist diese Regel obligatorisch. Regel 2: (wörtliche Darstellung) Octets mit Dezimalwerten von 33 bis 60 einschließlich und 62 bis 126 einschließlich können als ASCII-Zeichen dargestellt werden, die diesen Oktetten entsprechen (EXCLAMATION POINT durch WENIGER ALS UND GRÖSSER ALS durch TILDE ). Regel 3: (White Space) Octets mit Werten von 9 und 32 können als ASCII TAB (HT) bzw. SPACE Zeichen dargestellt werden, aber NICHT am Ende einer codierten Zeile so dargestellt werden. Alle TAB (HT) oder SPACE Zeichen auf einer codierten Zeile müssen auf dieser Zeile durch ein druckbares Zeichen verfolgt werden. Insbesondere kann am Ende einer codierten Linie, die einen weichen Zeilenumbruch anzeigt (siehe Regel 5), einem oder mehreren TAB (HT) oder SPACE Zeichen folgen. Daraus folgt, dass ein Oktett mit dem Wert 9 oder 32, das am Ende einer codierten Linie erscheint, gemäß Regel 1 dargestellt werden muss. Diese Regel ist notwendig, weil einige MTAs (Message Transport Agents, Programme, die Nachrichten von einem Benutzer zum anderen transportieren oder ausführen) Ein Teil solcher Transfers) sind bekannt, um Textzeilen mit SPACEs aufzutragen, und andere sind dafür bekannt, Leerzeichen aus dem Ende einer Zeile zu entfernen. Daher muss bei der Decodierung eines zitiert-bedruckbaren Körpers jeder nachlaufende Leerraum auf einer Zeile gelöscht werden, da er zwangsläufig von Zwischen-Transport-Agenten hinzugefügt worden ist. Regel 4 (Zeilenumbrüche) Ein Zeilenumbruch in einem Textkörperteil, unabhängig davon, was seine Darstellung nach der kanonischen Darstellung der zu codierenden Daten folgt, muss durch einen (RFC 822) Zeilenumbruch, der eine CRLF-Sequenz ist, dargestellt werden Die Quoted - Printable Codierung. Wenn isolierte CRs und LFs oder LF CR und CR LF Sequenzen in binären Daten nach der kanonischen Form erscheinen dürfen, müssen sie mit den 0D, 0A, 0A0D und 0D0A Notationen dargestellt werden. Beachten Sie, dass viele Implementierungen wählen können, um die lokale Darstellung von verschiedenen Inhaltstypen direkt zu codieren. Insbesondere kann dies auf Klartextmaterial auf Systemen angewendet werden, die Newline-Konventionen außer CRLF-Trennzeichen verwenden. Eine solche Implementierung ist zulässig, aber die Erzeugung von Zeilenumbrüchen muss verallgemeinert werden, um den Fall zu berücksichtigen, in dem alternative Darstellungen von Zeilenumbruchsequenzen verwendet werden. Regel 5 (Soft Line Breaks) Die Quoted-Printable Codierung ERFORDERT, dass codierte Zeilen nicht mehr als 76 Zeichen lang sind. Wenn längere Zeilen mit der Quoted-Printable-Codierung codiert werden sollen, müssen Softline-Pausen verwendet werden. Ein Gleichheitszeichen als letztes Zeichen auf einer codierten Zeile zeigt einen solchen nicht signifikanten (weichen) Zeilenumbruch im codierten Text an. Wenn also die rohe Form der Zeile eine einzige unverschlüsselte Zeile ist, die besagt: Dies kann in der Zitat-Printable-Codierung dargestellt werden, da Dies einen Mechanismus gibt, mit dem lange Zeilen so codiert werden, dass sie vom Benutzer wiederhergestellt werden Agent. Die 76-Zeichen-Grenze zählt nicht die nachlaufende CRLF, sondern zählt alle anderen Zeichen, einschließlich gleicher Zeichen. Da der Bindestrich (-) als selbst in der Zitat-Printable-Codierung dargestellt ist, muss bei der Kapselung eines zitierten druckfähigen codierten Körpers in einer multipartigen Entität darauf geachtet werden, dass die Kapselungsgrenze irgendwo im kodierten Körper nicht erscheint . (Eine gute Strategie ist es, eine Grenze zu wählen, die eine Zeichenfolge enthält, wie sie in einem zitierten Ausdruck nicht erscheinen kann. Siehe die Definition von Multipart-Nachrichten später in diesem Dokument.) HINWEIS: Die zitiert-druckbare Kodierung repräsentiert etwas von einem Kompromiss zwischen Lesbarkeit und Zuverlässigkeit im Transport. Bodies, die mit der zitiert-bedruckbaren Codierung codiert werden, funktionieren zuverlässig über die meisten Mail-Gateways, können aber nicht perfekt über ein paar Gateways funktionieren, insbesondere solche, die eine Übersetzung in EBCDIC beinhalten. (In der Theorie könnte ein EBCDIC-Gateway eine zitierte druckbare Stelle entschlüsseln und mit base64 neu kodieren, aber solche Gateways existieren noch nicht.) Ein höheres Vertrauensniveau wird durch die base64 Content-Transfer-Encoding angeboten. Ein Weg, um einen vernünftig zuverlässigen Transport durch EBCDIC-Gateways zu erhalten, ist auch die ASCII-Zeichen nach Regel 1 anzugeben. Siehe Anhang B für weitere Informationen. Da zitiert druckfähige Daten grundsätzlich als linienorientiert angenommen werden, ist zu erwarten, dass die Pausen zwischen den Zeilen der zitierten druckbaren Daten im Transport verändert werden können, und zwar in der gleichen Weise, dass die Klartextpost immer in der Internetpost geändert wurde Beim Übergang zwischen Systemen mit unterschiedlichen Newline-Konventionen. Wenn solche Änderungen wahrscheinlich eine Korruption der Daten darstellen, ist es wahrscheinlich sinnvoller, die Base64-Codierung zu verwenden, anstatt die zitierte druckbare Codierung. 5.2 Base64 Content-Transfer-Encoding Die Base64 Content-Transfer-Encoding ist so konzipiert, dass sie beliebige Sequenzen von Oktetten in einer Form darstellt, die nicht menschlich lesbar ist. Die Codierungs - und Decodierungsalgorithmen sind einfach, aber die codierten Daten sind konsequent nur etwa 33 Prozent größer als die nichtcodierten Daten. Diese Codierung basiert auf dem, der in Privacy Enhanced Mail Anwendungen verwendet wird, wie in RFC 1113 definiert. Die base64-Codierung wird von RFC 1113 mit einer Änderung angepasst: base64 eliminiert den Mechanismus für eingebetteten Klartext. Es wird eine 65-stellige Teilmenge von US-ASCII verwendet, so dass 6 Bits pro druckfähigem Zeichen dargestellt werden können. (Das zusätzliche 65. Zeichen, wird verwendet, um eine spezielle Verarbeitungsfunktion zu bedeuten.) HINWEIS: Diese Untermenge hat die wichtige Eigenschaft, dass sie in allen Versionen von ISO 646, einschließlich US ASCII identisch dargestellt ist, und alle Zeichen in der Teilmenge sind ebenfalls dargestellt Identisch in allen Versionen von EBCDIC. Andere populäre Codierungen, wie z. B. die von dem UUENCODE-Dienstprogramm verwendete Codierung und die als Teil von Level 2 PostScript angegebene Base85-Codierung, teilen diese Eigenschaften nicht und erfüllen somit nicht die Portabilitätsanforderungen, die eine binäre Transportcodierung für Mail treffen muss. Der Codierungsprozess repräsentiert 24-Bit-Gruppen von Eingangsbits als Ausgabe-Strings mit 4 codierten Zeichen. Von links nach rechts wird eine 24-Bit-Eingangsgruppe durch die Verkettung von 3 8-Bit-Eingangsgruppen gebildet. Diese 24 Bits werden dann als 4 verkettete 6-Bit-Gruppen behandelt, von denen jede in einer Einzelstelle im base64-Alphabet übersetzt wird. Beim Codieren eines Bitstroms über die Base64-Codierung muss angenommen werden, dass der Bitstrom mit dem höchstwertigen Bit zuerst geordnet wird. Das heißt, das erste Bit im Strom wird das höherwertige Bit im ersten Byte sein, und das achte Bit wird das niedrigwertige Bit im ersten Byte sein, und so weiter. Jede 6-Bit-Gruppe wird als Index in ein Array von 64 druckbaren Zeichen verwendet. Das Zeichen, auf das der Index verweist, wird in die Ausgabezeichenfolge gesetzt. Diese Zeichen, die in der nachstehenden Tabelle 1 identifiziert wurden, werden so gewählt, dass sie universell darstellbar sind, und das Set schließt Zeichen mit besonderer Bedeutung für SMTP (zB CR, LF) und die in diesem Dokument definierten Kapselungsgrenzen aus (zB -) . Tabelle 1: Das Base64-Alphabet Der Ausgabestream (codierte Bytes) muss in Zeilen mit maximal 76 Zeichen dargestellt werden. Alle Zeilenumbrüche oder andere Zeichen, die nicht in Tabelle 1 gefunden werden, müssen durch Decodierungssoftware ignoriert werden. In base64-Daten geben Zeichen, die sich von denen in Tabelle 1 unterscheiden, Zeilenumbrüche und andere Leerzeichen wahrscheinlich einen Übertragungsfehler an, über den eine Warnmeldung oder sogar eine Nachrichtenabweisung unter bestimmten Umständen angemessen sein könnte. Eine spezielle Verarbeitung wird durchgeführt, wenn weniger als 24 Bits am Ende der zu codierenden Daten verfügbar sind. Ein vollständiges Kodierungsquantum wird immer am Ende eines Körpers vollendet. Wenn weniger als 24 Eingangsbits in einer Eingangsgruppe verfügbar sind, werden nullbits hinzugefügt (rechts), um eine ganzzahlige Anzahl von 6-Bit-Gruppen zu bilden. Ausgabezeichenpositionen, die nicht für die Darstellung von tatsächlichen Eingangsdaten benötigt werden, werden auf das Zeichen gesetzt. Da alle base64-Eingänge eine ganzzahlige Anzahl von Oktetten sind, können nur die folgenden Fälle auftreten: (1) Das endgültige Quantenkodierungseingabe ist ein ganzzahliges Vielfaches von 24 Bits, die endgültige Einheit der codierten Ausgabe ist ein ganzzahliges Vielfaches von 4 Zeichen Ohne Füllung, (2) das endgültige Quantum der Codierungseingabe ist genau 8 Bits hier, die endgültige Einheit der codierten Ausgabe wird zwei Zeichen gefolgt von zwei padding Zeichen, oder (3) das endgültige Quantum der Codierungseingabe ist genau 16 Bits hier , Wird die endgültige Einheit der codierten Ausgabe drei Zeichen gefolgt von einem Polsterzeichen. Es ist darauf zu achten, dass die korrekten Oktette für Zeilenumbrüche verwendet werden, wenn base64-Codierung direkt auf Textmaterial angewendet wird, das nicht in kanonische Form umgewandelt wurde. Insbesondere sollten Textzeilenpausen vor der Base64-Codierung in CRLF-Sequenzen umgewandelt werden. Wichtig ist, dass dies direkt durch den Encoder statt in einem vorherigen Kanonisierungsschritt in einigen Implementierungen erfolgen kann. HINWEIS: Es besteht keine Notwendigkeit, sich darum zu kümmern, offensichtliche Kapselungsgrenzen innerhalb von base64-codierten Teilen von multipart-Entitäten zu zitieren, da keine Bindestrichzeichen in der base64-Codierung verwendet werden. Content-Transfer-Encoding: 8bit fügte falsch zu Header von multipart E-Mails mit Inline-Bildern hinzu Antwortet auf eine HTML-Nachricht an die Liste, wird die ursprünglich zitierte Nachricht als die korrekte Klartextversion der Nachricht gerendert, gefolgt von einem einfachen Text-Rendering der HTML-Quelle der HTML-Version der Nachricht und einer einfachen Text-Base64-Codierung Von Inline-Bildern. Dieses Verhalten dokumentiert bisher in Nachrichten, die von Postbox 3.05 für Mac OS X gesendet wurden, wobei das Inline-Bild das Profilbild des Absenders aus dem Adressbuch ist und die HTML-Nachricht ansonsten grundlegende Formatierung ist. Um zu bestätigen, ob dies für dieses E-Mail-Programm spezifisch ist. Babbage Credit Namensnennung: babbage kommentiert 8. September 2012 um 9:40 Uhr Zitierte HTML-Nachrichten werden inline als Klartext-Versionen von Code gerendert Inline-Bilder werden als Klartext-Versionen von Code gerendert. Bestätigt, dass dieses Problem nicht auftritt, wenn ich die Postbox-Einstellung deaktiviere , Schließen Sie Kontaktbilder für jeden Teilnehmer ein, wenn Sie zusammenfassen, was zu einem Teil in der multipartigen HTML-E-Mail von imagejpeg führt. Also ist dieses Problem wahrscheinlich eingeschränkt, wenn ein Inline-Bild in einer Gruppennachricht enthalten ist. Babbage Credit Namensnennung: babbage kommentiert 8. September 2012 um 9:51 am Bestätigt gibt es kein Problem Senden einer Nachricht an die Liste mit einer Standard-Jpg-Datei als Anhang, anstatt Inline. (Es kann immer noch Inline angezeigt werden, abhängig vom Mail-Client.) Bestätigt ein Inline-Bild in der ursprünglichen Nachricht führt dazu, dass die HTML - und imagejpeg-Anlage als Klartext in der gesendeten Nachricht gerendert wird, so dass dies nicht auf Nachrichtenantworten beschränkt ist. Babbage Credit Namensnennung: babbage kommentiert 8. September 2012 um 9:59 Uhr Problem tritt mit dem Abschnitt von ogmailinglisttransport. inc in c. Zeile 908 (Zeilennummer kann sich aufgrund meiner Arbeit in der Datei geändert haben), in dem Abschnitt, der beginnt: Dies ist der Abschnitt des Codes, der dieses Problem verursacht zu verursachen scheint. E-Mails mit Inline-Bildern haben Header wie: Content-Type: multipartmixed boundaryDrupal-OG-Mailingliste - 1143534839 charsetUTF-8 E-Mails ohne das Problem haben keine Boundary-OG-Mailingliste - 1143534839 und haben stattdessen etwas wie: Content-Type: multipartmixed Grenze ------------ 050107000403000604050201 charsetUTF-8 Natürlich ist die genaue Art der Grenze wahrscheinlich etwas E-Mail-Client-spezifisch zu senden, aber das scheint es auf ein Problem in der Erstellung zu verkleinern Einer neuen MIME-Einheit wie oben angegeben. Babbage Credit Namensnennung: babbage kommentiert 8. September 2012 um 10:19 Uhr Hmm. E-Mails mit diesem Problem haben die folgende Header-Struktur: Das heißt, der primäre Header sagt, dass die Content-Transfer-Encoding 8bit (und UTF-8) ist, aber dann sagt jeder Unterabschnitt, dass es 7bit (und ISO-8859-1, in Der Fall dieser Meldungen). Ich denke, die 8bit7bit Diskrepanz könnte ein Problem hier sein babbage Credit Attribution: babbage kommentiert 8. September 2012 um 9:10 Uhr 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 Body-Parts-Headers erscheint, gilt es nur für den Körper dieses Body-Parts. Wenn eine Entität vom Typ multipart oder Nachricht ist, ist der Content-Transfer-Codierung nicht erlaubt, einen anderen Wert als eine Bitbreite (z. B. 7bit, 8bit usw.) oder binär zu haben. Das Vorhandensein einer expliziten 8-Bit-Spezifikation im Header überschreibt also die 7-Bit-Spezifikationen in der Multipart-Nachricht. Sogar das Fehlen jeglicher Content-Transfer-Encoding in der Header würde dieses Problem vermeiden, da beide dann die Body-Parts-Spezifikationen gelten würden, sondern auch, weil das gleiche Dokument 7bit festlegt, ist die Voreinstellung, wenn eine Codierung nicht angegeben ist.

Comments

Popular Posts