Почта Python: закодированные вложения усекаются

1

Я использую следующую функцию для отправки сообщения электронной почты с двумя вложениями в моем скрипте 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

Есть идеи?

  • 0
    Вы используете 'rb' . Это хорошо. У вас была версия, которая не использовала это, и вы под Windows? Вы уверены, что ваше возмущение все еще верно?
  • 0
    У меня нет другой версии. Я на MacOSX. Я на самом деле просто снова запускаю сценарий, используя также «r», но счет все еще меньше.
Показать ещё 2 комментария
Теги:
base64
sendmail

3 ответа

2
Лучший ответ

Нашел проблему. Оказывается, я попытался отправить файлы до того, как буфер процесса записи полностью покраснел.

Таким образом, это была проблема синхронизации, а не проблема с кодировкой.

Извините, и спасибо за помощь ребятам!

  • 0
    Хороший улов, я думаю, @ ответ Майкла был полезной подсказкой.
  • 1
    Я рад, что вы решили это, но это не очень хороший ответ, если вы не объясните, как вы решили это. Я сталкиваюсь с той же проблемой, и, поскольку я, кажется, делаю все это синхронно, трудно понять, как это связано со временем.
1

Может ли это быть связано с вашим текущим base64.MAXBINSIZE? Encoders.encode_base64 использует base64.encodestring внутренне. Значение по умолчанию для base64.MAXBINSIZE равно 57, всегда можно попытаться установить его больше: base64.MAXBINSIZE = 65536

  • 0
    Где находится base64.MAXBINSIZE ? Не удалось найти его в Encoders .
  • 0
    Кодеры импортируют base64, а в base64 MAXBINSIZE = (MAXLINESIZE // 4) * 3 и MAXLINESIZE = 76
Показать ещё 2 комментария
0

Если файл уже написан - обязательно.close() файл и повторно открыть()/. Read() для полезной нагрузки.

Мои проблемы были связаны с сроками, и это решило проблему для меня.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню