xiaogeldx 2011-09-07
虽然python提供了smtplib库,来完成email的发送功能,但是django对其进行了封装,使得发送邮件的接口变得更简单,更方便,django的封装位于django.core.mail
例子:
from django.core.mail import send_mail send_mail ( 'Subject here' , 'Here is the message.' , '[email protected]' , [ '[email protected]' ], 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_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构造函数的所有参数如下所示,所有参数都是可选的
subject:邮件的标题
body:邮件的正文,这个字段应该是纯文本文件
from_email:发送者的邮件地址,[email protected]和Fred<[email protected]>,这两种格式都是合法的,
如果该字段没有设置的话,将使用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' , '[email protected]' , [ '[email protected]' , '[email protected]' ], [ '[email protected]' ], headers = { 'Reply-To' : '[email protected]' }) 该类有下列方法可用: (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' , '[email protected]' , '[email protected]' 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 ()
例如:
connection = SMTPConnection () # Use default settings for connection messages = get_notification_email () #get_notification_email假设是用户定义的一个函数,用来获取所有想发出去的邮件 connection . send_messages ( messages )