1

たとえば、ファイルに生のメールメッセージがあり、それを次のように読みます

m = Mail.read '/path/to/file'

添付ファイルがあり、そのうちの 1 つはインラインの写真です。

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あなたの場合、pic にはヘッダーが定義されていません。これをどうするかは、標準によって少し異なります (一部は にデフォルト設定されattachment、一部は に変更されますinline)。RFC 2183を引用するには:

Content-Disposition はオプションのヘッダー フィールドです。それがない場合、MUA は適切と思われる表示方法を使用できます。

Content-Disposition が明示的に に設定されているかどうかのみをチェックするため、mail gemはデフォルトのようです。attachmentinline

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 に答える