Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 29, 2010 08:15:18

Artem
От:
Зарегистрирован: 2009-12-30
Сообщения: 24
Репутация: +  -1  -
Профиль   Отправить e-mail  

Отправка писем в 3-ем питоне

Хм-м-м…
Работать - то работает только по почте приходит всякая ерунда.
Получается я должен указать у “str” кодировку, а какая у двоичного файла кодировка?



Офлайн

#2 Янв. 29, 2010 11:45:13

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

Отправка писем в 3-ем питоне

Не у двоичного файла, а у того, что получается на выходе b64encode. Кодировка там ASCII, я вроде показал.



Офлайн

#3 Фев. 1, 2010 05:15:21

Artem
От:
Зарегистрирован: 2009-12-30
Сообщения: 24
Репутация: +  -1  -
Профиль   Отправить e-mail  

Отправка писем в 3-ем питоне

Не у двоичного файла, а у того, что получается на выходе b64encode. Кодировка там ASCII, я вроде показал.
Ага, так я и говорю, приходит покорёженный текстовый файл, и естественно уж не рабочий…



Отредактировано (Фев. 1, 2010 05:15:40)

Офлайн

#4 Фев. 1, 2010 09:14:45

pyuser
От:
Зарегистрирован: 2007-05-13
Сообщения: 658
Репутация: +  36  -
Профиль   Отправить e-mail  

Отправка писем в 3-ем питоне

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")



Офлайн

#5 Фев. 8, 2010 04:54:15

Artem
От:
Зарегистрирован: 2009-12-30
Сообщения: 24
Репутация: +  -1  -
Профиль   Отправить e-mail  

Отправка писем в 3-ем питоне

Большое спасибо всем ответившим. Но отправить письмо всё равно не смог. С сервера приходит вместе с уведомлением что не может его правильно обработать. Но здесь возможно проблема в почтовике (microsoft exchange 4). Поставил версию 2.5, на ней проблем нет.



Офлайн

#6 Фев. 8, 2010 13:14:50

dartNNN
От:
Зарегистрирован: 2009-12-08
Сообщения: 199
Репутация: +  0  -
Профиль   Отправить e-mail  

Отправка писем в 3-ем питоне

Обращаю ваше внимание на то, что вы сменили
connect.sendmail(fromaddr, toaddr, msg.as_string())
на
connect.sendmail(fromaddr, toaddr, msg.as_string)
Т.е. скобки убрали.
И хочу сказать, что прежде чем пытаться что то писать, надо сначала что нибудь изучить. В этом месте вы вместо результата выполнения метода as_string() передали в функцию сам метод as_string. Азы питона: все есть объект. И даже метод - это тоже объект. Рекомендую прочитать вам книгу для новичков в питоне, а после (если с английским все хорошо) “Div into Python 3”, чтобы знать чем 3-ий питон отличается от 2-го (кстати они не совместимы, если это ускользнуло от вашего внимания). И на последок (задело за живое) по своему опыту знаю, что питон постабильнее других будет (если его конечно знать, а не как вы: что-то как-то менять, вдруг заработает)



Офлайн

#7 Фев. 9, 2010 08:17:44

Artem
От:
Зарегистрирован: 2009-12-30
Сообщения: 24
Репутация: +  -1  -
Профиль   Отправить e-mail  

Отправка писем в 3-ем питоне

…если его конечно знать, а не как вы: что-то как-то менять, вдруг заработает…
Ну вообще-то так и было :)
Это с одной стороны, а с другой найти с ходу пример для третьего питона не так-то просто, а если нет опыта работы на втором, то понять сразу различие тоже не получится.

Вот последний вариант (который не работает):
# -*- 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()
Все замечания вроде устранены, а приходит всё равно с ошибкой. Так что…



Отредактировано (Фев. 9, 2010 08:18:42)

Офлайн

#8 Фев. 9, 2010 17:32:56

dartNNN
От:
Зарегистрирован: 2009-12-08
Сообщения: 199
Репутация: +  0  -
Профиль   Отправить e-mail  

Отправка писем в 3-ем питоне

Вобщем я запустил твой код в паре с денвером и все сработало как часы.
PS: А че за ошибка то? Гуглить по ней не пробовал?



Офлайн

#9 Фев. 11, 2010 04:00:46

Artem
От:
Зарегистрирован: 2009-12-30
Сообщения: 24
Репутация: +  -1  -
Профиль   Отправить e-mail  

Отправка писем в 3-ем питоне

Ошибки никакой нет, уходит на раз, просто с почты письмо приходит с оповещением что были ошибки при прочтении и вываливает то что получило как текстовый файл. Никаких кодов не показывается. Я об этом выше писал.



Офлайн

#10 Март 29, 2019 18:25:17

stas.kostenkov
Зарегистрирован: 2019-03-29
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Отправка писем в 3-ем питоне

Коллеги, не судите строго - выкладываю полный рабочий вариант на Питоне3, если все будет работать, то лишние print() закомментируете. У меня все отсылает. Написан для @gmail.com, для других почтовых служб (Яндекс) нужно изменить порт с 587 на 465

Прикреплённый файлы:
attachment put_mail.py (2,8 KБ)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version