Я использую следующую функцию для отправки сообщения электронной почты с двумя вложениями в моем скрипте python:
import smtplib
from email.MIMEMultipart import MIMEMultipart
from email.MIMEBase import MIMEBase
from email.MIMEText import MIMEText
from email.Utils import COMMASPACE, formatdate
from email import Encoders
...
def sendMail(sender_name, to, subject, text, files=None,server="localhost"):
assert type(to)==list
if files:
assert type(files)==list
print "Files: ",files
fro = sender_name
msg = MIMEMultipart()
msg['From'] = fro
msg['To'] = COMMASPACE.join(to)
msg['Date'] = formatdate(localtime=True)
msg['Subject'] = subject
msg.attach( MIMEText(text) )
if files:
for file in files:
# ************** File attaching - Start **************
part = MIMEBase('application', "octet-stream")
part.set_payload( open(file,"rb").read() )
Encoders.encode_base64(part)
part.add_header('Content-Disposition', 'attachment; filename="%s"' % os.path.basename(file))
msg.attach(part)
# ************** File attaching - End **************
server.set_debuglevel(1)
server.ehlo()
server.starttls()
server.ehlo()
server.sendmail(fro, to, msg.as_string())
server.quit()
Я получаю почту, а вложения есть, но по какой-то причине они немного усечены. Я предполагаю, что я что-то пропустил в процессе кодирования.
Например:
Приложение 1: Исходный байт файла составляет 1433902, а новый байт - 1433600
Приложение 2: Исходный байт файла составляет 2384703, а новый байт - 2383872
Есть идеи?
Нашел проблему. Оказывается, я попытался отправить файлы до того, как буфер процесса записи полностью покраснел.
Таким образом, это была проблема синхронизации, а не проблема с кодировкой.
Извините, и спасибо за помощь ребятам!
Может ли это быть связано с вашим текущим base64.MAXBINSIZE
? Encoders.encode_base64
использует base64.encodestring
внутренне. Значение по умолчанию для base64.MAXBINSIZE
равно 57, всегда можно попытаться установить его больше: base64.MAXBINSIZE = 65536
base64.MAXBINSIZE
? Не удалось найти его в Encoders
.
Если файл уже написан - обязательно.close() файл и повторно открыть()/. Read() для полезной нагрузки.
Мои проблемы были связаны с сроками, и это решило проблему для меня.
'rb'
. Это хорошо. У вас была версия, которая не использовала это, и вы под Windows? Вы уверены, что ваше возмущение все еще верно?