Размер файла вложения становится 0 (сжатым) в автоматизации электронной почты Python Django, т.е. имя файла отображается, а содержимое вложенного pdf не отображается

Код для отправки электронной почты в Django написан так в файле views.py - он отлично отправляет pdf, если размер файла большой (~3mb), но для меньших файлов (~1 или 2mb) он не отправляет файл (он появляется как файл с нулевым байтом) в электронной почте, и поэтому мы не можем получить к нему доступ. Код приведен ниже. Пожалуйста, дайте мне знать, если есть способ избежать такого сжатия файла и отправлять маленькие файлы на.


def addbeast(request):
    
    if request.method == 'POST':
        form = BeastForm(request.POST, request.FILES)
        # print("here")
        # print(form.cleaned_data['name'])
        if form.is_valid():
            # print("here")
            # print(form.cleaned_data['media'])
            form.save()

            # media = Beast.objects.get(name = '')
            name  = form.cleaned_data['name']
            media = form.cleaned_data['media']
            media.seek(0, os.SEEK_END)
            filesize = media.tell()
            print(filesize)
            
            subject = "NDA IS Attached"
            message = "NDA Attachment from " + name 
            
            sender = "-----@gmail.com"
            cc_myself = True
            cc_mail = "----!!!!!!@gmail.com"

            recipients = ['9999999999@gmail.com']
            if cc_myself:
                recipients.append(cc_mail)


            
            try:
                mail = EmailMessage(subject, message, sender, recipients)

                mail.attach(media.name, media.read(), media.content_type)
                mail.send()
                return HttpResponse("FORM SUBMISSION IS SUCCESSFUL")
            except:
                return HttpResponse('no success')


            
    else:
        form = BeastForm()


    return render(request, "post_list.html", {
        "form": form
    })

Пожалуйста, помогите, как можно исправить код, при печати переменного носителя я получаю 'filename.pdf'.

Попробуйте вставить "media.seek(0)" перед строкой "mail.attach(media.name..."

Django использует InMemoryUploadedFile, если длина содержимого меньше FILE_UPLOAD_MAX_MEMORY_SIZE (2.5MB по умолчанию), иначе он использует TemporaryUploadedFile.

Ваш "media.seek(0, os.SEEK_END)" помещает текущую позицию файла в конец. Похоже, что последующая команда read продолжается с текущей позиции для файла в памяти, но начинается с начала для временных файлов.

Вернуться на верх