1

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

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

这也不太好。

有没有办法在这里有一个真/假值?

4

1 回答 1

1

在您的情况下,图片没有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邮件正文中是否以某种方式引用了没有显式附件的附件。

于 2016-10-21T14:04:47.193 回答