@NyxDeveloper

Почему файлы на русском языке, прикреплённые к письму, приходят битыми?

В моём приложении некоторые уведомления дублируются отправкой письма на почту. К письмам прикрепляются файлы, загруженные другими пользователями и они часто бывают названы по-русски. Эмпирическим путем было вычислено, что если имя файла прописано латиницей, то все приходит нормально, а те, что имеют в названии кириллицу приходят в формате .dat.
Также интересно и то, что в почтовых ящиках в браузере файлы с русскими символами в названии могут отображаться нормально, но в Outlook то же самое письмо будет содержать битые файлы.
Вот код отправки письма:
if self.send_mail and not self.mail_was_send:
            self.mail_was_send = True
            msg = MIMEMultipart()
            msg["Subject"] = self.short_text
            msg["From"] = EMAIL_HOST_USER
            msg["To"] = self.user.email
            msg.attach(MIMEText(self.text))

            # получаем список файлов действвия и добавляем их в сообщение
            for document in documents if documents else []:
                path = os.path.join(MEDIA_ROOT, document.file.path)
                attachment = MIMEApplication(open(path, "rb").read(), _subtype=document.file.name.split(".")[-1],
                                             name=document.filename)
                attachment.add_header('Content-Disposition', 'attachment', filename=os.path.basename(path))
                msg.attach(attachment)

            s = smtplib.SMTP_SSL('smtp.yandex.ru', 465)
            s.ehlo(EMAIL_HOST_USER)
            s.login(EMAIL_HOST_USER, EMAIL_HOST_PASSWORD)
            s.sendmail(EMAIL_HOST_USER, [self.user.email], msg.as_string())
            s.quit()
  • Вопрос задан
  • 267 просмотров
Пригласить эксперта
Ответы на вопрос 1
@MaxKozlov
а как имени файла указать кодировку? Если у меня могут быть как файлы на английском,так и на руссуом.

Вот не помню, откуда исходно утащено(скорее всего SO), но рабочий вариант такой
// set appropriate headers for attachment or streamed file
// The theoretically correct syntax for use of UTF-8 in Content-Disposition is very weird: filename*=UTF-8''foo%c3%a4 (yes, that's an asterisk, and no quotes except an empty single quote in the middle)
// This example is the same as the one above, but adding the "filename" parameter for compatibility with user agents not implementing RFC 5987:
// Content-Disposition: attachment;
//         filename="EURO rates";
//         filename*=utf-8''%e2%82%ac%20rates
// Note: Those user agents that do not support the RFC 5987 encoding ignore “filename*” when it occurs after “filename”.
// http://tools.ietf.org/html/rfc6266#section-5
// 
header('Content-Disposition: attachment; filename="'.rawurlencode($file_name).'"; filename*=utf-8\'\''.rawurlencode($file_name));
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы