Как работать с заголовками писем UTF-8 (например, Subject :), используя Ruby? - PullRequest
7 голосов
/ 04 декабря 2008

Я электронная почта n00b, но я работаю над приложением, которое отправляет электронную почту в формате HTML с символами Unicode (как заметил мой друг "наслаждайся адским кодированием").

Заголовок Subject: поступает от пользователя и поэтому может содержать символы Юникода. Некоторые почтовые клиенты (например, GMail и Outlook 2007) в порядке с этим, но из моего прочтения кажется, что правильный способ сделать это - использовать кодировку MIME Encoded-Word для заголовков.

Я не могу найти библиотеку Ruby для этого. Есть ли один?

Кроме того, есть ли заголовок для добавления, который будет указывать почтовым клиентам использовать UTF-8 при отображении сообщения? Мы отправляем многочастное электронное письмо, поэтому наш Content-Type равен multipart/mixed. В частности, Apple Mail.app не использует правильную кодировку, даже если она указана в отдельных частях как UTF-8.

Ответы [ 3 ]

9 голосов
/ 04 декабря 2008

Вы можете сделать то же самое, используя кодировку Base64:

require "base64"

value  = Base64.encode64("Your UTF-8 string")
header = "=?UTF-8?B?" + value + "?="

Обратите внимание на букву «B», которая обозначает полезную нагрузку с кодировкой Base64, а не букву «Q», обозначающую полезную нагрузку с кодировкой Q Последний может быть подделан URL-кодированием строки и заменой всех символов "%" на "=".

Под «подделкой» я подразумеваю следующее: он даст правильный результат, но, возможно, закодировано больше символов, чем необходимо. Спецификация позволяет кодировать каждый символ с "=" + ByteCodeAsHex, это просто ухудшает читаемость необработанных заголовков. UrlEncode - это * .gsub(/%/, "=") неплохой компромисс, когда больше ничего не доступно.

5 голосов
/ 04 декабря 2008

Ахаха! ActionMailer::Quoting имеет метод quoted_printable.

Итак, вот что я сделал:

def my_email(foo)
  ...
  @subject = quoted_printable(foo.some_subject_with_accented_chars, 'utf-8')
  ...
end

Выполнение этого убедило Mail.app отобразить остальную часть электронной почты с использованием UTF-8. Теперь, чтобы проверить остальные!

3 голосов
/ 14 сентября 2011

Поскольку ни один из ответов не говорит о целом сообщении с чистым Ruby, вот оно.

Net::SMTP.start("localhost") do |smtp|
    smtp.open_message_stream opts[:sender_address], opts[:receiver_address] do |f|

        f.puts "Content-type: text/plain; charset=UTF-8"
        f.puts from
        f.puts to
        f.puts subject
        f.puts message
    end
end

Здесь вы открываете соединение с localhost. Использование внешнего SMTP-сервера также возможно, см. Документацию net / smtp.

Первая строка устанавливает набор символов, используемый в сообщении. Остальные строки являются переменными, определенными отдельно:

from - это адрес в форме From: Name here <address@here.fi>. Если имя не требуется, можно указать только адрес, например From: address@here.fi.

использует тот же синтаксис, за исключением From: изменено на To:.

тема находится в форме предмета: предмет здесь. Для UTF-8 он должен быть в кодировке Base64, чтобы правильно отображаться для клиентов.

subject = "Subject: =?UTF-8?B?" + Base64.strict_encode64(subject) + "?="

Сообщение - это текстовое сообщение в кодировке UTF-8 без префикса. net / smtp позаботится о формировании правильной почты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...