前言

 

我们在Django中会碰到发送邮件的需求,Django中内置了邮件发送功能,被定义在​​django.core.mail​​模块中。发送邮件需要使用SMTP服务器,常用的免费服务器有:163、126、QQ,下面以163邮件为例。

思路

 

使用Django发送邮件就相当于,事先准备好一个可用的邮箱账户,并设置好​​POP3/SMTP/IMAP​​。然后去该邮箱获得授权码,Django在发邮件时通过授权码登录该邮箱,然后通过这个邮箱向指定的一个或多个账号发送邮件。

获取授权码

 

首先要有一个163邮箱的账号!然后登录进去选择设置 ▶ POP3/SMTP/IMAP

使用Django内置邮件功能发邮件:_服务器

然后,如下图,勾选IMAP/SMTP服务

使用Django内置邮件功能发邮件:_服务器_02

我们进入客户端授权码,选择开启

使用Django内置邮件功能发邮件:_服务器_03

然后,进入手机验证程序,我们获取验证码并输入,然后点击确认。

使用Django内置邮件功能发邮件:_服务器_04

使用Django内置邮件功能发邮件:_django_05

使用Django内置邮件功能发邮件:_发送邮件_06

请牢记你的授权码,它只会在页面中显示一次,不过,目前的策略是会给你绑定的手机号发这个授权码,如果忘了,就重新获取吧

授权码:990496256dd

发送简单邮件示例

 

这个示例可以应用于一封邮件发送给一个或多个收件人。但不能带附件。

settings配置

现在,我们进入Django的​​settings​​中设置:

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_USE_TLS = True # 是否使用TLS安全传输协议(用于在两个通信应用程序之间提供保密性和数据完整性。)
EMAIL_USE_SSL = False # 是否使用SSL加密,qq企业邮箱要求使用
EMAIL_HOST = 'smtp.163.com' # 发送邮件的邮箱 的 SMTP服务器,这里用了163邮箱
EMAIL_PORT = 25 # 发件箱的SMTP服务器端口
EMAIL_HOST_USER = 'tingyuweilou@163.com' # 发送邮件的邮箱地址
EMAIL_HOST_PASSWORD = 'xxxxxx' # 发送邮件的邮箱密码(这里使用的是授权码)
EMAIL_TO_USER_LIST = ['xxxx@foxmail.com', 'xxx@qq.com'] # 此字段是可选的,用来配置收件人列表

注意,​​EMAIL_USE_TLS​​​和​​EMAIL_USE_SSL​​​是互斥的,也就是说,不能同时为​​True​​。

views配置

from django.core.mail import send_mail
def send_email(request):
send_mail(
subject='这里是邮件标题',
message='这里是邮件内容',
from_email='tingyuweilou@163.com',
recipient_list=['1206180814@qq.com'],
fail_silently=False
)
return HttpResponse('OK')

​send_mail​​各参数如下:

  • subject,邮件标题
  • message,发送邮件内容
  • from_email,发件人
  • recipient_list,收件人,可以是多个
  • fail_silently,如果为​​False​​时,发送失败抛出错误

现在,有了上述这些关键代码之后,我们就可以向指定的邮箱发邮件了,如果收不到邮件,可有去看垃圾邮件中找找,可能被当成了垃圾邮件(我在qq邮箱中遇到这情况,解决办法是,点开这个邮件,点击我不是垃圾邮件,就好了)。

多封邮件发送多个收件人

 

有时候会遇到多封邮件同时发送多个人,怎么办呢?​​settings​​​配置不变,修改​​views​​中代码即可:

from django.core.mail import send_mail, send_mass_mail
def send_email(request):
message1 = ('邮件标题1', '内容1', 'tingyuweilou@163.com', ['1206180814@qq.com'])
message2 = ('邮件标题2', '内容2', 'tingyuweilou@163.com', ['1206180814@qq.com'])
send_mass_mail((message1, message2), fail_silently=False)
return HttpResponse('OK')

当发送多封邮件时,就要使用​​send_mass_mail​​了。上例中的列表内,也可以填写多个收件人。

这里简要说下​​send_mail​​​和​​send_mass_mail​​的区别:

​send_mail​​​每次发邮件都会建立一个连接,发多封邮件时建立多个连接。而 ​​send_mass_mail​​​ 是建立单个连接发送多封邮件,所以一次性发送多封邮件时 ​​send_mass_mail​​​ 要优于 ​​send_mail​​。

发送带附件的邮件

 

这里需要导入​​EmailMessage​​来完成。

from django.shortcuts import render, HttpResponse
from django.core.mail import EmailMessage
def send_email(request):
msg = EmailMessage(
subject='这是带附件的邮件标题',
body='这是带附件的邮件内容',
from_email='tingyuweilou@163.com', # 也可以从settings中获取
to=['1206180814@qq.com']
)
msg.attach_file('t2.xls')
msg.send(fail_silently=False)
return HttpResponse('OK')

上例中,​​attach_file​​使用当前文件系统下的某个文件做为附件。调用时,传入某个文件的完整路径,以及该附件的MIME类型(可选的)。 忽略MIME类型的话,Django会自动根据附件文件名来推测MIME类型。最简单的用法如下:

message.attach_file('/images/weather_map.png')

另外的,我们还可以使用​​attach​​​传递三个参数:​​filename​​​,​​content​​​ 和 ​​mimetype. filename​​​ 是出现在邮件中的附件文件的名称,​​content​​​ 是附件的内容,而 ​​mimetype​​​ 是附件所使用的MIME类型。 如果忽略 ​​mimetype​​​, Django会自动根据附件文件名来推测MIME内容类型。
例如:

message.attach('design.png', img_data, 'image/png')




前言

 

我们在Django中会碰到发送邮件的需求,Django中内置了邮件发送功能,被定义在​​django.core.mail​​模块中。发送邮件需要使用SMTP服务器,常用的免费服务器有:163、126、QQ,下面以163邮件为例。

思路

 

使用Django发送邮件就相当于,事先准备好一个可用的邮箱账户,并设置好​​POP3/SMTP/IMAP​​。然后去该邮箱获得授权码,Django在发邮件时通过授权码登录该邮箱,然后通过这个邮箱向指定的一个或多个账号发送邮件。

获取授权码

 

首先要有一个163邮箱的账号!然后登录进去选择设置 ▶ POP3/SMTP/IMAP

使用Django内置邮件功能发邮件:_服务器

然后,如下图,勾选IMAP/SMTP服务

使用Django内置邮件功能发邮件:_服务器_02

我们进入客户端授权码,选择开启

使用Django内置邮件功能发邮件:_服务器_03

然后,进入手机验证程序,我们获取验证码并输入,然后点击确认。

使用Django内置邮件功能发邮件:_服务器_04

使用Django内置邮件功能发邮件:_django_05

使用Django内置邮件功能发邮件:_发送邮件_06

请牢记你的授权码,它只会在页面中显示一次,不过,目前的策略是会给你绑定的手机号发这个授权码,如果忘了,就重新获取吧

授权码:990496256dd

发送简单邮件示例

 

这个示例可以应用于一封邮件发送给一个或多个收件人。但不能带附件。

settings配置

现在,我们进入Django的​​settings​​中设置:

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_USE_TLS = True # 是否使用TLS安全传输协议(用于在两个通信应用程序之间提供保密性和数据完整性。)
EMAIL_USE_SSL = False # 是否使用SSL加密,qq企业邮箱要求使用
EMAIL_HOST = 'smtp.163.com' # 发送邮件的邮箱 的 SMTP服务器,这里用了163邮箱
EMAIL_PORT = 25 # 发件箱的SMTP服务器端口
EMAIL_HOST_USER = 'tingyuweilou@163.com' # 发送邮件的邮箱地址
EMAIL_HOST_PASSWORD = 'xxxxxx' # 发送邮件的邮箱密码(这里使用的是授权码)
EMAIL_TO_USER_LIST = ['xxxx@foxmail.com', 'xxx@qq.com'] # 此字段是可选的,用来配置收件人列表

注意,​​EMAIL_USE_TLS​​​和​​EMAIL_USE_SSL​​​是互斥的,也就是说,不能同时为​​True​​。

views配置

from django.core.mail import send_mail
def send_email(request):
send_mail(
subject='这里是邮件标题',
message='这里是邮件内容',
from_email='tingyuweilou@163.com',
recipient_list=['1206180814@qq.com'],
fail_silently=False
)
return HttpResponse('OK')

​send_mail​​各参数如下:

  • subject,邮件标题
  • message,发送邮件内容
  • from_email,发件人
  • recipient_list,收件人,可以是多个
  • fail_silently,如果为​​False​​时,发送失败抛出错误

现在,有了上述这些关键代码之后,我们就可以向指定的邮箱发邮件了,如果收不到邮件,可有去看垃圾邮件中找找,可能被当成了垃圾邮件(我在qq邮箱中遇到这情况,解决办法是,点开这个邮件,点击我不是垃圾邮件,就好了)。

多封邮件发送多个收件人

 

有时候会遇到多封邮件同时发送多个人,怎么办呢?​​settings​​​配置不变,修改​​views​​中代码即可:

from django.core.mail import send_mail, send_mass_mail
def send_email(request):
message1 = ('邮件标题1', '内容1', 'tingyuweilou@163.com', ['1206180814@qq.com'])
message2 = ('邮件标题2', '内容2', 'tingyuweilou@163.com', ['1206180814@qq.com'])
send_mass_mail((message1, message2), fail_silently=False)
return HttpResponse('OK')

当发送多封邮件时,就要使用​​send_mass_mail​​了。上例中的列表内,也可以填写多个收件人。

这里简要说下​​send_mail​​​和​​send_mass_mail​​的区别:

​send_mail​​​每次发邮件都会建立一个连接,发多封邮件时建立多个连接。而 ​​send_mass_mail​​​ 是建立单个连接发送多封邮件,所以一次性发送多封邮件时 ​​send_mass_mail​​​ 要优于 ​​send_mail​​。

发送带附件的邮件

 

这里需要导入​​EmailMessage​​来完成。

from django.shortcuts import render, HttpResponse
from django.core.mail import EmailMessage
def send_email(request):
msg = EmailMessage(
subject='这是带附件的邮件标题',
body='这是带附件的邮件内容',
from_email='tingyuweilou@163.com', # 也可以从settings中获取
to=['1206180814@qq.com']
)
msg.attach_file('t2.xls')
msg.send(fail_silently=False)
return HttpResponse('OK')

上例中,​​attach_file​​使用当前文件系统下的某个文件做为附件。调用时,传入某个文件的完整路径,以及该附件的MIME类型(可选的)。 忽略MIME类型的话,Django会自动根据附件文件名来推测MIME类型。最简单的用法如下:

message.attach_file('/images/weather_map.png')

另外的,我们还可以使用​​attach​​​传递三个参数:​​filename​​​,​​content​​​ 和 ​​mimetype. filename​​​ 是出现在邮件中的附件文件的名称,​​content​​​ 是附件的内容,而 ​​mimetype​​​ 是附件所使用的MIME类型。 如果忽略 ​​mimetype​​​, Django会自动根据附件文件名来推测MIME内容类型。
例如:

message.attach('design.png', img_data, 'image/png')