熟悉python的童鞋基本都知道可以利用smtplib模块开发邮件发送功能,django在其上封装了一个更为简易的方法,照例,官网的参考链接放在底部。
官网示例如下,send_mail的参数官网已经解释的很清楚了:
from django.core.mail import send_mail
send_mail(
'Subject here',
'Here is the message.',
'from@example.com',
['to@example.com'],
fail_silently=False,
)
前提是在配置文件中配置了相关选项,我的settings.py文件中定义配置如下,django中,如果未指定EMAIL_BACKEND,则默认为SMTP 后端:
# 邮件
# EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = "smtp.qq.com"
EMAIL_PORT = 465
EMAIL_USE_TLS = False # 是否使用TLS安全传输协议
EMAIL_HOST_USER = 'my@qq.com'
EMAIL_USE_SSL = True # 是否使用SSL加密,qq企业邮箱要求使用
EMAIL_HOST_PASSWORD = "********"
需要注意EMAIL_HOST_PASSWORD并非自己的邮箱密码,而是自己邮箱账户的授权码,以qq邮箱为例,账户下方有一个POP3/IMAP/SMTP...服务,选择开启,并生成授权码,填上去就可以测试邮件发送功能了。
当然,在生产环境中,这些参数都不可能写成定值,我们可以在前台自己建立一个form标签用于收集用户的信息,例如:
# example.html
<form action="{% url 'contact' %}" method="post">
<table>
{% csrf_token %}
<p>Sub: <input type="text" name="Sub" /></p>
<p>message: <input type="text" name="message" /></p>
<p>your_name: <input type="text" name="your_name" /></p>
<p>your_email: <input type="text" name="your_email" /></p>
<input type="submit" value="Submit" />
</table>
</form>
这种写法略微有点low,因为无法验证用户的输入,可以尝试使用django的表单(或者模型表单)来解决。
#新建forms.py
from django import forms
class MailContentForm(forms.Form):
subject = forms.CharField(max_length=128,min_length=3)
message = forms.CharField(max_length=1024,label="info")
your_name = forms.CharField(max_length=128,min_length=3)
your_email = forms.EmailField()
# views.py 导入表单
from django.core.mail import BadHeaderError, send_mail
from django.conf import settings
from .forms import MailContentForm
class ContactUs(View):
def get(self, request):
my_form = MailContentForm()
return render(request, "test.html", context={"my_form":my_form})
def post(self, request):
forms = MailContentForm(request.POST)
from_email = settings.EMAIL_HOST_USER
if forms.is_valid():
subject = forms.cleaned_data.get('subject', '')
mess = forms.cleaned_data.get('message', '')
your_name = forms.cleaned_data.get('your_name', '')
your_email = forms.cleaned_data.get('your_email', '')
message = your_name+"\n" + your_email +"\n" + mess
if subject and message and from_email:
try:
send_mail(subject, message, from_email, ['my@163.com'])
except BadHeaderError:
return HttpResponse('Invalid header found.')
else:
print(forms.errors.get_json_data())
return HttpResponse("success")
在前端,只需要几行代码,就可以验证用户的输入,可以看见,我在表单中定义了该字段的长度,所以前端页面中就开始验证了,而不用去请求一次服务器(这也降低了服务器的负载)才知道是否符合条件。
#test.html
<table>
{% csrf_token %}
{{my_form.as_table}}
<tr>
<td></td>
<td><input type="submit" value="Submit" /></td>
</tr>
</table>
可能这种方式,你会觉得无法定义自己的表单样式,django中也有办法解决,可以参考第二篇文章,例如,我们可以通过label_tag读取表单中的label名称(如果未定义label则默认为属性名),可以通过my_form.subject的形式使用表单的验证器
<span>{{my_form.subject.label_tag}}</span>
<span>{{my_form.subject}}</span>
如上就可以自定义表单样式了。
由于只需要搭建一个邮件功能,初步了解就到这里吧。
参考:
# 发送邮件
https://docs.djangoproject.com/zh-hans/3.1/topics/email/
# 使用表单
https://www.liujiangblog.com/course/django/152