Frage

Ich habe viele E-Mails kommen aus verschiedenen Quellen. sie haben alle Anhänge, von denen viele Anlagennamen in chinesischen haben, so dass diese Namen umgewandelt werden base64 in ihrem E-Mail-Clients.

Wenn ich diese E-Mails erhalten, möchte ich den Namen entschlüsseln. aber es gibt auch andere Namen, die sind nicht base64. Wie kann ich unterscheiden, ob ein String base64 ist oder nicht, mit dem jython Programmiersprache?

Ie.

Erster attachment:

------=_NextPart_000_0091_01C940CC.EF5AC860
Content-Type: application/vnd.ms-excel;
 name="Copy of Book1.xls"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
 filename="Copy of Book1.xls"

zweiter Befestigungs:

------=_NextPart_000_0091_01C940CC.EF5AC860
Content-Type: application/vnd.ms-excel;
 name="=?gb2312?B?uLGxvmhlbrixsb5nLnhscw==?="
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
 filename="=?gb2312?B?uLGxvmhlbrixsb5nLnhscw==?="  

Bitte beachten Sie beide " Content-Transfer-Encoding " haben base64

War es hilfreich?

Lösung

  

Bitte beachten Sie beide Content-Transfer-Encoding haben base64

In diesem Fall nicht relevant, die Content-Transfer-Encoding gilt nur für den Körper Nutzlast, nicht auf die Header.

=?gb2312?B?uLGxvmhlbrixsb5nLnhscw==?=

Das ist ein RFC2047 -encoded Header-Atom. Die stdlib Funktion, sie zu entschlüsseln ist email.header.decode_header. Es braucht noch ein wenig Nachbearbeitung das Ergebnis dieser Funktion zu interpretieren aber:

import email.header
x= '=?gb2312?B?uLGxvmhlbrixsb5nLnhscw==?='
try:
    name= u''.join([
        unicode(b, e or 'ascii') for b, e in email.header.decode_header(x)
    ])
except email.Errors.HeaderParseError:
    pass # leave name as it was

Allerdings ...

Content-Type: application/vnd.ms-excel;
 name="=?gb2312?B?uLGxvmhlbrixsb5nLnhscw==?="

Das ist einfach falsch. Was Mailer erstellt es? RFC2047 Codierung kann nur in Atomen vorkommen, und ein quoted-String ist kein Atom. RFC2047 §5 bestreitet dies ausdrücklich:

  
      
  • Ein 'codiert-Wort' in einem 'quoted-String' darf nicht erscheinen.
  •   

Die akzeptierte Art und Weise Parameter Header, wenn lange Zeichenfolge oder Unicode-Zeichen zu kodieren vorhanden sind, ist RFC2231 , die eine ganz neue Tüte verletzt ist. Aber Sie sollten eine Standard-Mail-Parsing-Bibliothek verwenden, die mit dem für Sie fertig zu werden.

So könnten Sie die '=?' in Dateinamen Parameter erkennen, wenn Sie wollen, und versuchen Sie es über RFC2047 zu entschlüsseln. Doch die streng sprachige richtige Sache zu tun ist, um das Kuvert an seinem Wort zu nehmen und die Datei wirklich =?gb2312?B?uLGxvmhlbrixsb5nLnhscw==?= rufen!

Andere Tipps

Der Header-Wert sagt Ihnen:

=?gb2312?B?uLGxvmhlbrixsb5nLnhscw==?=

"=?"     introduces an encoded value
"gb2312" denotes the character encoding of the original value
"B"      denotes that B-encoding (equal to Base64) was used (the alternative 
         is "Q", which refers to something close to quoted-printable)
"?"      functions as a separator
"uLG..." is the actual value, encoded using the encoding specified before
"?="     ends the encoded value

So Aufspaltung auf "?" eigentlich bekommt man diese (JSON-Notation)

["=", "gb2312", "B", "uLGxvmhlbrixsb5nLnhscw==", "="]

In der resultierenden Array, wenn „B“ befindet sich auf Position 2, stellen Sie eine Base64-codierte Zeichenfolge auf Position 3. Wenn Sie es decodiert wird, achten Sie darauf, die Aufmerksamkeit auf die Codierung auf Position 1 zu zahlen, wahrscheinlich wäre es am besten die ganze Sache auf UTF-8 mit, dass Informationen zu konvertieren.

@gnud, @edg - Wenn ich nicht falsch verstehen, er ist über die Dateinamen zu fragen, nicht der Inhalt der Datei @setori - das Content-Trasfer-Encoding ist Ihnen zu sagen, wie der Inhalt der Datei codiert ist, nicht die „Dateiname“

.

Ich bin kein Experte, aber dieser Teil hier im Dateinamen ihn über die Charaktere erzählt, die folgen:

=? GB2312? B?

Ich bin auf der Suche für die Dokumentation in den RFCs ... Ah! hier ist sie: http://tools.ietf.org/html/rfc2047

Der RFC sagt:

Im Allgemeinen ist ein "codiert-Wort" ist eine Folge von druckbaren ASCII-Zeichen, die mit beginnt "=?", Endet mit "? =" Und hat zwei "?" S dazwischen.

Etwas anderes zu betrachten ist der Code in SharpMimeTools, ein MIME-Parser (in C #), die ich in meinen Fehlern verwenden App-Tracking, BugTracker.NET

Es gibt einen besseren Weg, als bobince Methode die Ausgabe von decode_header zu handhaben. Ich fand es hier: http://mail.python.org /pipermail/email-sig/2007-March/000332.html

name = unicode(email.header.make_header(email.header.decode_header(x)))

Nun, Sie die E-Mail-Header in einem Wörterbuch parsen. Und dann überprüfen Sie, ob Content-Transfer-Encoding gesetzt ist, und wenn es = "base64" oder "Base64".

Frage: „“ "Auch muss ich wissen tatsächlich, welche Art von Datei es sich also .xls oder .doc ist so ich brauche den Dateinamen, um zu entschlüsseln korrekt die Anlage zu verarbeiten, aber wie oben, scheint gb2312 ist nicht unterstützt in jython, wissen alle Karussells? "" "

Daten:

Content-Type: application/vnd.ms-excel;
 name="=?gb2312?B?uLGxvmhlbrixsb5nLnhscw==?="

Bemerkungen:

(1) Die erste Zeile zeigt Microsoft Excel, so .xls sieht besser aus als .doc

(2)

>>> import base64
>>> base64.b64decode("uLGxvmhlbrixsb5nLnhscw==")
'\xb8\xb1\xb1\xbehen\xb8\xb1\xb1\xbeg.xls'
>>>

(a) Die Erweiterung erscheint .xls zu werden - keine Notwendigkeit für einen gb2312 Codec
(B) Wenn Sie ein Datei-System-safe Dateinamen mögen, können Sie verwenden, um die „-_“ Variante von base64 oder Sie könnten Prozent codieren es
(C) Für das, was es wert ist, der Dateiname XYhenXYg.xls wobei X und Y sind zwei chinesischen Schriftzeichen, die zusammen bedeuten „Kopieren“ und der Rest sind wörtliche ASCII-Zeichen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top