假设我在一个文件中有一个原始邮件消息,我像
那样读取它m = Mail.read '/path/to/file'
有附件,其中一个是内联图片。
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>>>
其他只是一些文件。
我需要是有一种方法知道附件是否内联。有一个inline?
方法,对于非内联附件,它的工作原理就像一个魅力符
pdf = m.attachments[1]
=> #<Mail::Part:70130031002140, Multipart: false, Headers: <Content-Type: application/pdf; name="blah blah blah blah
pdf.inline?
=> false
但是让我们回到这里的pic
:
pic.inline?
=> nil
这是不对的。我也试过
pdf['Content-Disposition']
=> #<Mail::Field 0x7f90d729b598 @charset="UTF-8" @name="Content-Disposition" @raw_value="Content-Disposition: attachment;rntfilename
和
pic['Content-Disposition']
=> nil
也不太好。
是否有办法在这里有一个真/假值?
在您的情况下,pic没有Content-Disposition
标头定义。不同的标准(有些默认为attachment
,有些默认为inline
)对此有不同的理解。引用RFC 2183:
Content-Disposition是一个可选的报头字段。在它缺席的情况下,MUA可以使用它认为合适的任何表示方法。
邮件gem似乎默认为attachment
,因为它只检查Content-Disposition是否显式设置为inline
。
如果你想默认为inline
,你可以检查inline?
方法的结果是否返回false
以外的任何值。
pic_is_inline = (pic.inline? != false) # pic.inline? returns nil
# => true
pdf_is_inline = (pdf.inline? != false) # pdf.inline? returns false
# => false
最后,这取决于很少定义的语义,你必须非常小心,因为这些东西往往被不同的人解释得不同。当你接收来自未知来源的邮件时,你可以检查邮件正文中是否引用了一个没有显式Content-Disposition
的附件