Das Notes Forum

Domino 9 und frühere Versionen => ND8: Entwicklung => Thema gestartet von: magic_halli am 17.03.09 - 11:28:02

Titel: NotesMimeEntity Umlaute im Header
Beitrag von: magic_halli am 17.03.09 - 11:28:02
Hi,

ich extrahiere aus einer MIME-Mail die Anhänge (sind vom ContentTyp 'application'). Das klappt soweit auch prima.
Der Dateiname des "MIME-Anhangs" steht ja im Header drin.
Um an den Dateinamen des Anhangs zu kommen, lese ich den Header aus und hole mir den ParamValue 'name':
Code
...
Dim child As NotesMIMEEntity
Dim header As NotesMimeHeader
Dim filename As String
...
Set header = mime.GetNthHeader("Content-Type")
filename = header.GetParamVal("name")
Klappte bisher immer, d.h. es stand bisher immer ein korrekter Dateiname drin, bspw. "Test.xls" etc.

Jetzt ist ein Fall aufgetreten, wo eine Datei "Liquidität.xls" dranhängt. Jetzt ist der Wert vom MIMEEntity im ParamVal 'name' bzw. in filename:
Code
=?iso-8859-1?Q?Liquidit=E4t.xls?=

Somit kann diese Datei erstmal nicht extrahiert werden!!!

Woran liegt das, dass der Dateiname so im Header steht? (Umlaut?)
Das wäre doch dann ein Problem von Notes beim Mailempfang, oder?
Wie bekomme ich wieder einen normalen Dateinamen?


Danke und Gruß

Rico.
Titel: Re: NotesMimeEntity Umlaute im Header
Beitrag von: m3 am 17.03.09 - 11:39:06
Seufz.
Wenn Du Dich schon mit MIME und MIME-Anhängen beschäftigst, würde ich empfehlen, dass Du Dich auch mit den entsprechenden RFCs auseinandersetzt. Das, was Du da siehst, ist absolut Standardkonform und wird auch von Notes verstanden.

Zitat
MIME encoded-word syntax (RFC 2047)
This syntax uses a string of ASCII characters indicating both the original character encoding (the "charset") and the content-transfer-encoding used to map the bytes of the charset into ASCII characters.

The form is: "=?charset?encoding?encoded text?=".

    * charset may be any character set registered with IANA. Typically it would be the same charset as the message body.
    * encoding can be either "Q" denoting Q-encoding that is similar to the quoted-printable encoding, or "B" denoting base64 encoding.
    * encoded text is the Q-encoded or base64-encoded text.

Request for Comments: 2047
MIME (Multipurpose Internet Mail Extensions) Part Three: Message Header Extensions for Non-ASCII Text
 (http://tools.ietf.org/html/rfc2047)
Titel: Re: NotesMimeEntity Umlaute im Header
Beitrag von: magic_halli am 17.03.09 - 12:39:27
Mag sein, dass das absolut Standardkonform ist und auch von Notes verstanden wird. Daran zweifel ich auch nicht.
Aber, wie schon gesagt, mein Problem ist der Header vom Attachment:
Code
Content-Type: application/vnd.ms-excel;
		 name="=?iso-8859-1?Q?Liquidit=E4t.xls?="
Content-Disposition: attachment;
		 filename="=?iso-8859-1?Q?Liquidit=E4t.xls?="
Content-Transfer-Encoding: base64
Ganz ehrlich, mich hat der Link nicht sonderlich weitergebracht für mein filename-Problem.
Ich will ja "nur" den 'filename' in lesbarer Formatierung auslesen. Ich hab leider keine Idee, wo ich wie ansetzen soll, wenn dieser wie hier aussieht.  :-[

Eigentlich sollten doch die Umlaute vom Anhang-Name in 'filename' auch als Umlaute drin stehen? Ist das vielleicht eine Einstellungssache von Notes in Hinsicht auf eine eingehende Mail, sodass man solche Formatierungen bereits serverseitig handeln kann?

Rico.
Titel: Re: NotesMimeEntity Umlaute im Header
Beitrag von: magic_halli am 17.03.09 - 14:10:57
Erkenntnis:
Ich benutze 'header.GetParamVal("name")', um mir aus dem Header den Value (=filename) zum Parameter 'name' zu holen. Leider enthält diese Methode keine optionale Angabe zur Decodierung!

Die Methode 'GetHeaderValAndParams' hingegen enthält eine Option zur Decodierung von RFC-2047 Codierungen. Allerdings gibt diese Methode den kompletten Header zurück! Mist - ich brauche nur den Parameter 'name'.

Ist jemand eine Möglichkeit bekannt, wie ich vielleicht einfach einen Header-ParameterValue decodieren kann?

Rico.
Titel: Re: NotesMimeEntity Umlaute im Header
Beitrag von: magic_halli am 17.03.09 - 14:31:55
Hab mein Problem behoben. Evtl. RFC-2047 codierte Header werden decodiert und einfach neu gesetzt. Bei Nicht-RFC-2047 Headern bleibt der 'name' dann sowieso gleich.
Code
...
Dim child As NotesMIMEEntity
Dim header As NotesMimeHeader
Dim filename As String

Set header = child.GetNthHeader("Content-Type")
header.SetHeaderValAndParams(header.GetHeaderValAndParams(False,True))
filename = header.GetParamVal("name")
Das Dokument wird ja eh nicht gespeichert, von daher kann ich den Header für meinen Zwecks ruhig neu setzen?!
Klappt! Ob es hierfür noch eine weiter Lösung gibt... keine Ahnung.


Rico.