Python Django电子邮件附加方法未正确使用参数

Python Django电子邮件附加方法未正确使用参数,python,django,forms,filefield,Python,Django,Forms,Filefield,我的问题是,在django中发送电子邮件时,我想附加一个文件 如果我这样做: email.attach("Random_name", uploaded_file.read()) 它可以工作,我的电子邮件也可以发送。但是如果不是字符串随机名称,而是在其中放入一个变量,表示上传的文件名,如下所示: uploaded_file = request.FILES['stl_file'] uploaded_file_name = request.FILES['stl_fi

我的问题是,在django中发送电子邮件时,我想附加一个文件

如果我这样做:

email.attach("Random_name", uploaded_file.read()) 
它可以工作,我的电子邮件也可以发送。但是如果不是字符串随机名称,而是在其中放入一个变量,表示上传的文件名,如下所示:

        uploaded_file = request.FILES['stl_file']
        uploaded_file_name = request.FILES['stl_file'].name
        email.attach(uploaded_file_name, uploaded_file.read())
整个事情都发生了,我得到了一个ValueError,需要超过1个值才能解包为email.send方法。我使用pdb工具检查了upload_file和upload_file_Name这两个变量,在调用attach方法之前,它们都得到了正确的值。 以下是我试图发送邮件的视图:

    def print(request):

   if request.method == 'POST':
        form = PrintForm(data=request.POST, request = request)

        if form.is_valid():
            contact_name = request.POST.get('contact_name', '')
            contact_email = request.POST.get('contact_email', '')
            form_content = request.POST.get('content', '')
            supervisor = form.cleaned_data['supervisor']
            template = get_template('threeD/email/contact_template_for_printing.txt')
            context = Context({
                'contact_name': contact_name,
                'supervisor': supervisor,
                'contact_email': contact_email,
                'form_content': form_content,
            })
            content = template.render(context)
            subject = "New message"

            email = EmailMessage(
                    subject,
                    content,
                    contact_email,
                    [supervisor],
                    headers={'Reply-To': contact_email}
            )
            if request.FILES:
                uploaded_file = request.FILES['stl_file']
                uploaded_file_name = request.FILES['stl_file'].name
                email.attach(uploaded_file_name, uploaded_file.read())
            email.send()

            messages.success(request, "Thank you for your message.")
            return redirect('/index/print/')

   else:
            form = PrintForm(request=request)
   context_dict = {}
   context_dict['printers'] = Printer.objects.all()
   context_dict['form'] = form
   return render(request, 'threeD/print.html', context_dict)
我的表格:

class PrintForm(forms.Form):
    contact_name = forms.CharField(required=True)
    contact_email = forms.EmailField(required=True)
    supervisor = forms.ChoiceField(
        choices=[(str(sup.email), str(sup.name)) for sup in Supervisors.objects.all()]
    )
    stl_file = forms.FileField(required=False)
    stl_file.help_text = "Upload your file as .STL format. If you have more than one file, " \
                     "make a .zip and upload them all at once"
    content = forms.CharField(
        required=True,
        widget=forms.Textarea
    )
所以我得到的错误是这样的: 如果有任何帮助,我将不胜感激。 我使用的是Django 1.9版本 解决了的 最终通过硬编码文件类型为“应用程序/八位字节流”来解决,例如:

        uploaded_file = request.FILES['stl_file']
        uploaded_file_name = request.FILES['stl_file'].name
        email.attach(uploaded_file_name, uploaded_file.read(), 'application/octet-stream')
        email.send()

我认为它需要一个内容类型,也许可以尝试类似的东西

uploaded_file = form.cleaned_data.get('stl_file', '')
email.attach(uploaded_file.name, uploaded_file.read(), uploaded_file.content_type)

大卫琼斯,谢谢你的评论。嗯,我已经试过了——它不起作用。如果我更改upload\u file=form.cleaned\u data.get。。。然后,当我附加文件时,我得到'NoneType'对象在行中没有属性'read'。哦,好的,听起来你可能没有django表单中的stl_文件。如果请求文件有效,您应该尝试使用相同的代码,但使用上载的\u file=request.FILES['stl\u file'],看看是否有效。我认为主要的事情是确保传递一个content-typeDjango文档说content-type是一个可选的东西。但是我试着把它放在:email.attachuploaded_file_name,uploaded_file.read,uploaded_file_type,其中uploaded_file_type=request.FILES['stl_file']。content_type我用pdb检查过变量的值,但它仍然是同一个恼人的值ErrorWell根据dpaste的错误,它在解析mime类型时遇到了问题,mime类型是电子邮件中的最后一个参数。你能告诉我上传的文件名和上传的文件类型变量值是什么吗?“simplify3d\u stl”似乎不正确,请尝试硬编码此电子邮件类型。附件上传的文件名,上传的文件。读取“应用程序/八位字节流”