Extrayendo el contenido de un TMail::MessageIdHeader

Hola gente,

Tengo un email con imágenes adjuntas que están directamente
referenciadas en el body (html) del propio email de tal modo que el
cliente al abrir el email incrusta las imágenes adjuntas directamente
en la posición que el usuario indicó al crear el email.

Esto está hecho con el cliente Mail de Mac Os X, me imagino que otros
también harán virgerías de estas.

El caso es que mi tarea es recomponer este email: insertar los
ficheros en disco duro y sustituir las llamadas a los ids de los
‘parts/attachments’ del email con la url real en disco.

Tengo hecha lo que debería ser la parte dura… pero me estoy liando
bastante a la hora de extraer la cabecera “content-id” de las ‘parts’
que contienen los adjuntos ‘inline’. (Descontando que
action-mailer-1.3.6 no me mostraba estos attachments … pero bueno,
eso es otra historia)

fijaros:

?> mail = TMail::Mail.parse( File.read(
“test/fixtures/mails/mail_images_inserted.raw_mail” ) )
=> #<TMail::Mail port=#TMail::StringPort:id=0x115da3c bodyport=nil>

mail.parts[1].parts[1][“content-id”]
=> #<TMail::MessageIdHeader
“<D38F9F3F-2326-4781-B23E-770911E51CEC/tbg.jpg>\n”>
mail.parts[1].parts[1][“content-id”].body
=> “”
mail.parts[1].parts[1][“content-id”].id
=> nil
mail.parts[1].parts[1][“content-id”].empty?
=> true
mail.parts[1].parts[1][“content-id”].to_s
=> “”

Necesito extraer el “D38F9F3F-2326-4781-B23E-770911E51CEC/tbg.jpg” del
objeto TMail::MessageIdHeader pero no lo consigo

Un zip con el email por si queréis probar el código lo podéis coger de
aquí:http://fernandoguillen.info/ftp/mail_images_inserted.raw_mail.zip

Probado en rails 1.3.6 y rails 2.1.0

Cualquier sugerencia es bienvenida.
Saludos
f.

head.class
=> TMail::MessageIdHeader

head.send :do_parse
TMail::SyntaxError: wrong Message-ID format:
<D38F9F3F-2326-4781-B23E-770911E51CEC/2/Photos>

from
/Library/Ruby/Gems/1.8/gems/actionmailer-2.1.0/lib/action_mailer/vendor/tmail-1.2.3/tmail/header.rb:416:in
do_parse' from (irb):185:insend’
from (irb):185

Internamente ejecuta un do_parse, que es incapaz de parsear el id del
mensaje. Puede que Mail, rompa los estándares ya que TMail tengo la
sensación de que clavaba los rfc.

Una solución chapuzas podría ser:

head.send(:eval, “@body”).strip[1…-2]

On Wed, Sep 3, 2008 at 23:27, Guillermo [email protected]
wrote:

Internamente ejecuta un do_parse, que es incapaz de parsear el id del
mensaje. Puede que Mail, rompa los estándares ya que TMail tengo la
sensación de que clavaba los rfc.
Una solución chapuzas podría ser:
head.send(:eval, “@body”).strip[1…-2]


Guillermo Álvarez

Yo estaba probando lo mismo y esto otro:

m.parts[1].parts[1][‘content-id’].illegal? #=> true

Así que parece que Mail.app no lo está haciendo bien. Me uno a la
colección de soluciones chapuzas:
m.parts[1].parts[1][‘content-id’].instance_variable_get(:@body)

Claro, que solo en el caso de que no consigas el id.

Segunda solución cutre: hacer el parser un poco más permisivo. Al
principio de tu programa:

TMail::TextUtils::MESSAGE_ID = /<[^>]+>/

Claro, que te tragas un warning al redefinir una constante.

Tercera solución, la que más me gusta (entre tres males…). Al
principio de tu programa:

TMail::HeaderField::FNAME_TO_CLASS.delete(‘content-id’)
m.parts[1].parts[1][‘content-id’].body
#=> “<D38F9F3F-2326-4781-B23E-770911E51CEC/tbg.jpg>”

Tú decides.

PD: Abreles un bug a la gente de Apple.

Así dá gusto… muchas gracias, no sólo por ofrecer soluciones sino
porque he aprendido mucho sobre lo muy hacker que hay que ser para de
verdad comprender este lenguaje aparentemente sencillo.

Resumiendo tenemos estas soluciones:

1*
head.send(:eval, “@body”).strip[1…-2]

2*
mail.parts[1].parts[1][‘content-id’].instance_variable_get(:@body)

3*
TMail::TextUtils::MESSAGE_ID = /<[^>]+>/

4*
TMail::HeaderField::FNAME_TO_CLASS.delete(‘content-id’)

El problema creo que todos estamos de acuerdo está en el método

def do_parse
@id = @body.slice(MESSAGE_ID) or
raise SyntaxError, “wrong Message-ID format: #{@body}”
end

Pues intenta hacer esto:
mail.parts[1].parts[1][“content-id”].send(:eval, “@body”).slice(
/<[^@>]+@[^>@]+>/ )

Es decir, esto:
“<D38F9F3F-2326-4781-B23E-770911E51CEC/tbg.jpg>\n”.slice(
/<[^@>]+@[^>@]+>/ )

Según el RFC ( http://www.ietf.org/rfc/rfc2392.txt ) el contenido de
Content-Id debe ser una URL tipo addr-spec y como marca el RFC822(
RFC 822 - STANDARD FOR THE FORMAT OF ARPA INTERNET TEXT MESSAGES (RFC822) ) en el capítulo 6. ADDRESS
SPECIFICATION:

addr-spec = local-part “@” domain

Usea… que a este Content-Id le falta una @.

El día 4 de septiembre de 2008 0:57, Daniel R.
Troitiño[email protected]
escribió:>

PD: Abreles un bug a la gente de Apple.

Oki…

Saludos y gracias
f.

PD: si alguien tiene un cliente de Email que no sea el Mail de Mac Os
X y le permite incrustar(inline) imágenes dentro de un email que porfa
me envíe un ejemplo para verlo.

Gracias again

Al final he metido esto en un fichero:

fguillen: 2008-04-09

more permisive Message-Id validation

for the Content-ID of Mail.app that does not insert a @

Content-Id: <D38F9F3F-2326-4781-B23E-770911E51CEC/tbg.jpg>

TMail::HeaderField::FNAME_TO_CLASS.delete(‘content-id’)

Y lo cargo con un require al final del environment.rb

Saludos
f.

El día 4 de septiembre de 2008 11:57, Fernando G.
[email protected]
escribió:> Así dá gusto… muchas gracias, no sólo por ofrecer soluciones sino