2017-04-18 45 views
0

我的問題是,當在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()) 

整個事情炸燬,我也得到一個ValueError「需要1個多值解壓」爲email.send () 方法。我已經檢查了變量upload_file和upload_file_name(通過使用pdb工具),並且在調用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 
    ) 

,所以我得到的錯誤是這樣的: 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() 

回答

1

我覺得需要一個內容類型,也許嘗試更多這樣的東西

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

謝謝你,davidejones,您的評論。那麼,我已經嘗試過 - 它不起作用。如果我更改upload_file = form.cleaned_data.get(...),那麼當我附加文件 –

+0

時,我得到「'NoneType'對象沒有屬性'read'」行哦聽起來好像你可能沒有在你的django中的stl_file然後形成。如果請求文件的作品,你應該嘗試相同的代碼,但與'uploaded_file = request.FILES ['stl_file']'看看是否有效。我認爲最主要的是確保傳遞內容類型 – davidejones

+0

Django文檔說內容類型是可選的東西。但我已經嘗試把它作爲:email.attach(uploaded_file_name,uploaded_file.read(),uploaded_file_type),其中up​​loaded_file_type = request.FILES ['stl_file']。content_type(我用pdb檢查變量獲取值),但它是仍然是同樣惱人的ValueError –