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