Почта Python: закодированные вложения усекаются - PullRequest
1 голос
/ 24 августа 2011

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

* 1009.* Приложение 2: Количество байтов в исходном файле равно 2384703, а число новых байтов - 2383872

Есть идеи?

Ответы [ 3 ]

2 голосов
/ 24 августа 2011

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

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

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

1 голос
/ 24 августа 2011

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

0 голосов
/ 20 февраля 2016

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

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

...