2014-02-19 3 views
1

Я пытаюсь написать сценарий, который срывает текст с сайта и затем отправляет указанный текст мне по электронной почте.Кодирование Извлечение BeautifulSoup текст на адрес электронной почты

Все это работает по желанию, за исключением кодировки. В электронном письме содержатся такие строки, как:

Мы говорим: «Ну, это все закончилось и теперь разрушено; что?

Очевидно, что "???" должны быть апострофами. Я не очень хорошо знаком с тонкостями того, как кодирование работает, особенно когда оно относится к электронной почте, поэтому любая помощь будет оценена по достоинству. Соответствующая часть моего сценария ниже:

msg = MIMEMultipart() 
msg['From'] = fromaddr 
msg['To'] = toaddrs 
msg['Subject'] = "Daily Utmost Devo" 

# webtext, cleanverse, & cleanlink are all <type 'unicode'> at this point 

body = webtext.encode('utf-8') 
bodyverse = cleanverse.encode('utf-8') 
bodylink = cleanlink.encode('utf-8') 
msg.attach(MIMEText(body, 'plain')) 
msg.attach(MIMEText(bodyverse, 'plain')) 
msg.attach(MIMEText(bodylink, 'plain')) 

username = '[email protected]' 
password = 'xxxxx' 

server = smtplib.SMTP('smtp.gmail.com:587') 
server.ehlo() 
server.starttls() 
server.ehlo() 
server.login(username, password) 
text = msg.as_string() 
server.sendmail(fromaddr, toaddrs, text) 
server.quit() 

ответ

0

MimeText принимает _charset параметр:

класса email.mime.text.MIMEText (_TEXT [, _subtype [, _charset]])

Модуль: email.mime.text

Подкласс MIMENonMultipart, класс MIMEText используется для создания объектов MIME основного текста типа . _text - это строка для полезной нагрузки. _subtype является второстепенным и по умолчанию является равным. _charset - это набор символов текста и передается как параметр в конструктор MIMENonMultipart ; это по умолчанию для нас - ascii. Если _text равно unicode, он кодируется с использованием output_charset _charset, в противном случае используется как-есть.

Изменено в версии 2.4: ранее устаревший аргумент _encoding был удален. Кодирование передачи содержимого теперь происходит неявно на основе аргумента _charset.

Если параметр _charset явно не установлено значение Нет, то MimeText созданный объект будет иметь как Content-Type заголовок с кодировок параметром, и заголовок Content-Transfer-Endcoding. Это означает, что последующий вызов set_payloadне приведет к кодированной полезной нагрузке, , даже если в команде set_payload передается кодировка. Вы можете «сбросить» это поведение, удалив заголовок Content-Transfer-Encoding , после чего вызов set_payload автоматически закодирует новую полезную нагрузку (и добавит новый заголовок Content-Transfer-Encoding).

Так что попробуйте

msg.attach(MIMEText(body, 'plain', 'utf-8')) 
msg.attach(MIMEText(bodyverse, 'plain', 'utf-8')) 
msg.attach(MIMEText(bodylink, 'plain', 'utf-8')) 

EDIT Также см эти сообщения

MIMEText UTF-8 encode problems when sending email

Python - How to send utf-8 e-mail?

Encoding of headers in MIMEText

+0

Спасибо! Работала отлично. Как примечание, знаете ли вы какие-либо ресурсы для форматирования текста внутри полученного письма (т. Е. Шрифта, размера и т. Д.)? Еще раз спасибо. – Extinct23

+0

@ Extinct23 вы должны изучить форматирование HTML.Электронная почта позволяет одновременно отправлять в формате HTML и текстовую версию письма. Я не уверен, как Python справляется с этим, хотя –

Смежные вопросы