November 25, 2017 12:53 PM
dajngo-电子邮件发送(发送邮件模块:dajngo.core.mail)
1.python中使用smtplib模块发送邮件
2.django中使用包装器发送邮件并支持smtp发送
设置相关(setting.py设置):
- EMAIL_HOST<指定smtp主机>
- EMAIL_PORT<指定stmp主机发送邮件端口>
- EMAIL_HOST_USER<指定邮箱用户名>
- EMAIL_HOST_PASSWORD<指定邮箱密码>
- EMAIL_USE_TLS<邮箱的安全设置>
- EMAIL_USE_SSL<邮箱的安全设置>
发送函数(view.py设置):
send_mail() 返回值是成功传递消息的数量;
send_mail(subject,message,from_email,recipient_list,fail_silently = False,auth_user = None,auth_password = None,connection = None,html_message = None)
参数说明
1. subject
2. message
3. from_email
4. recipient_list 必填-其他选项都有是可选项,这四项中前三项是字符串类型,第四项是字符串列表,
5. fail_silently:一个布尔值。如果是的话False,send_mail会提出一个smtplib.SMTPException。
6. auth_user: 可选用户名-用于登录smtp服务器:如果没有,django将使用EMAIL_HOST_USER设定的值。
7. auth_password: 可选密码-用于验证smtp服务器的可选密码:如果没有django将使用,EMAIL_HOST_PASSWORD设置的值。
8. connection:可选后端–用于选择发送邮件的后端选择;如果未指定使用默认后端:
9. html_message: 可选模板–用于发送文件的模板替代;
函数send_mass_mail()
参数和send_mail() 意义相同 ,但是send_mass_mail()效率更高,用于群发群发电子邮件,另外函数参数datatuple和send_mail中的recipient_listant参数相同,都是字符串列表
send_mass_mail(datatuple,fail_silently = False,auth_user = None,auth_password = None,connection = None)
函数mail_admins()
mail_admins(subject,message,fail_silently = False,connection = None,html_message = None)
- 模块位置:django.core.mail.mail_admin()
- 函数意义、作用:是一种发送电子邮件到站点管理员的快捷方式,在admins设置中是默认的。电子邮件的from 是server_email设置的值。
函数 mail_managers()
mail_managers(subject,message,fail_silently = False,connection = None,html_message = None)
- 函数位置:django.core.mail.mail_magagers()
- 特点:除了发送它发送邮件到管理员和要在MANAGERS中设置,其他的和mail_admins()
函数一样:
防止标题注入
EmailMessage
send_mail()和send_mass_mail() 是EmailMessage类的包装(子类)
Email Message()的类对象
属性 | 意义 |
---|---|
subject | 电子邮件主题 |
body | 正文 |
from_email | 发件人地址(如果未填写使用DEFAULT_FROM_EMAIL) |
to | 收件人地址列表元组 |
bcc | 发送邮件时“bcc”标题中使用的地址列表或元组 |
connection | 邮件电子后端实例(多个消息使用相同的链接需要设置)(如果省略在send中创建链接) |
attachmntes | 放置消息的附件列表。这些可以是email.MIMEBase.MIMEBase实例,也可以是三元组。(filename, content, mimetype) |
headers | 放置在消息上的额外标题的字典。键是标题名称,值是标题值。调用者需要确保标题名称和值的格式对于电子邮件来说是正确的。相应的属性是extra_headers。 |
cc | 发送电子邮件时在“抄送”标题中使用的收件人地址的列表或元组。 |
reply_to | 发送电子邮件时在“回复”标题中使用的收件人地址的列表或元组。 |
方法 | 意义 |
---|---|
send(fail_silently=False) | 发送消息。如果在构建电子邮件时指定了连接,则将使用该连接。否则,默认后端的一个实例将被实例化和使用。如果关键字参数fail_silently是True,发送消息时引发的异常将被撤销。一个空的收件人列表不会引发异常。 |
message() | 构造一个django.core.mail.SafeMIMEText对象(Python email.MIMEText.MIMEText类的子类)或一个django.core.mail.SafeMIMEMultipart持有该消息的 对象。如果您需要扩展 EmailMessage该类,您可能需要重写此方法以将所需的内容放入MIME对象。 |
recipients() | 返回消息的所有收件人列表,无论它们是记录在to,cc还是bcc属性中。这是您在子类化时可能需要重写的另一种方法,因为在发送邮件时,需要将SMTP服务器告知收件人的完整列表。如果添加另一种方法来指定类中的收件人,则也需要从此方法返回。 |
attach() | 创建一个新的文件附件并将其添加到消息中。有两种方法可以调用attach():你可以传递一个email.MIMEBase.MIMEBase实例的参数 。这将直接插入到结果消息中。 |
attach_file() | 使用文件系统中的文件创建一个新的附件。使用要附加的文件的路径进行调用,并可选择使用附件使用的MIME类型。如果省略MIME类型,则会从文件名中猜出。 |
发送电子邮件替代内容类型
发送电子邮件经典的版本:text和html格式
通过Email_message()中的attch_alterbnative()更改该方法模板类型:
默认情况下:使用的是“text/html” 格式
电子邮件的后台处理
电子邮件后端处理的方法
1. open( )实例化一个一个长期的电子邮件发送链接
2. close() 关闭当前电子的邮件发送链接。
3. send_messages(email_messages)发送一个EmailMessage对象列表。如果连接为未打开,则此调用讲隐士打开链接,然后关闭,如果邮件发送王弼将保持打开状态,
获得电子邮件后端的实例
get_connection()函数 django.core.mail 返回使用电子邮件后端的实例
get_connection(backend = None,fail_silently = False,* args,** kwargs)
1. 默认情况下,调用get_connection()将返回中指定的电子邮件后端实例EMAIL_BACKEND。如果指定了 backend参数,那么后端的一个实例将被实例化。
2. 该fail_silently参数控制后端如何处理错误。如果fail_silently为True,则在发送电子邮件过程中的例外情况将被忽略。
所有其他参数直接传递给电子邮件后端的构造函数。
3. Django附带有几个电子邮件发送后端。除了SMTP后端(这是默认的)之外,这些后端只在测试和开发过程中有用。如果您有特殊的电子邮件发送要求,您可以编写自己的电子邮件后端
stmp 后端
class backends.smtp.EmailBackend(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)
这是默认后端:
如果参数为None:每个参数的值从匹配设置中检索:
host: EMAIL_HOST
port: EMAIL_PORT
username: EMAIL_HOST_USER
password: EMAIL_HOST_PASSWORD
use_tls: EMAIL_USE_TLS
use_ssl: EMAIL_USE_SSL
timeout: EMAIL_TIMEOUT
ssl_keyfile: EMAIL_SSL_KEYFILE
ssl_certfile: EMAIL_SSL_CERTFILE
SMTP后端是由Django继承的默认配置。如果您想明确指定,请在您的设置中输入以下内容:
‘EMAIL_BACKEND = ‘django.core.mail.backends.smtp.EmailBackend’
如果未指定,则默认timeout为 socket.getdefaulttimeout()默认值None(不超时)
文件后端
文件后端将电子邮件写入文件。为在此后端打开的每个新会话创建一个新文件。写入文件的目录在创建连接时从EMAIL_FILE_PATH设置或file_path关键字中获取get_connection()。
内存后端
该’locmem’后端在一个特殊的属性,邮件存储 django.core.mail模块。该outbox属性是在发送第一个消息时创建的。这是一个包含EmailMessage每个将要发送的消息的实例的列表 。
要指定此后端,请在您的设置中添加以下内容:
‘EMAIL_BACKEND = ‘django.core.mail.backends.locmem.EmailBackend”
这个后端不适合在生产环境中使用 - 它是作为开发和测试过程中可以使用的便利而提供的。
虚拟后端
顾名思义,虚拟后端对你的消息没有任何作用。要指定此后端,请在您的设置中添加以下内容:
‘EMAIL_BACKEND = ‘django.core.mail.backends.dummy.EmailBackend”
这个后端不适合在生产环境中使用 - 它是作为开发过程中可以使用的便利而提供的。
定义一个自定义电子邮件后端
如果您需要更改电子邮件的发送方式,您可以编写自己的电子邮件后端。在EMAIL_BACKEND您的设置文件设置然后你的后台类Python的导入路径。
自定义电子邮件后端应BaseEmailBackend位于django.core.mail.backends.base模块中的子类。自定义电子邮件后端必须实现该send_messages(email_messages)方法。此方法接收EmailMessage实例列表并返回成功传递的消息数。如果你的后端有任何持久会话或连接的概念,你也应该实现open() 和close()方法。
发送多封邮件
建立和关闭SMTP连接(或任何其他网络连接)是一个昂贵的过程。如果要发送大量电子邮件,则重复使用SMTP连接是有意义的,而不是在每次发送电子邮件时创建和销毁连接。
有两种方法告诉电子邮件后端重新使用连接。
首先,您可以使用该send_messages()方法。send_messages()获取EmailMessage实例(或子类)的列表,并使用单个连接发送它们。
例如,如果您有一个调用的函数get_notification_email()返回EmailMessage表示要发送的定期电子邮件的对象列表,则可以使用一次调用send_messages来发送这些电子邮件:
第二种方法是使用open()和close()方法上的电子邮件后端手动控制的连接。send_messages()如果连接已经打开,则不会手动打开或关闭连接,因此如果手动打开连接,则可以控制连接何时关闭。
配置电子邮件进行开发
有时候你根本不想Django发送邮件。例如,在开发一个网站的时候,你可能不想发送数以千计的电子邮件 - 但是你可能想验证那些电子邮件将在正确的条件下被发送给正确的人,这些电子邮件将包含正确的内容。
为本地开发配置电子邮件的最简单方法是使用 控制台电子邮件后端。这个后端将所有邮件重定向到标准输出,允许你检查邮件的内容。
在开发过程中,文件电子邮件后端也很有用 - 这个后端将每个SMTP连接的内容转储到一个可以随时检查的文件。
另一种方法是使用“哑”的SMTP服务器,它在本地接收电子邮件并将其显示给终端,但实际上并不发送任何内容。Python有一个内置的方法来完成这一个单一的命令:
"python - m smtpd - n - c DebuggingServer localhost :1025"
这个命令将启动一个简单的SMTP服务器监听localhost的端口1025。这台服务器只是打印到标准输出所有电子邮件标题和电子邮件正文。你只需要设置EMAIL_HOST和 EMAIL_PORT相应的。有关SMTP服务器选项的更详细讨论,请参阅smtpd模块的Python文档。