Найти - Пользователи
Полная версия: Несклеивается email и email.charset
Начало » Python для новичков » Несклеивается email и email.charset
1
nulltime
Доброго времени суток!
Я вояю один скриптик и понадобилось сделать отправку на e-mail. Я его сделал, но не покидает ощущение костылей. В почтовой системе не всегда корректно отрабатываются письма в UTF-8, поэтому есть необходимость все элементы держать в koi8-r. Как я понял, в семействе модулей email для этого используется объект Charset, которым можно управлять кодировкой сообщения и способами кодировки. У email.message.Message есть метод set_charset(charset), который, как я понял, и устанавливает глобальные настройки сообщения. В мануале
Set the character set of the payload to charset, which can either be a Charset instance (see email.charset), a string naming a character set, or None.
Т.е. я могу туда поставить текстовое имя кодировки или настроенный объект Charset со всеми исходными/получаемыми кодировками, преобразователями кодировок и упаковщиками. Но этот код
import email
import email.message
import email.header
import email.charset
import email.mime.audio
import email.mime.base
import email.mime.image
import email.mime.multipart
import email.mime.text
import smtplib

message = email.mime.multipart.MIMEMultipart()
cnvt = email.charset.Charset()
cnvt.input_charset='utf-8'
cnvt.output_charset='koi8-r'
cnvt.input_codec='utf8'
cnvt.output_codec='koi8_r'
cnvt.header_encoding = email.charset.BASE64
cnvt.body_encoding = email.charset.BASE64
message.set_charset(cnvt)
вызывает ошибку
Traceback (most recent call last):
File "/home/dberkovich/eclipse/workspace/PyDev/IronLogs/src/pymail.py", line 25, in <module>
message.set_charset(cnvt)
File "/usr/lib/python2.6/email/message.py", line 262, in set_charset
self._payload = charset.body_encode(self._payload)
File "/usr/lib/python2.6/email/charset.py", line 384, in body_encode
s = self.convert(s)
File "/usr/lib/python2.6/email/charset.py", line 267, in convert
return unicode(s, self.input_codec).encode(self.output_codec)
TypeError: coercing to Unicode: need string or buffer, list found
Подскажите, что я делаю не так?
Спасибо!
ZAN
Ошибка возникает из-за пустого payload.
Попробуй делать set_charset уже после того, как добавлены текст и т.п.
Вообще-то - это баг, т.к. по-хорошему исключения быть не должно, или же оно должно указывать на то, что payload не заполнен.

P.S. В третьем питоне такой ошибки уже не возникает.
nulltime
Попробовал, нефега :о(

import email
import email.message
import email.header
import email.charset
import email.mime.audio
import email.mime.base
import email.mime.image
import email.mime.multipart
import email.mime.text
import smtplib

message = email.mime.multipart.MIMEMultipart()
print message.__dict__
cnvt = email.charset.Charset()
cnvt.input_charset='utf-8'
cnvt.output_charset='koi8-r'
cnvt.input_codec='utf8'
cnvt.output_codec='koi8_r'
cnvt.header_encoding = email.charset.BASE64
cnvt.body_encoding = email.charset.BASE64
print cnvt
print cnvt.__dict__

print message.get_charset()
message['From'] = "sender@email"
message['Subject'] = cnvt.header_encode("Йохохо",'koi8-r')
message['to'] = 'rcpnt@email'
print message.__dict__
part = email.mime.text.MIMEText(cnvt.convert('Тестовое тело сообщения'),'plain', cnvt.get_output_charset())
print part.__dict__
message.attach(part)
part = email.mime.audio.MIMEAudio(open('16.mp3','rb').read(),'mpeg')
part.add_header('Content-Disposition', 'attachment', filename='loshadgo.mp3')
message.attach(part)
message.set_charset(cnvt)
print message.as_string(True)
#open('msg','wb').write(message.as_string(True))
Та же самая ошибка
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB