ruby的邮件gem:如何查看附件是否为内联

时间:2016-10-21 11:49:54

标签: ruby email-attachments mail-gem

说,我在文件中有一封原始邮件消息,我就像

一样阅读
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

也不太好。

这里有没有办法获得真/假值?

1 个答案:

答案 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的附件。