LINUX.ORG.RU

Имена вложений в юникоде понимает только Thunderbird

 , , ,


0

2

Столкнулся тут с проблемой в Django - при отправке почты вложения с именами файлов в юникоде некоторыми (Gmail, Outlook) клиентами не воспринимаются, или показываются не раскодированными (Kmail).
Попытки докопатся до источника проблемы привели меня к старому багрепорту и дали больше вопросов, чем ответов:

  • С проблемой столкнулся не только я
  • В Thunderbird'е (и, похоже, только в нём) имена отображаются нормально
  • Разработчики говорят УМВР и ссылаются на стандарт, в соответствии с которым юникодные имена вложений и кодируются в Django

Сами имена закодированы вот так:

Content-Disposition: attachment;
 filename*="utf-8''f%C3%ADle_with_%C3%BCnic%C3%B6de_%C3%A7h%C3%A5rs"
Не может же быть, что у меня какой-то другой Gmail.
Может, на ЛОРе кто-то сталкивался?

★★★

Последнее исправление: gasinvein (всего исправлений: 2)

Ответ на: комментарий от gasinvein

Попробовал открывать, Thunderbird 45 всё правильно показывает, Evolution 3.20.5 тоже, KMail 5.2.3 показывает URL как есть, что я ни делал. Не знаю, кто тут виноват.

proud_anon ★★★★★
()
Ответ на: комментарий от proud_anon

Gmail и Outlook не показывают (хотя г-н claudep утверждает обратное). Не знаю, кто виноват, но что-то мне подсказывает, что не почтовые клиенты. Например, тот же Gmail не эскейпит имена вложений вообще.

gasinvein ★★★
() автор топика

Опа! Мне удалось сделать так, что в KMail всё стало хорошо. Я заменил строку

 filename*="utf-8''f%C3%ADle_with_%C3%BCnic%C3%B6de_%C3%A7h%C3%A5rs"
на
 filename*=utf-8'f%C3%ADle_with_%C3%BCnic%C3%B6de_%C3%A7h%C3%A5rs
Вот так тоже работает, судя по RFC, это, наверное, правильнее:
 filename*=utf-8''f%C3%ADle_with_%C3%BCnic%C3%B6de_%C3%A7h%C3%A5rs
но двойные кавычки вокруг всего этого в RFC не упоминаются.

proud_anon ★★★★★
()
Последнее исправление: proud_anon (всего исправлений: 1)
Ответ на: комментарий от proud_anon

От оно как! Спасибо. Может, стоит переоткрыть тот баг?
Можешь дать ссылку и указание, где именно в RFC описано кодирование имён вложений?

gasinvein ★★★
() автор топика
Ответ на: комментарий от shrub

Благодарю.
На самом деле, проблему уже решил переписыванием функции добавления вложения:

class EmailMultiAlternativesUnicode(EmailMultiAlternatives):
	def _create_attachment(self, filename, content, mimetype=None):
		from email.header import Header
		attachment = self._create_mime_attachment(content, mimetype)
		if filename:
			try:
				filename = filename.encode('ascii')
			except UnicodeEncodeError:
				filename = str(Header(filename, 'utf-8'))
			attachment.add_header('Content-Disposition', 'attachment', filename=filename)
		return attachment
Выходной формат получается примерно таким
Content-Disposition: attachment;
 filename="=?utf-8?b?ZsOtbGVfd2l0aF/DvG5pY8O2ZGVfw6dow6Vycw==?="
и его понимают, вроде, все MUA.
А спорить с разработчиками Django, чей стандарт стандартнее и у кого баг, как-то не очень хочется.

gasinvein ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.