【问题标题】:Sending email with attached file in Django在 Django 中发送带有附件的电子邮件
【发布时间】:2017-04-17 14:34:17
【问题描述】:

我正在尝试以带有附件的 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 代码 sn-p,我在这里调用表单:

 <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>

任何帮助将不胜感激。谢谢!

【问题讨论】:

    标签: python django file email


    【解决方案1】:

    类似这样的:

    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()”时,我的表单有什么问题吗?因为使用您的视图方法,它仍然不起作用,并且它写“此字段是必需的”。提交后在字段附近,就像没有附加文件一样,即使它是
    • 编辑您的问题以添加表单的 html 代码,并在控件进入视图时添加 request.FILES 值。
    • 我已经添加了我的html代码,这很原始。很抱歉,但是当控件进入视图时,恐怕我不知道如何获取 request.FILES 值。 ://
    • 有2种方式,使用python断点:import pdb; pdb.set_trace() 在视图开始处(服务器控制将停在那里)或添加“打印请求。文件”这将打印服务器日志中的值。
    • 嗯。这很奇怪。我首先尝试了 python 断点,在提交之后我在控制台中得到了一个 Pdb。我输入了 request.FILE,它说:“*** AttributeError: 'WSGIRequest' object has no attribute 'FILE'”。我试过打印(request.FILE),我得到错误“'MultiValueDict'对象没有属性'method'”和异常值:'WSGIRequest'对象没有属性'FILE'
    猜你喜欢
    • 2011-01-28
    • 2015-09-09
    • 2017-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多