使用Django发送带附件的电子邮件。

5

我希望在Django表单中发送带有附加文件的电子邮件,但我无法弄清如何在不本地保存文件(由用户上传)的情况下发送它。 我有我的表单:

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()]
    )
    file = forms.FileField()
    content = forms.CharField(
        required=True,
        widget=forms.Textarea
    )

我的看法:

def print(request):
   #  context = dict()
   #  context['printers'] = Printer.objects.all()
   #   return render(request, 'threeD/print.html', context)

   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"

            try:
                email = EmailMessage(
                    subject,
                    content,
                    contact_email,
                    [supervisor],
                    headers={'Reply-To': contact_email}
                )
                #email.attach(...)
                email.send()
            except:
                return "Attachment error"

            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)

在我看来,当我发送电子邮件时,有没有一种方法可以调用email.attach(file)将文件附加到邮件并发送,但不保存文件在本地?(表单和视图正常工作,没有实现文件功能)
编辑: 这里是调用表单的HTML代码片段:
 <div class="panel-body">
        <form role="form" action="" method="post">
            {% csrf_token %}
            {% load bootstrap %}
               {{ form|bootstrap }}

            <div class="text-center">
                <button type="submit" class="btn btn-primary"><span class="glyphicon glyphicon-send"></span>    Send a message</button>
            </div>
        </form>
 </div>

非常感谢您的帮助。谢谢!
1个回答

12

像这样的东西:

def send_email(request):
    ...
    email = EmailMessage(
        subject,
        content,
        contact_email,
        [to],
        headers={'Reply-To': contact_email}
    )
    if request.FILES:
        uploaded_file = request.FILES['file'] # file is the name value which you have provided in form for file field
        email.attach(uploaded_file.name, uploaded_file.read(), uploaded_file.content_type)
    email.send()

非常感谢您的帮助。当我使用“file = forms.FileField()”时,我的表单是否有任何问题?因为即使使用您的视图方法,它仍然无法正常工作,并且在提交后在该字段旁边写入“此字段是必需的”,就像没有附加文件一样,即使有文件也是如此。 - Ilja Leiko
我已经添加了我的HTML代码,它相当原始。很抱歉,但恐怕当控制器到达视图时,我不知道如何获取request.FILES的值。 :/ - Ilja Leiko
它是 request.FILES 而不是 request.FILE! - Abijith Mg
哦,对不起。我刚刚尝试了print方法的FILE和FILES两种方式,但都出现了相同的错误。 但是使用pdb调试后,我得到了以下信息:"-> if form.is_valid(): (Pdb) request.FILES <MultiValueDict: {}>",即一个空字典 :O - Ilja Leiko
请为表单标签添加以下属性:<form enctype="multipart/form-data"></form> 这样做肯定有效。 - Abijith Mg
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接