YOLO813

Django搭建邮件功能

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