Как декодировать заголовок электронной почты в кодировке RFC 2047 в Ruby?

У меня есть следующий заголовок:

From: =?iso-8859-1?Q?Marta_Falc=E3o?= <marta.falcao@example.com.br>

Я могу легко разделить материал до того, как <, который оставляет меня с

"=?iso-8859-1?Q?Marta_Falc=E3o?="

Что я могу использовать, чтобы превратить это в "Marta Falcão"?

2 ответа

Решение

Спасибо Roland Illig за его комментарий, который привел меня к двум вариантам:

  1. установить rfc2047-ruby и вызвать Rfc2047.decode(header)
  2. установить TMail и позвонить TMail::Unquoter.unquote_and_convert_to(header, 'utf-8') или еще лучше TMail::Address.parse(header).friendlyпоследний из которых удаляет <email address> часть

Используя более новую Почтовую драгоценность:

Mail::Encodings.value_decode(str) или жеMail::Encodings.unquote_and_convert_to(str, to_encoding)

Использовать Ruby для реализации RFC 2047 несложно:

       module Rfc2047
  TOKEN = /[\041\043-\047\052\053\055\060-\071\101-\132\134\136\137\141-\176]+/.freeze
  ENCODED_TEXT = /[\041-\076\100-\176]+/.freeze
  ENCODED_WORD = /=\?(?<charset>#{TOKEN})\?(?<encoding>[QB])\?(?<encoded_text>#{ENCODED_TEXT})\?=/i.freeze

  class << self
    def encode(input)
      "=?#{input.encoding}?B?#{[input].pack('m0')}?="
    end

    def decode(input)
      match_data = ENCODED_WORD.match(input)
      raise ArgumentError if match_data.nil?

      charset, encoding, encoded_text = match_data.captures
      decoded =
        case encoding
        when 'Q', 'q' then encoded_text.unpack1('M')
        when 'B', 'b' then encoded_text.unpack1('m')
        end
      decoded.force_encoding(charset)
    end
  end
end
       Rfc2047.decode '=?iso-8859-1?Q?Marta_Falc=E3o?=' # => Marta_Falcão

Обновить

mikel / mail в настоящее время имеет проблему с кодировкой, которая может некорректно декодировать строку.

Если вас это действительно беспокоит, вы можете попробовать new_rfc_2047:

       $ gem install new_rfc_2047
$ ruby -rrfc_2047 -e 'puts Rfc2047.decode "From: =?iso-8859-1?Q?Marta_Falc=E3o?= <marta.falcao@example.com.br>"'
From: Marta Falcão <marta.falcao@example.com.br>

Поскольку исходный код mikel / mail слишком сложен для меня, чтобы вносить изменения, я просто сделал для этого свой собственный гем.

Источник Gem находится здесь: https://github.com/tonytonyjan/rfc_2047/

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