Search code examples
rubyemail-attachmentsmail-gem

ruby's Mail gem: how to see if attachment is inline


Say, i have a raw mail message in a file and i read it like

m = Mail.read '/path/to/file'

it has attachments, one of which is an inline pic.

pic = m.attachments[0]
 => #<Mail::Part:70130030888740, Multipart: false, Headers: <Content-Type: image/png; name="image001.png">, <Content-Transfer-Encoding: base64>, <Content-ID: <image001.png@01D21F1C.E063ADE0>>>

others are just some files.

What i need is to have a way of knowing whether the attachment is inline or not. There is an inline? method, and for non-inline attachments it works like a charm

pdf = m.attachments[1]
 => #<Mail::Part:70130031002140, Multipart: false, Headers: <Content-Type: application/pdf; name="blah blah blah blah
pdf.inline?
=> false

But let's return to our pic here:

pic.inline?
=> nil

Which is just not right. I also tried

pdf['Content-Disposition']
=> #<Mail::Field 0x7f90d729b598 @charset="UTF-8" @name="Content-Disposition" @raw_value="Content-Disposition: attachment;\r\n\tfilename

and

pic['Content-Disposition']
=> nil

which is not too good either.

Is there any way to have a true/false value here?


Solution

  • In your case, the pic doesn't have a Content-Disposition header defined. What to make of this differs a bit between standards (some default to attachment, some to inline). To quote RFC 2183:

    Content-Disposition is an optional header field. In its absence, the MUA may use whatever presentation method it deems suitable.

    The mail gem seems to default to attachment since it only checks if the Content-Disposition was explicitly set to inline.

    If you want to default to inline instead, you can check if the result of the inline? method returns anything else but false.

    pic_is_inline = (pic.inline? != false) # pic.inline? returns nil
    # => true
    
    pdf_is_inline = (pdf.inline? != false) # pdf.inline? returns false
    # => false
    

    In the end, it's up to little defined semantics and you will have to be rather careful since these things tend to be interpreted differently by different people. When you accept mail from unknown sources, you could e.g. check if an attachment without an explicit Content-Disposition is referenced in the mail body somehow.