Форум сайта python.su
Хм-м-м…
Работать - то работает только по почте приходит всякая ерунда.
Получается я должен указать у “str” кодировку, а какая у двоичного файла кодировка?
Офлайн
Не у двоичного файла, а у того, что получается на выходе b64encode. Кодировка там ASCII, я вроде показал.
Офлайн
Не у двоичного файла, а у того, что получается на выходе b64encode. Кодировка там ASCII, я вроде показал.Ага, так я и говорю, приходит покорёженный текстовый файл, и естественно уж не рабочий…
Отредактировано (Фев. 1, 2010 05:15:40)
Офлайн
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())
msg.set_payload(str(b64encode(fp.read()), 'ASCII'))
msg.add_header("Content-Transfer-Encoding", "base64")
Офлайн
Большое спасибо всем ответившим. Но отправить письмо всё равно не смог. С сервера приходит вместе с уведомлением что не может его правильно обработать. Но здесь возможно проблема в почтовике (microsoft exchange 4). Поставил версию 2.5, на ней проблем нет.
Офлайн
Обращаю ваше внимание на то, что вы сменили
connect.sendmail(fromaddr, toaddr, msg.as_string())
на
connect.sendmail(fromaddr, toaddr, msg.as_string)
Т.е. скобки убрали.
И хочу сказать, что прежде чем пытаться что то писать, надо сначала что нибудь изучить. В этом месте вы вместо результата выполнения метода as_string() передали в функцию сам метод as_string. Азы питона: все есть объект. И даже метод - это тоже объект. Рекомендую прочитать вам книгу для новичков в питоне, а после (если с английским все хорошо) “Div into Python 3”, чтобы знать чем 3-ий питон отличается от 2-го (кстати они не совместимы, если это ускользнуло от вашего внимания). И на последок (задело за живое) по своему опыту знаю, что питон постабильнее других будет (если его конечно знать, а не как вы: что-то как-то менять, вдруг заработает)
Офлайн
…если его конечно знать, а не как вы: что-то как-то менять, вдруг заработает…Ну вообще-то так и было :)
# -*- 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)
Офлайн
Вобщем я запустил твой код в паре с денвером и все сработало как часы.
PS: А че за ошибка то? Гуглить по ней не пробовал?
Офлайн
Ошибки никакой нет, уходит на раз, просто с почты письмо приходит с оповещением что были ошибки при прочтении и вываливает то что получило как текстовый файл. Никаких кодов не показывается. Я об этом выше писал.
Офлайн
Коллеги, не судите строго - выкладываю полный рабочий вариант на Питоне3, если все будет работать, то лишние print() закомментируете. У меня все отсылает. Написан для @gmail.com, для других почтовых служб (Яндекс) нужно изменить порт с 587 на 465
Прикреплённый файлы:
put_mail.py (2,8 KБ)
Офлайн