Найти - Пользователи
Полная версия: Отправка писем в 3-ем питоне
Начало » Python для новичков » Отправка писем в 3-ем питоне
1 2 3
Artem
Хм-м-м…
Работать - то работает только по почте приходит всякая ерунда.
Получается я должен указать у “str” кодировку, а какая у двоичного файла кодировка?
Ed
Не у двоичного файла, а у того, что получается на выходе b64encode. Кодировка там ASCII, я вроде показал.
Artem
Не у двоичного файла, а у того, что получается на выходе b64encode. Кодировка там ASCII, я вроде показал.
Ага, так я и говорю, приходит покорёженный текстовый файл, и естественно уж не рабочий…
pyuser
Ed
from base64 import b64encode
outer = MIMEMultipart()
fp = open(fname, 'rb')
msg = MIMEBase("application", "octet-stream")
msg.set_payload(str(b64encode(fp.read()), 'ASCII'))
msg.add_header('Content-Disposition', 'attachment', filename=fname)
fp.close()
outer.attach(msg)
print(outer.as_string())
приатаченный файл действительно не похож на исходный :(
Вы же сами указали на решение (http://bugs.python.org/issue4768)
перед строкой:
msg.set_payload(str(b64encode(fp.read()), 'ASCII'))
нужно добавить:
msg.add_header("Content-Transfer-Encoding", "base64")
Artem
Большое спасибо всем ответившим. Но отправить письмо всё равно не смог. С сервера приходит вместе с уведомлением что не может его правильно обработать. Но здесь возможно проблема в почтовике (microsoft exchange 4). Поставил версию 2.5, на ней проблем нет.
dartNNN
Обращаю ваше внимание на то, что вы сменили
connect.sendmail(fromaddr, toaddr, msg.as_string())
на
connect.sendmail(fromaddr, toaddr, msg.as_string)
Т.е. скобки убрали.
И хочу сказать, что прежде чем пытаться что то писать, надо сначала что нибудь изучить. В этом месте вы вместо результата выполнения метода as_string() передали в функцию сам метод as_string. Азы питона: все есть объект. И даже метод - это тоже объект. Рекомендую прочитать вам книгу для новичков в питоне, а после (если с английским все хорошо) “Div into Python 3”, чтобы знать чем 3-ий питон отличается от 2-го (кстати они не совместимы, если это ускользнуло от вашего внимания). И на последок (задело за живое) по своему опыту знаю, что питон постабильнее других будет (если его конечно знать, а не как вы: что-то как-то менять, вдруг заработает)
Artem
…если его конечно знать, а не как вы: что-то как-то менять, вдруг заработает…
Ну вообще-то так и было :)
Это с одной стороны, а с другой найти с ходу пример для третьего питона не так-то просто, а если нет опыта работы на втором, то понять сразу различие тоже не получится.

Вот последний вариант (который не работает):
# -*- coding: utf-8 -*-

from smtplib import SMTP

from email.message import Message
from email.header import Header, make_header
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email.mime.application import MIMEApplication
from email import encoders

from base64 import b64encode


import os
import sys
import mimetypes

russian = 'windows-1251'

msg = MIMEMultipart()

msg["From"] = make_header([("Недруг", russian), ("<from@from.from.ru>", "us-ascii")])
msg["To"] = make_header([("Друг", russian), ("<to@to.to.ru>", "us-ascii")])
msg["Subject"] = Header("привет", russian)

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

#Прикладывается файл
fp = open("D:\\Temp\\aa.cdr", "rb")
to_attach = MIMEBase("application", "octet-stream")
to_attach.add_header("Content-Disposition", "attachment", filename="dfdfd")
to_attach.add_header("Content-Transfer-Encoding", "base64")
to_attach.set_payload(str(b64encode(fp.read()), 'ASCII'))
fp.close()
msg.attach(to_attach)

#print(msg.as_string())
smail=msg.as_string()

fromaddr = "from@from.from.ru"
toaddr = "to@to.to.ru"

connect = SMTP('XX.XX.XX.XX')
connect.set_debuglevel(0)
connect.sendmail(fromaddr, toaddr, smail)
connect.quit()
Все замечания вроде устранены, а приходит всё равно с ошибкой. Так что…
dartNNN
Вобщем я запустил твой код в паре с денвером и все сработало как часы.
PS: А че за ошибка то? Гуглить по ней не пробовал?
Artem
Ошибки никакой нет, уходит на раз, просто с почты письмо приходит с оповещением что были ошибки при прочтении и вываливает то что получило как текстовый файл. Никаких кодов не показывается. Я об этом выше писал.
stas.kostenkov
Коллеги, не судите строго - выкладываю полный рабочий вариант на Питоне3, если все будет работать, то лишние print() закомментируете. У меня все отсылает. Написан для @gmail.com, для других почтовых служб (Яндекс) нужно изменить порт с 587 на 465
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