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()
謝謝你,davidejones,您的評論。那麼,我已經嘗試過 - 它不起作用。如果我更改upload_file = form.cleaned_data.get(...),那麼當我附加文件 –
時,我得到「'NoneType'對象沒有屬性'read'」行哦聽起來好像你可能沒有在你的django中的stl_file然後形成。如果請求文件的作品,你應該嘗試相同的代碼,但與'uploaded_file = request.FILES ['stl_file']'看看是否有效。我認爲最主要的是確保傳遞內容類型 – davidejones
Django文檔說內容類型是可選的東西。但我已經嘗試把它作爲:email.attach(uploaded_file_name,uploaded_file.read(),uploaded_file_type),其中uploaded_file_type = request.FILES ['stl_file']。content_type(我用pdb檢查變量獲取值),但它是仍然是同樣惱人的ValueError –