Django电子邮件附件方法不正确采用参数



我的问题是,在发送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())

整个事情都炸毁了,我得到一个价值"需要超过1个值来解开包装",以供email.send((方法。我已经检查了两个变量upload_file和upload_file_name(通过使用PDB工具(,并且两个都在调用附加方法之前获得正确的值。
这是我试图发送邮件的观点:

    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
    )

所以我遇到的错误就是这样:http://dpaste.com/2yzq941
我非常感谢任何帮助。
我使用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)

最新更新