- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章django中send_mail功能实现详解由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
前言 。
我们大家应该都知道python中smtplib模块用于邮件的功能,而django对这个这模块进行封装,使得它使用起来十分简单。 django.core.mail就是django邮件的核心模块。下面话不多说了,来随着小编来一起看看详细的介绍吧.
两个常用函数 。
它提供了两个函数,使用起来十分的简单:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
def
send_mail(subject, message, from_email, recipient_list,
fail_silently
=
False
, auth_user
=
None
, auth_password
=
None
,
connection
=
None
, html_message
=
None
):
pass
def
send_mass_mail(datatuple, fail_silently
=
False
, auth_user
=
None
,
auth_password
=
None
, connection
=
None
):
pass
# 参数介绍
# subject: 邮件主题
# message: 邮件内容
# from_email: 发件人
# recipient_list: 收件人,这是一个列表,可以有多个收件人
# 以上4个在参数 在send_mass_mail中,会写在datatuple这个元组中
# fail_silently: 是否报错,True的话表忽略异常
# auth_user&auth_password:账号密码
# connection: 表示这个的链接对象,后续会提到
# html_message: send_mail方法独有,可以比较简单地实现一个html文本的传输,具体我也没使用过,不是很了解。
|
一般情况下,我们需要在setting中进行配置,除了必须配置的host和port,一般我们也将账号密码写在这里,这样每次调用函数就不用传递这两个参数,当不传递这两个值,他们就会默认去读取setting中的值 。
返回值是成功发送了多个message,而不是多少个人,一般使用send_mail,都返回1 。
1
2
3
4
5
6
7
8
9
10
11
|
# settings.py
# 我使用的是新浪的,host可以在对应邮箱的设置中找到
EMAIL_HOST
=
'smtp.sina.com'
EMAIL_PORT
=
25
# 你的邮箱账号与密码
EMAIL_HOST_USER
=
'viptestfordjango@sina.com'
EMAIL_HOST_PASSWORD
=
'******'
# 由于使用25端口,一般都不使用TLS机密,SSL和TSL只需要设置一个,他们同时为True或False
EMAIL_USE_TLS
=
False
# 发件人,只有这个变量名可以自己自定义,设置在这里是为了减少每次去写
EMAIL_FROM
=
'viptestfordjango@sina.com'
|
实例 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
from
django.core.mail
import
send_mail, send_mass_mail
from
string
import
lowercase,uppercase,digits
from
random
import
randint
from
project.settings
import
EMAIL_FROM
def
send_code_email(email):
"""
发送验证码
"""
# 0-9 a-z A-z
code
=
''
seeds
=
lowercase
+
uppercase
+
digits
length
=
len
(seeds)
# 生成4位验证码
for
i
in
range
(
4
):
code
+
=
seeds[randint(
0
, length
-
1
)]
send_title
=
'重置密码'
send_message
=
'你的验证码是:{0}。'
.
format
(code)
send_status
=
send_mail(email_title, email_body, EMAIL_FROM, [email])
def
send_hello_email(email1, email2):
"""
给email1发送 新年好
给email2发送 Happy New Year
"""
# message格式(subject, message, from_email, recipient_list)
message1
=
(
'新年好'
,
'新年好'
,
'EMAIL_FROM'
, [email])
message2
=
(
'Happy New Year'
,
'Happy New Year'
, EMAIL_FROM, [email2])
send_status
=
send_mass_mail((message1, message2), fail_silently
=
False
)
|
很明显可以看出2个函数的不同,send_mail一次发送一个message(给多人),而send_mass_mail一次可以发送不同的message(给多人).
更深层的理解,前面提高一个参数connection,结合这个参数,其实每建立一个连接,send_mail只发送一种message,而send_mass_mail建立一个连接,可以发送多个message,这样子,效率明显高很多.
高级功能 。
前面2个函数其实是对EmailMessage这个类进行封装,使他们使用起来,相当的简单,但它们的功能是十分有限的,例如,无法抄送(cc)或者私密发送(bcc)以及无法加入附件(attachments) 。
如果要是用刚刚说的功能,就必须直接使用EmailMessage这个类.
EmailMessage 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
# 类定义
class
EmailMessage(
object
):
def
__init__(
self
, subject
=
'
', body='
', from_email
=
None
, to
=
None
, bcc
=
None
,
connection
=
None
, attachments
=
None
, headers
=
None
, cc
=
None
,
reply_to
=
None
):
pass
# 使用
from
django.core.mail
import
EmailMessage
email
=
EmailMessage(
'Hello'
,
'Body goes here'
,
'from@example.com'
,
[
'to1@example.com'
,
'to2@example.com'
],
[
'bcc@example.com'
],
reply_to
=
[
'another@example.com'
],
headers
=
{
'Message-ID'
:
'foo'
},
)
|
这个类参数中,抄送cc,私密发送bcc,回复reply_to都是一个列表.
值得一提的是attachments,它也是一个列表,它的元素始:MIMEBase对象或者(filename, content, mimetype)这个元组,即包括显示的文件名,文件数据,文件类型.
它还提供一些方法,主要提2个:send()发送邮件,以及attach()添加附件 。
直接使用Backend 。
如果我们像上面那样直接去调用EmailMessage.send() ,这样一次连接connection就只会发送一个message,那么如果我想发送多个message呢?
这个时候我们就有必要去了解backend了 。
其实django sending_email功能是由backend的控制的,这个类提供几个方法:
open() : 开个一个连接 。
close() : 关闭这个连接 。
send_messages(email_messages) : 接受一个EmailMessage对象的列表,然后将多个信息发送出去,而EmailMessage的send()方法就是调用这个方法,只是传递的参数是[self],就只有一个对象.
那么,其实如果我们能控制connection的开关,那么我们就能实现多个EmailMessage对象在email发送出去,这个时候,我们考虑通过上下文自动控制打开与关闭操作的方式
1
2
3
4
5
6
7
8
9
10
|
from
django.core
import
mail
with mail.get_connection() as connection:
mail.EmailMessage(
subject1, body1, from1, [to1],
connection
=
connection,
).send()
mail.EmailMessage(
subject2, body2, from2, [to2],
connection
=
connection,
).send()
|
这样的方法显得有点笨拙,我们肯定希望能够使用send_messages() ,直接传递一个EmailMessage对象的列表给它。我们注意到上面的代码get_connection()函数,其实它就是能够直接去获取到一个backend的对象,然后通过直接调用这个send_messages()方法.
1
2
3
4
5
|
from
django.core
import
mail
connection
=
mail.get_connection()
# get_EmailMessage_list返回一个EmailMessage对象的列表
messages
=
get_EmailMessage_list()
connection.send_messages(messages)
|
这个直接调用send_messages(messages) ,如果此时没有open链接的话,它会先打开连接,执行关自动关闭.
这样子好像还有点不灵活,那也可以亲自控制open与close.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
from
django.core
import
mail
connection
=
mail.get_connection()
connection.
open
()
email1
=
mail.EmailMessage(
'Hello'
,
'Body goes here'
,
'from@example.com'
,
[
'to1@example.com'
],
connection
=
connection,
)
email1.send()
email2
=
mail.EmailMessage(
'Hello'
,
'Body goes here'
,
'from@example.com'
,
[
'to2@example.com'
],
)
email3
=
mail.EmailMessage(
'Hello'
,
'Body goes here'
,
'from@example.com'
,
[
'to3@example.com'
],
)
connection.send_messages([email2, email3])
connection.close()
|
这个例子使用EmailMessage.send()与connection.send_messages()的使用,这个只是展示作用,并没用必要同时使用 。
backend类型与定制 。
说了那么多的backend,那它到底是什么,其实默认的它就是:backends.smtp.EmailBackend 。
1
2
3
4
5
6
|
# 在django.core.mail。backends.smtp.下
class
EmailBackend(BaseEmailBackend):
def
__init__(
self
, host
=
None
, port
=
None
, username
=
None
, password
=
None
,
use_tls
=
None
, fail_silently
=
False
, use_ssl
=
None
, timeout
=
None
,
ssl_keyfile
=
None
, ssl_certfile
=
None
,
*
*
kwargs):
pass
|
就是这个类,它继承BaseEmailBackend了,是默认的backend,控制了整个send mail的过程,当然django还提供了其他backend,不过作用不是很大.
Console backend: 将邮件直接写到你的stdout中.
Dummy backend: 没有实际作用.
你只需要在setting中指定你的backend
1
|
EMAIL_BACKEND
=
'django.core.mail.backends.dummy.EmailBackend'
|
当然,还可以自定义backend,你需要继承BaseEmailBackend,并且实现send_messages(email_messages),open,close方法,不过我感觉没有这个必要,毕竟smtp.EmailBackend提供了较为完善的功能了.
后言 。
本文内容基本来自django1.11官方文档,文字部分都是基于文档与自己的理解,可能会存在理解错误,欢迎各位的指出.
好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我的支持.
参考文章:
django1.11官方文档 email 。
原文链接:https://juejin.im/post/5a731e105188257a613206ed 。
最后此篇关于django中send_mail功能实现详解的文章就讲到这里了,如果你想了解更多关于django中send_mail功能实现详解的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
背景: 我最近一直在使用 JPA,我为相当大的关系数据库项目生成持久层的轻松程度给我留下了深刻的印象。 我们公司使用大量非 SQL 数据库,特别是面向列的数据库。我对可能对这些数据库使用 JPA 有一
我已经在我的 maven pom 中添加了这些构建配置,因为我希望将 Apache Solr 依赖项与 Jar 捆绑在一起。否则我得到了 SolarServerException: ClassNotF
interface ITurtle { void Fight(); void EatPizza(); } interface ILeonardo : ITurtle {
我希望可用于 Java 的对象/关系映射 (ORM) 工具之一能够满足这些要求: 使用 JPA 或 native SQL 查询获取大量行并将其作为实体对象返回。 允许在行(实体)中进行迭代,并在对当前
好像没有,因为我有实现From for 的代码, 我可以转换 A到 B与 .into() , 但同样的事情不适用于 Vec .into()一个Vec . 要么我搞砸了阻止实现派生的事情,要么这不应该发
在 C# 中,如果 A 实现 IX 并且 B 继承自 A ,是否必然遵循 B 实现 IX?如果是,是因为 LSP 吗?之间有什么区别吗: 1. Interface IX; Class A : IX;
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我正在阅读标准haskell库的(^)的实现代码: (^) :: (Num a, Integral b) => a -> b -> a x0 ^ y0 | y0 a -> b ->a expo x0
我将把国际象棋游戏表示为 C++ 结构。我认为,最好的选择是树结构(因为在每个深度我们都有几个可能的移动)。 这是一个好的方法吗? struct TreeElement{ SomeMoveType
我正在为用户名数据库实现字符串匹配算法。我的方法采用现有的用户名数据库和用户想要的新用户名,然后检查用户名是否已被占用。如果采用该方法,则该方法应该返回带有数据库中未采用的数字的用户名。 例子: “贾
我正在尝试实现 Breadth-first search algorithm , 为了找到两个顶点之间的最短距离。我开发了一个 Queue 对象来保存和检索对象,并且我有一个二维数组来保存两个给定顶点
我目前正在 ika 中开发我的 Python 游戏,它使用 python 2.5 我决定为 AI 使用 A* 寻路。然而,我发现它对我的需要来说太慢了(3-4 个敌人可能会落后于游戏,但我想供应 4-
我正在寻找 Kademlia 的开源实现C/C++ 中的分布式哈希表。它必须是轻量级和跨平台的(win/linux/mac)。 它必须能够将信息发布到 DHT 并检索它。 最佳答案 OpenDHT是
我在一本书中读到这一行:-“当我们要求 C++ 实现运行程序时,它会通过调用此函数来实现。” 而且我想知道“C++ 实现”是什么意思或具体是什么。帮忙!? 最佳答案 “C++ 实现”是指编译器加上链接
我正在尝试使用分支定界的 C++ 实现这个背包问题。此网站上有一个 Java 版本:Implementing branch and bound for knapsack 我试图让我的 C++ 版本打印
在很多情况下,我需要在 C# 中访问合适的哈希算法,从重写 GetHashCode 到对数据执行快速比较/查找。 我发现 FNV 哈希是一种非常简单/好/快速的哈希算法。但是,我从未见过 C# 实现的
目录 LRU缓存替换策略 核心思想 不适用场景 算法基本实现 算法优化
1. 绪论 在前面文章中提到 空间直角坐标系相互转换 ,测绘坐标转换时,一般涉及到的情况是:两个直角坐标系的小角度转换。这个就是我们经常在测绘数据处理中,WGS-84坐标系、54北京坐标系
在软件开发过程中,有时候我们需要定时地检查数据库中的数据,并在发现新增数据时触发一个动作。为了实现这个需求,我们在 .Net 7 下进行一次简单的演示. PeriodicTimer .
二分查找 二分查找算法,说白了就是在有序的数组里面给予一个存在数组里面的值key,然后将其先和数组中间的比较,如果key大于中间值,进行下一次mid后面的比较,直到找到相等的,就可以得到它的位置。
我是一名优秀的程序员,十分优秀!