2016-02-06 3 views
1

Я пишу просто приложение MUA, и у меня возникают проблемы с генерацией сообщения.Python email - поддержка 8 бит MIME

Я хочу, чтобы моя программа автоматически определяла, поддерживает ли SMTP-сервер 8bit MIME, и если да, то он будет генерировать сообщение, в котором часть с открытым текстом будет закодирована на 8 бит. В заголовке MIME это должно выглядеть так:

Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit

Основная проблема заключается в том, что python3.4 smtplib не имеет 8-bit encoder, просто только base64 и quoted printable

В моем случае это выглядит, что:

from email.mime.multipart import MIMEMultipart 
from email.mime.text import MIMEText 
msg = MIMEMultipart() 
msg['From'] = '[email protected]' 
msg['To'] = '[email protected]' 
msg['Subject'] = 'subject' 

text = MIMEText("text here".encode('utf-8'), _charset='utf-8') 

msg.attach(text) 

# then sending... 

text.as_string() вызов возвращает

'Content-Type: text/plain; charset="utf-8"\nMIME-Version: 1.0\nContent-Transfer-Encoding: base64\n\ndGV4dCBoZXJl\n' 

Это сообщение неплохое, но я хотел бы иметь 8-bit enconding, а не base64.

Вопрос: действительно ли я осужден за использование base64?

В email.encoders только encode_base64 и encode_quopri функции

ответ

3

Стандарт.кодировка тело для UTF-8 является BASE64, который может быть заменен на месте:

from email import charset 
    ch = charset.Charset('utf-8') 
    ch.body_encoding = '8bit' 
    text = MIMEText("") 
    text.set_charset(ch) 
    text.set_payload("text here") 
    text.replace_header('Content-Transfer-Encoding', '8bit') 
    msg.attach(text) 

или глобально:

from email import charset 
    charset.add_charset('utf-8', charset.SHORTEST, '8bit') 

    text = MIMEText("text here".encode('utf-8'), _charset='utf-8') 
    text.replace_header('Content-Transfer-Encoding', '8bit') 

    msg.attach(text) 
+0

Я сражался, чтобы сделать первый локальный метод работы, но он просто не работал, не мог понять. –