Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 15, 2011 15:35:42

nulltime
От:
Зарегистрирован: 2010-12-17
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Несклеивается email и email.charset

Доброго времени суток!
Я вояю один скриптик и понадобилось сделать отправку на 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
Подскажите, что я делаю не так?
Спасибо!



Офлайн

#2 Апрель 18, 2011 14:32:14

ZAN
От:
Зарегистрирован: 2007-06-10
Сообщения: 403
Репутация: +  10  -
Профиль   Отправить e-mail  

Несклеивается email и email.charset

Ошибка возникает из-за пустого payload.
Попробуй делать set_charset уже после того, как добавлены текст и т.п.
Вообще-то - это баг, т.к. по-хорошему исключения быть не должно, или же оно должно указывать на то, что payload не заполнен.

P.S. В третьем питоне такой ошибки уже не возникает.



Офлайн

#3 Апрель 18, 2011 15:07:05

nulltime
От:
Зарегистрирован: 2010-12-17
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Несклеивается email и email.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()
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))
Та же самая ошибка



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version