Почтовый камень ruby's: как посмотреть, является ли вложение встроенным

Скажем, у меня есть сырое почтовое сообщение в файле, и я читаю его как

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 ответ

Решение

В вашем случае картинка не имеет Content-Disposition заголовок определен. Что делать с этим немного отличается между стандартами (некоторые по умолчанию attachmentнекоторые к inline). Цитировать RFC 2183:

Content-Disposition является необязательным полем заголовка. В его отсутствие MUA может использовать любой способ представления, который он считает подходящим.

Почтовый драгоценный камень, кажется, по умолчанию 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 упоминается в теле письма как-то.

Другие вопросы по тегам