Discussion:
[Ruby Mail gem] Kann keine boundary für Mail::Body#split! konstruieren
(zu alt für eine Antwort)
Michael Uplawski
2024-08-16 08:45:27 UTC
Permalink
Moin.

Meine Versuche eine multipart Mail in “parts” zu zerteilen scheitern
daran, dass ich unfähig bin eine korrekte “boundary” zu definieren.

Authentisches Beispiel.

In einer solchen Mail mit plain text und HTML part, finde ich eine
boundary

------=_Part_291375_1214917593.1717165035012

Mein code enthält das folgende Fragment:

body.split!("----=_Part_")
parts = body.parts
debug "first part: " << parts[0].to_s

Wichtig: Egal wie viele führende dashes ich im Argument liefere, das
Ergebnis bleibt dasselbe: der part[0] enthält stets den gesamten
Message-body mit allen parts, part[1] existiert nicht.

Mail::Body.split! wandelt intern das String-Argument in ein
Regexp-Objekt um und fügt selbst zwei dashes ein. Allerdings
verstehe ich nicht, wieso alle meine Versuche scheitern und in der
von der Methode gespeicherten boundary jedesmal zwei Dashes fehlen!

Authentische debug Ausgabe:

EmlFile debug 10:39:51:868805: first part: Content-Type: multipart/alternative;
| boundary="----=_Part_291375_1214917593.1717165035012"
|Content-Transfer-Encoding: 7bit
|
|
|------=_Part_291375_1214917593.1717165035012
|Content-Type: text/plain;
| charset=UTF-8
|Content-Transfer-Encoding: quoted-printable
| (…)

Ich bin rechtschaffen verloren.

Wochenende.

Cheerio
Michael
--
Geh Kaffee kochen!
Michael Uplawski
2024-08-17 04:09:27 UTC
Permalink
Michael Uplawski wrote in de.comp.lang.misc:
(…)
Post by Michael Uplawski
body.split!("----=_Part_")
parts = body.parts
debug "first part: " << parts[0].to_s
Wichtig: Egal wie viele führende dashes ich im Argument liefere, das
Ergebnis bleibt dasselbe: der part[0] enthält stets den gesamten
Message-body mit allen parts, part[1] existiert nicht.
(…)

Bis auf weiteres muss ich auff body.split! verzichten und versuche
statt dessen mit Regexp.match() und einem anschließenden
String.split selbst die Zerteilung vorzunehmen.

Aus einem mir nicht ersichtlichen Grunde verarbeiten String.split
und Regexp.match die übergebenen Ausdrücke unterschiedlich.

Eventuell verzichte ich sogar komplett auf die Mail gem. Die
Dokumentation ist ja auch recht übel.

Cheerio
--
Geh Kaffee kochen!
Michael Uplawski
2024-08-18 09:47:48 UTC
Permalink
Post by Michael Uplawski
Bis auf weiteres muss ich auff body.split! verzichten und versuche
statt dessen mit Regexp.match() und einem anschließenden
String.split selbst die Zerteilung vorzunehmen.
Bis auf weiteres funktioniert dieser Work-Around:
-------------------
# ATTN Mail::Body#split! does not appear to work as it should
parts_regexp = /(?:--)+=_Part_\S+/
parts = Hash.new
split_content = body.to_s.split(parts_regexp)
debug('split_content[3] is ' << split_content[3].strip)
split_content.each do |sc|
if sc.strip.start_with?('Content-Type')
sc_lines = sc.strip.split("\n")
if sc_lines[1].strip.start_with?('Content-Transfer-Encoding')
content_type = sc_lines[0].strip.split(':')[1]
content_transfer_encoding = sc_lines[1].strip.split(':')[1]
parts[[content_type, content_transfer_encoding]] = sc
end
end
end
debug "have #{parts.size} parts: " << parts.keys.to_s
--------------------

Die Debug-Ausgabe am Ende produziert:
--------------------
EmlFile debug 11:43:25:439156: have 2 parts: [[" text/plain; \
charset=UTF-8", " quoted-printable"], [" text/html; charset=UTF-8" \
" quoted-printable"]]
-------------------

Die Hash-Werte entsprechen in beiden Fällen dem Content.

Ich werde sehen, wie weit ich damit komme.
--
Geh Kaffee kochen!
Michael Uplawski
2024-08-24 04:33:58 UTC
Permalink
Okay, ich hab's gesehen: boundaries werden ggf. in jedem Part für
den nächsten deklariert, das Format is beliebig.

Alles vergessen. Wenn ich etwas zustande bringe, werde ich es nicht
mehr hier melden, das Mail-System ist genauso verrottet wie http und
dazu möchte ich nichts mehr beitragen.

Glückwunsch.
--
Geh Kaffee kochen!
Loading...