Контактная форма Django Python сохраняет файл, но не отправляет письмо
Я пытаюсь создать простую контактную форму с возможностью загрузки файла; я не хочу, чтобы файл был прикреплен к сообщению электронной почты, я просто хочу сохранить файл в /media.
Я использую required=False в форме, чтобы не требовать файл. Но все равно, некоторые из моих логик валидации или обработки формы неверны; код ниже работает, когда я отправляю контактную форму без файла, и я получаю электронное письмо. Но если я прикрепляю файл, файл сохраняется в медиа, но я не получаю письмо, хотя контактная форма правильно отображает thanks.html после отправки формы.
В логах ошибок нет. Ubuntu 20.04; Django 4.0.3; Python 3.8.10; Apache 2.4
contact/contactform/forms.py
from django import forms
class ContactForm(forms.Form):
name = forms.CharField(required=True, widget=forms.TextInput(
attrs={'class': 'form-control', 'maxlength': '100'}
))
email_address = forms.EmailField(required=True, widget=forms.EmailInput(
attrs={'class': 'form-control', 'maxlength': '100'}
))
document = forms.FileField(required=False)
message = forms.CharField(required=True, widget=forms.Textarea(
attrs={'class': 'form-control', 'maxlength': '1000', 'rows': 8}
))
contact/contactform/views.py
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from django.shortcuts import render, get_object_or_404, redirect
from django.core.files.storage import FileSystemStorage
from contactform.forms import ContactForm
from contact.settings import EMAIL_HOST_USER, EMAIL_PORT, EMAIL_HOST_PASSWORD, EMAIL_HOST
def thanks(request):
return render(request, 'thanks.html', {})
def contact(request):
if request.method == 'POST':
form = ContactForm(request.POST,request.FILES)
request_file = request.FILES['document'] if 'document' in request.FILES else None
if request_file:
fs = FileSystemStorage()
file = fs.save(request_file.name, request_file)
fileurl = fs.url(file)
if form.is_valid():
form_data = form.cleaned_data
msg = MIMEMultipart()
msg['From'] = EMAIL_HOST_USER
msg['To'] = EMAIL_HOST_USER
msg['Subject'] = f'Site Email'
message = f'Name: {form_data["name"]}\n' \
f'Email address: {form_data["email_address"]}\n\n' \
f'{form_data["message"]}'
msg.attach(MIMEText(message))
with smtplib.SMTP(EMAIL_HOST, EMAIL_PORT) as server:
server.ehlo()
server.starttls()
server.login(EMAIL_HOST_USER, EMAIL_HOST_PASSWORD)
server.sendmail(EMAIL_HOST_USER, EMAIL_HOST_USER, msg.as_string())
return redirect('contactform:thanks')
else:
form = ContactForm()
return render(request, 'contact.html', { "form": form })
contact/contactform/templates/contact.html
<h2>Form</h2>
<form action="{% url 'contactform:contact' %}" method="post" enctype="multipart/form-data">
{% csrf_token %}
{{ form }}
<button type="submit">Send</button>
</form>
{% endblock %}