说,我在文件中有一封原始邮件消息,我就像
一样阅读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;\r\n\tfilename
和
pic['Content-Disposition']
=> nil
也不太好。
这里有没有办法获得真/假值?
答案 0 :(得分:1)
在您的情况下,pic没有定义Content-Disposition
标头。如何做到这一点在标准之间有所不同(一些默认为attachment
,一些默认为inline
)。引用RFC 2183:
Content-Disposition是一个可选的标题字段。在它缺席的情况下 MUA可以使用它认为合适的任何表现方法。
mail 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
的附件。