python测试开发django(26)--发送邮件send_mail

前言

django发邮件的功能很简单,只需简单的配置即可,发邮件的代码里面已经封装好了,调用send_mail()函数就可以了

实现多个邮件发送可用用send_mass_mail()函数

send_mail()函数

先导入send_mail函数

from django.core.mail import send_mail  

进入源码里面看看具体函数对应的参数

subject, message, from_email, 和recipinet_list 这四个参数是必须的。

subject:字符串,邮件标题

message:字符串,邮件内容

from_email:字符串,发件邮箱

recipinet_list:list列表,列表中每个成员都有一个邮箱地址,而且每个收件人都会在"收件人/To:" 栏看到出现在recipient_list中的其他收件人。

faiy_silently:(可选)布尔值。为False时,send_mail会抛出smtplib.SMTPException异常。smtplib文档列出了所有可能的异常。这些异常都是SMTPException的子类。

auth_password:(可选)SMTP服务器的认证密码,没提供该参数的情况下,Django会使用EMAIL_HOST_PASSWORD配置项的设置。

connection:(可选)发送邮件的后端。没提供该参数的情况下,Django会使用默认后端的实例。

html_messages:(可选)send_mail方法独有,可以比较简单地实现一个html文本的传输。

def send_mail(subject, message, from_email, recipient_list,
              fail_silently=False, auth_user=None, auth_password=None,
              connection=None, html_message=None):
    """
    Easy wrapper for sending a single message to a recipient list. All members
    of the recipient list will see the other recipients in the 'To' field.

    If auth_user is None, use the EMAIL_HOST_USER setting.
    If auth_password is None, use the EMAIL_HOST_PASSWORD setting.

    Note: The API for this method is frozen. New code wanting to extend the
    functionality should use the EmailMessage class directly.
    """
    connection = connection or get_connection(
        username=auth_user,
        password=auth_password,
        fail_silently=fail_silently,
    )
    mail = EmailMultiAlternatives(subject, message, from_email, recipient_list, connection=connection)
    if html_message:
        mail.attach_alternative(html_message, 'text/html')

    return mail.send()

 settings.py配置

发送邮件之前先在setting.py配置文件里面配置相关的邮箱信息,比如我这里是用的QQ邮箱,使用SSL加密方式,需要授权登录(至于如何获取授权码,可以在QQ邮箱设置里面开启,发送短信“配置邮件客户端”到1069070069) 

EMAIL_BACKEND='django.core.mail.backends.smtp.EmailBackend'

EMAIL_USE_SSL=True      #SSL加密方式
EMAIL_HOST='smtp.qq.com'    #发送邮件的邮箱的SMTP服务器,
EMAIL_PORT=465  #SMTP服务器端口
EMAIL_HOST_USER='371933505@qq.com'  #发件人
EMAIL_HOST_PASSWORD='abcejkkljkl'  #密码(这里使用的是授权码)
EMAIL_FROM='hui<371933505@qq.com>'  #邮件显示的发件人

 如果是其它的企业邮箱,直接密码登录的话,使用TLS方式 

EMAIL_USE_SSL = True
EMAIL_HOST = 'smtp.xx.com'  # 如果是其它企业邮箱
EMAIL_PORT = 25
EMAIL_HOST_USER = 'xxx@xx.com' # 帐号
EMAIL_HOST_PASSWORD = '**********'  # 密码
EMAIL_FROM = 'yoyo<xx@xx.com>'   # 邮件显示的发件人

 EMAIL_USE_SSL和EMAIL_USE_TLS是互斥的,只能有一个为True。
 views.py里面写个视图函数,调用发送邮件的功能

#coding:utf-8

from django.http import HttpResponse
from django.core.mail import send_mail

def mail(request):
    send_mail('发工资了', #主题
              "今天是10号",  #正文
              '371933505@qq.com',  #发件人
              ['371933505@qq.com','155271040@163.com'], #收件人
              fail_silently=False)
    return HttpResponse('邮件发送成功,收不到就去垃圾桶中找!')

 urls.py写个访问地址触发发邮件

# coding:utf-8

from django.conf.urls import url
from tb import views

urlpatterns = [
    # 新增用户
    url(r'^register/', views.register),
    url(r'^login/', views.login),
    url('^chpwd/',views.reset_pwd),
    url('^sendmail',views.mail),
]

 浏览器上访问http://127.0.0.1:8000/sendmail后,就能收到邮件了。

 前面讲的send_mail()函数只能发送一个邮件,如果想实现发送多个邮件,可以用send_mass_mail()函数。

send_mass_mail函数

先导入

from django.core.mail import send_mass_mail

  查看对应的源码 

def send_mass_mail(datatuple, fail_silently=False, auth_user=None,
                   auth_password=None, connection=None):
    """
    Given a datatuple of (subject, message, from_email, recipient_list), send
  给定tuple数据类型(subject,message,from_email,recipient_list),发送每封邮件 each message to each recipient list. Return the number of emails sent.   到每个收件人列表。返回发送的电子邮件数量。 If from_email is None, use the DEFAULT_FROM_EMAIL setting.
  如果from_email为None,请使用DEFAULT_FROM_EMAIL设置 If auth_user and auth_password are set, use them to log in.
  如果设置了auth_user和auth_password,请使用他们登录 If auth_user is None, use the EMAIL_HOST_USER setting.
  如果auth_user为None,请使用EMAIL_HOST_USER设置。 If auth_password is None, use the EMAIL_HOST_PASSWORD setting.   如果auth_password为None,请使用EMAIL_HOST_PASSWORD设置。 Note: The API for this method is frozen. New code wanting to extend the functionality should use the EmailMessage class directly.
  注意:此方法的API已冻结。想要扩展的新代码功能应该直接使用EmailMessage类 """ connection = connection or get_connection( username=auth_user, password=auth_password, fail_silently=fail_silently, ) messages = [ EmailMessage(subject, message, sender, recipient, connection=connection) for subject, message, sender, recipient in datatuple ] return connection.send_messages(messages)

 从上面介绍可以看出,需传元组类型的数据,如果想实现更多的给你可以用EmailMessage类;

发送多个邮件

多个邮件的配置信息放到了一个元组里面,传给datatuple参数,代码实现如下;

#coding:utf-8

from django.http import HttpResponse
from django.core.mail import send_mass_mail
def mails(request):
    msg1=('别克跑',
          '20201212别克3km跑步',
          '371505@qq.com',
          ['155240@163.com'])
    msg2 = ('跨年跑',
            '20201231跨年5km跑步',
            '37505@qq.com',
            ['373505@qq.com'])
    send_mass_mail((msg1,msg2),fail_silently=False)
    return HttpResponse("邮件发送成功!")

  

原文地址:https://www.cnblogs.com/canglongdao/p/14113386.html