1. Django 发送邮件
一般在用户注册成功后,会发送一封电邮给对方注册邮箱。进一步还可能要去用户点击邮件中链接以进行注册确认。
1.1 发送纯文本邮件
Python 内置邮件发送模块 smtp,Django 对 smtp 模板进行了简单的封装。
- 首先在项目中配置 settings :
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' # 模块
EMAIL_HOST = 'smtp.sina.com' # 发送方 smtp 服务器地址,这里用的是新浪
EMAIL_PORT = 25 # 默认 smtp 端口
EMAIL_HOST_USER = 'xxx@sina.com' # 发送服务器用户名
EMAIL_HOST_PASSWORD = 'xxxxxxxxxxx' # 授权码
# QQ:smtp.qq.com (端口465或587) pop.qq.com 端口995
Tips
- 需要事先开启邮箱的 stmp 服务
- 有些邮件公司不开放 smtp 服务,有些需要 ssl 安全机制等
- 网易邮箱发送成功率高
- 在项目根目录下新建一个
send_mail.py
文件,然后写入下面的内容:
import os
from django.core.mail import send_mail
os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings'
if __name__ == '__main__':
# 纯文本邮件
send_mail(
'来自 127.0.0.1:8080 的测试邮件', # 主题 subject
'欢迎访问 127.0.0.1:8080,这里是。。。', # 邮件内容
'xxxxxx@163.com', # 发送方
['xxxx@qq.com'], # 接收方
)
运行 send_mail.py
文件,测试是否发送成功。
1.2. 发送 HTML 格式邮件
很多情况下我们在注册某个网站时,会发送一封邮件给我们的邮箱,这个邮件是超链接的格式发送的,确认后一般可以再定位到网站登录界面。
为了安全考虑,邮件服务提供商都会禁止使用 HTML 内容,但是对 http
和 https
开头的链接还是可以点击的。
下面我们在 Django 中实现发送带 HTML 格式的邮件:
import os
from django.core.mail import EmailMultiAlternatives
os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings'
if __name__ == '__main__':
subject, from_email, to = '来自127.0.0.1:8080的测试邮件', 'xxx@163.com', 'xxx@qq.com'
text_content = '欢迎访问 127.0.0.1:8080'
html_content = '<p>欢迎访问<a href="https://www.baidu.com" target=blank>www.baidu.com</a>,这里是xxx的博客网站</p>'
msg = EmailMultiAlternatives(subject, text_content, from_email, [to])
msg.attach_alternative(html_content, 'text/html')
msg.send()
正常情况会发送 html_content
中内容,如果发送无效将会发送 text_content
。
示例
下面是一个 HTML 邮件示例,可以单独新建一个文件,然后在视图中调用即可,也可以直接在视图中定义:
from django.core.mail import EmailMultiAlternatives
from django.conf import settings
def send_email(email, code):
subject = '来自127.0.0.1:8080的测试邮件'
text_content = '感谢注册 127.0.0.1:8080,这里是xxx的博客,如果你看到这条消息!' \
'说明你的邮箱服务器不支持 HTML 链接功能,请联系管理员!'
html_content = """
<p>感谢注册<a href='https://{}/confirm/?code={}' target=blank>www.baidu.com</a>
这里是xxx的博客
</p>
<p>请点击站点链接完成注册确认!</p>
<p>此链接有效期为{}天!</p>
""".format('127.0.0.1:8080', code, settings.CONFIRM_DAYS)
msg = EmailMultiAlternatives(subject, text_content, settings.EMAIL_HOST_USER, [email])
msg.attach_alternative(html_content, 'text/html')
msg.send()
from django.shortcuts import render
from django.conf import settings
def index(request):
code = 1234
email = request.POST.get('email')
# 发送邮件
send_mail.send_email(email, code)
return render(request, 'xxx/xxx.html')