Ruby's 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;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的附件

相关内容

  • 没有找到相关文章

最新更新