django 发送邮件

简介

虽然python提供了smtplib库,来完成email的发送功能,但是django对其进行了封装,使得发送邮件的接口变得更简单,更方便,django的封装位于django.core.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
)


邮件的发送通过django的setting文件中设置的 EMAIL_HOST


、 EMAIL_PORT


、 EMAIL_HOST_USER


、
EMAIL_HOST_PASSWORD



来认证SMTP服务器、 EMAIL_USE_TLS


用来说明发送的时候是否使用一个安全的连接
来进行, DEFAULT_CHARSET


用来指定发送邮件的字符集。

定义:



(1)

send_mail
(subject
, message
, from_email
, recipient_list
, 
          fail_silently=False
, auth_user=None
,auth_password=None
)
作用:发送一个邮件

subject:邮件的标题
message:邮件的内容
from_email:发送邮件者
recipient_list

:接受邮件者列表
fail_silently:可选参数,默认是False,如果是False,则发送失败时候,会抛出

smtplib.SMTPException异常

,具体详细的异常,
              请参考 smtplib docs
,这些异常都是SMTPException的子类。

auth_user

:可选的参数,如果有,那么认证SMTP Server时,使用该用户,否则使用EMAIL_HOST_USER


设置
auth_password:可选参数,如果有,那么认证SMTP 

Server时,使用该密码,否则使用EMAIL_HOST_PASSWORD



设置

(2)

send_mass_mail(datatuple
, fail_silently=False
, auth_user=None
, auth_password=None
)

datatuple

:是一个元组,其格式如下:
  (
subject
,
 message
,
 from_email
,
 recipient_list
)

作用:发送一组邮件
fail_silently

, auth_user

 and auth_password三个参数的意义同send_mail。

send_mass_mail和send_mail的区别

send_mail每次发送邮件都打开一个新的连接来发送。

send_mass_mail每次发送邮件时仅仅打开一个连接,将这次元组中的所有邮件发送出去。

所以send_mass_mail更有效率。

两个给管理员发送邮件的快捷方式

mail_admins(subject,message,fail_silently=False)

mail_managers(subject,message,fail_silently=False)

这两个方法在发送邮件时注意以下两点:

(1)邮件的标题前面django会自动加上EMAIL_SUBJECT_PREFIX中设置的前缀,缺省是"[Django]"。

(2)邮件的发送者将是由SERVER_EMAIL来设置

(3)邮件的接受者将是MANAGERS和ADMINS来设置

EmailMessage和SMTPConnection

上面提供的email函数,仅仅能够提供最基本的发送邮件的功能,其他的诸如:文件附件和多媒体email都需要EmailMessage类来提供。

EmailMessage构造函数的所有参数如下所示,所有参数都是可选的

subject:邮件的标题

body:邮件的正文,这个字段应该是纯文本文件

from_email:发送者的邮件地址,fred@example.com和Fred<fred@example.com>,这两种格式都是合法的,

如果该字段没有设置的话,将使用setting中的DEFAULT_FROM_EMAIL

to:所有接收人组成的一个元组

bcc:所有秘密抄送人组成的一个元组

connection:发送邮件是使用的SMTPConnection连接,如果不适用该字段,那么每次发送邮件时都会新建

一个SMTPConnection对象

attachments:附件列表,能是email.MIMEBase.MIMEBase实例,或者(filename,content,mimetype)元组

headers:邮件头字段,如果要增加额外的邮件头,请用该字段,关键字是key,值是value。

例如:
email
 =
 EmailMessage
(
'Hello'
,
 'Body goes here'
,
 'from@example.com'
,

            [
'to1@example.com'
,
 'to2@example.com'
],
 [
'bcc@example.com'
],

            headers
 =
 {
'Reply-To'
:
 'another@example.com'
})


该类有下列方法可用:
(1)send(fail_silently=False)  发送邮件,如果fail_silently=False时,出错将抛掷异常
(2)

message()   返回一个

django.core.mail.SafeMIMEText类型的对象或者

django.core.mail.SafeMIMEMultipart类型的对象。


(3)

recipients()

 获取发送人列表,包括to和bcc的所有发送人
(4)attach()    向邮件中增加附件,其参数可以是

email.MIMEBase.MIMEBase的实例,或者是

filename

, content

 and mimetype,
               其中filename是附件中呈现的文件名,content是附件的数据,

mimetype

是附件的MIME类型
               例如:message
.
attach
(
'design.png'
,
 img_data
,
 'image/png'
)

(5)attach_file()

 直接从文件系统中向邮件添加附件,如果mime类型没有填写,那么django会根据文件名推测出来。
               例如:message
.
attach_file
(
'/images/weather_map.png'
)


EmailMultiAlternatives




使用EmailMessage中发送邮件的内容,只能是一种类型的"text/html"或者
"text/plain"。但是实际应用中,
我们可能会一封邮件中既有text/html

的内容,又有text/plain的内容,这个时候可以使用EmailMultiAlternatives


类,他是EmailMessage

的子类,他有一个方法attach_alternative()

 ,可以让邮件中包括多种形式的内容
例如:
from
 django.core.mail
 import
 EmailMultiAlternatives


subject
,
 from_email
,
 to
 =
 'hello'
,
 'from@example.com'
,
 'to@example.com'

text_content
 =
 'This is an important message.'

html_content
 =
 '<p>This is an <strong>important</strong> message.</p>'

msg
 =
 EmailMultiAlternatives
(
subject
,
 text_content
,
 from_email
,
 [
to
])

msg
.
attach_alternative
(
html_content
,
 "text/html"
)

msg
.
send
()


EmailMessage

的类型修改


EmailMessage


的类型默认情况下是"text/plain",可以通过修改subtype属性,使得类型变成"text/html"
例如:
msg
 =
 EmailMessage
(
subject
,
 html_content
,
 from_email
,
 [
to
])

msg
.
content_subtype
 =
 "html"
  # Main content is now text/html

msg
.
send
()

SMTPConnection 对象

SMTPConnection初始化需要四个参数:连接SMTP服务器所需要的host, port, username and password,如果某个缺省了,那么就从setting文件中读取默认值,另外send_messages用来发送一个邮件列表

例如:

connection
 =
 SMTPConnection
()
   # Use default settings for connection

messages
 =
 get_notification_email
() #get_notification_email假设是用户定义的一个函数,用来获取所有想发出去的邮件

connection
.
send_messages
(
messages
)

相关推荐