Найти - Пользователи
Полная версия: Использование русских букв с smtplib
Начало » Python для новичков » Использование русских букв с smtplib
1 2
Artem
Добрый день.
У меня такая проблема, при тестировании стандартного скрипта вываливается ошибка.

Скрипт:
# -*- coding: utf-8 -*-
from smtplib import SMTP
fromaddr = “aa@aa.aa.ru
toaddr = “bb@bb.bb.ru

body='русский текст'

message = “”"From: robot<%(fromaddr)s>
To: dejoper
Subject: message!
MIME-Version: 1.0
Content-Type: text/plain; charset=Windows-1251
Content-Transfer-Encoding: 8bit

%(body)s

“”“ % vars()
connect = SMTP('XX.XX.XX.XX')
connect.set_debuglevel(1)
connect.sendmail(fromaddr, toaddr, message )
connect.quit()

Ошибка:
UnicodeEncodeError: ‘ascii’ codec can't encode characters in position 81-83: ordinal not in range(128)

Стоит python 3.1. Хотелось бы ещё в полях ”заголовок-от-кому“ тоже по-русски написать, нашёл функцию ”encode", но она в данном случае символы преобразует в двоичный вид.
Андрей Светлов
Используйте пакет email для создания сообщения с указанием предпочитаемой кодировки.
В документации есть примеры.
Artem
Андрей Светлов
Используйте пакет email для создания сообщения с указанием предпочитаемой кодировки.
В документации есть примеры.
переделал:
# -*- coding: utf-8 -*-
from smtplib import SMTP

from email.header import make_header as mkh
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText

msg = MIMEMultipart()
msg = mkh()
msg = mkh()
msg = mkh()

m=“”“привет”“”
text = MIMEText(m)
to_attach = MIMEText(text, _charset=“cp1251”)
msg.attach(text)

fromaddr = “fromuser@aa.aa.ru
toaddr = “touser@bb.bb.ru

connect = SMTP('ХХ.ХХ.ХХ.ХХ')
connect.set_debuglevel(1)
connect.sendmail(fromaddr, toaddr, msg.as_string())
connect.quit()

С латиницей работает, с кириллицей нет, выдаёт: “SyntaxError: (unicode error) ‘utf8’ codec can't decode bytes in position 0-2: invalid data”.
Если к строчку m=“”“привет”“” переделать в “”“привет”“”.encode(“cp1251”) - ничего не меняется, та же ошибка, если изменить на
u“”“привет”“”.encode(“cp1251”) то вылазит следующее:

m=u“”“\ufffd\ufffd”“”.encode(“cp1251”)
^
SyntaxError: invalid syntax

есть ещё странная проблема: письмо приходит с шапкой:
от: fromuser
кому: touser
а должно:
от: fromuser
кому: touser
второй адрес почему-то не отображается.

По ссылкам про кодировку походил, читал внимательно. Победить всё равно не могу.
Artem
Так, это тоже проблема с кодировкой. В 3.1 нет ни “unicode”, ни “u” Подскажите как преобразовать строку именно в версии 3.1. или ткните где это написано.
Андрей Светлов
# -*- coding: utf-8 -*-
from smtplib import SMTP

from email.header import Header
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText

russian = 'windows-1251'

msg = MIMEMultipart()
msg["Subject"] = Header("привет", russian)
msg["From"] = Header("Петя <from@mail.ru>", russian)
msg["To"] = Header("Вася <to@mail.ru>", russian)

m = """привет от Васи"""
text = MIMEText(m.encode('cp1251'), 'plain', russian)
msg.attach(text)

with open('out.txt', 'w') as f:
f.write(msg.as_string())

#fromaddr = "fromuser@aa.aa.ru"
#toaddr = "touser@bb.bb.ru"

#connect = SMTP('ХХ.ХХ.ХХ.ХХ')
#connect.set_debuglevel(1)
#connect.sendmail(fromaddr, toaddr, msg.as_string())
#connect.quit()
Artem
Большое спасибо
почти всё работает, только в шапке (from, to) если вставить русский текст то появляется что-то вроде
“=?windows-1251?b?4uDx/yA8a2FydG9ncmFmQHNpYnJjLm1jaHMucnU+?=”

на пхп, кстати, аналогичный скрипт отрабатывает на ура.
и проблема тут уже не в кодировке, пхп отдаёт:
“To: =?windows-1251?Q?=D0=A1=D0=A0=D0=A6_=D0=A3=D0=9F_=D0=93=D1=80=D0=9F=D0=B8=D0=9E=D0=9D_=281=29_=D0=D1=8F=D1=81=D0=BE=D0_=D0=90.=D0=9D.?= <to@bb.bb.ru>”

а питон
“=?windows-1251?b?4uDx/yA8a2FydG9ncmFJjLm1jaHMucnU+?=”

может ему ещё где-то опцию доставить надо?
Андрей Светлов
Отчего же не в кодировке. php правильно заворачивает каждый символ в base64. Нужно глянуть, отчего email так не делает (а вроде бы должен уметь).
Сейчас сильно занят, гляну ближе к вечеру
poltergeist
"=?windows-1251?b?4uDx/yA8a2FydG9ncmFJjLm1jaHMucnU+?=“ - закодирован питоном в base64 кодировке
”=?windows-1251?Q?=D0=A1=D0=A0=D0=A6_=D ……" - закодирован пыхой в quoted-printable кодировке
Питон использует base64 для не ascii-like кодировок, и quopri для ascii-like кодировок.
Artem
poltergeist
“=?windows-1251?b?4uDx/yA8a2FydG9ncmFJjLm1jaHMucnU+?=” - закодирован питоном в base64 кодировке
“=?windows-1251?Q?0=A1=D0=A0=D0=A6_=D ……” - закодирован пыхой в quoted-printable кодировке
Питон использует base64 для не ascii-like кодировок, и quopri для ascii-like кодировок.
Спасибо за пояснение, разобрался, теперь не получается вставить файл в почтовое сообщение, копирование примеров из книги не спасает:
http://python.su/forum/viewtopic.php?id=6179
ConConovaloff
Топик-пастеры, пожалуйста, если в конце топика у Вас хватило времени написать “Спасибо за пояснение, разобрался” или “Я уже нашел решение. Тему можно закрывать”, то не поленитесь оставить информацию о решение которое Вы нашли.
Ни что так не нервирует, как подобные ответы в конце темы, которая полностью описывает твою проблему.

from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
import quopri
def QuoHead(String):
    s = quopri.encodestring(String.encode('UTF-8'), 1, 0)
    return "=?utf-8?Q?" + s.decode('UTF-8') + "?="
FIOin = "Андрей Петрович"
emailout = "some@test.ru"
emailin = "some2@test.ru"
msg = MIMEMultipart()
msg["Subject"] = QuoHead("Добрый день " + FIOin).replace('=\n', '')
msg["From"] = (QuoHead("Ирина Федоровна") + "  <" + emailout + ">").replace('=\n', '') 
msg["To"] = (QuoHead(FIOin) + "  <" + emailin + ">").replace('=\n', '')
m = """Добрый день.
  Это тестовое письмо.
Пожалуйста, не отвечайте на него."""
text = MIMEText(m.encode('utf-8'), 'plain', 'UTF-8')
msg.attach(text)
print(msg.as_string())

Вывод:
Content-Type: multipart/mixed; boundary="===============2112037152=="
MIME-Version: 1.0
Subject: =?utf-8?Q?=D0=94=D0=BE=D0=B1=D1=80=D1=8B=D0=B9=20=D0=B4=D0=B5=D0=BD=D1=8C=20=D0=90=D0=BD=D0=B4=D1=80=D0=B5=D0=B9=20=D0=9F=D0=B5=D1=82=D1=80=D0=BE=D0=B2=D0=B8=D1=87?=
From: =?utf-8?Q?=D0=98=D1=80=D0=B8=D0=BD=D0=B0=20=D0=A4=D0=B5=D0=B4=D0=BE=D1=80=D0=BE=D0=B2=D0=BD=D0=B0?= <some@test.ru>
To: =?utf-8?Q?=D0=90=D0=BD=D0=B4=D1=80=D0=B5=D0=B9=20=D0=9F=D0=B5=D1=82=D1=80=D0=BE=D0=B2=D0=B8=D1=87?= <some2@test.ru>

--===============2112037152==
MIME-Version: 1.0
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: base64

0JTQvtCx0YDRi9C5INC00LXQvdGMLgogINCt0YLQviDRgtC10YHRgtC+0LLQvtC1INC/0LjRgdGM
0LzQvi4K0J/QvtC20LDQu9GD0LnRgdGC0LAsINC90LUg0L7RgtCy0LXRh9Cw0LnRgtC1INC90LAg
0L3QtdCz0L4u

--===============2112037152==--
Обработка заголовков успешно проверена на yandex, mail, rambler, gmail
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