django 邮件发送模块smtp使用详解

作者:NAVYSUMMER 时间:2021-09-24 23:04:15 

前言

在Python中已经内置了一个smtp邮件发送模块,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,
)

导入功能模块,然后发送邮件,so easy!

默认情况下,使用配置文件中的EMAIL_HOST和EMAIL_PORT设置SMTP服务器主机和端口,EMAIL_HOST_USER和EMAIL_HOST_PASSWORD是用户名和密码。如果设置了EMAIL_USE_TLS和EMAIL_USE_SSL,它们将控制是否使用相应的加密链接。

二、单发 send_mail()

方法原型:send_mail(subject, message, from_email, recipient_list, fail_silently=False, auth_user=None, auth_password=None, connection=None, html_message=None)[source]

让我们来了解一下send_mail()方法,它接收一系列参数,其中的subject、message、from_email和recipient_list参数是必须的,其它的可选。

  • subject:邮件主题。字符串。

  • message:邮件具体内容。字符串。

  • from_email:邮件发送者。字符串。

  • recipient_list:收件人。一个由邮箱地址组成的字符串列表。recipient_list中的每一个成员都会在邮件信息的“To:”区域看到其它成员。

  • fail_silently: 一个布尔值。如果它是False,send_mail发送失败时,将会引发一个smtplib.SMTPException异常。

  • auth_user: 可选的用户名用来验证SMTP服务器,如果你要特别指定使用哪个邮箱帐号,就指定这个参数。如果没有提供这个值,Django将会使用settings中EMAIL_HOST_USER的值。如果两者都不提供,那你还发什么???

  • auth_password: 可选的密码用来验证SMTP服务器。如果没有提供这个值,Django 将会使用settings中EMAIL_HOST_PASSWORD的值。和上面那个参数是一家的。

  • connection: 可选的用来发送邮件的电子邮件后端。

  • html_message: 如果提供了html_message,可以发送带HTML代码的邮件。

send_mail()方法返回值将是成功发送出去的邮件数量(只会是0或1,因为它只能发送一封邮件)。

三、群发 send_mass_mail()

方法原型:send_mass_mail(datatuple,fail_silently = False,auth_user = None,auth_password = None ,connection = None)[source]

send_mass_mail()用来处理大批量邮件任务,也就是所谓的群发。

它的参数中,datatuple是必需参数,接收一个元组,元组的每个元素的格式如下:

(subject, message, from_email, recipient_list)
上面四个字段的意义与send_mail()中的相同。

例如,以下代码将向两组不同的收件人发送两个不同的消息;但是,只能打开一个到邮件服务器的连接:


message1 = ('Subject here', 'Here is the message', 'from@example.com', ['first@example.com', 'other@example.com'])

message2 = ('Another Subject', 'Here is another message', 'from@example.com', ['second@test.com'])

send_mass_mail((message1, message2), fail_silently=False)

send_mass_mail()方法的返回值是成功发送的邮件数量。

使用send_mail()方法时,每调用一次,它会和SMTP服务器建立一次连接,也就是发一次连一次,效率很低。而send_mass_mail(),则只建立一次链接,就将所有的邮件都发送出去,效率比较高。

四、防止头部注入攻击

有时候,我们要根据用户表单的输入来构造电子邮件,这就存在头部注入攻击的风险,Django给我们提供了一定的防范能力,但是更多时候,还需要你自己编写安全防范代码。

下面是一个例子,接收用户输入的主题、邮件内容和发送方,将邮件发送到系统管理员:


from django.core.mail import send_mail, BadHeaderError
from django.http import HttpResponse, HttpResponseRedirect

def send_email(request):
 subject = request.POST.get('subject', '')
 message = request.POST.get('message', '')
 from_email = request.POST.get('from_email', '')
 if subject and message and from_email:
   try:
     send_mail(subject, message, from_email, ['admin@example.com'])
   except BadHeaderError:
     return HttpResponse('Invalid header found.')
   return HttpResponseRedirect('/contact/thanks/')
 else:
   # In reality we'd use a form class
   # to get proper validation errors.
   return HttpResponse('Make sure all fields are entered and valid.')

如果检查到用户的输入带有头部注入攻击的可能性,会弹出BadHeaderError异常。

五、发送多媒体邮件

默认情况下,发送的邮件都是纯文本格式的。但有时候我们希望能在邮件里带一些超级链接、图片,甚至视频和JS动作。

Django为我们提供了一个EmailMultiAlternatives类,可以同时发送文本和HTML内容,下面是个范例,我们照着写就行:


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()

需要提醒的是,接收方的邮件服务商不一定支持多媒体邮件,也许是为了安全,也许是别的原因。为了保证你的邮件内容能被阅读,请务必同时发送纯文本邮件。

来源:https://www.cnblogs.com/navysummer/p/10200284.html

标签:django,邮件,模块,smtp
0
投稿

猜你喜欢

  • MYSQL导入导出sql文件简析

    2024-01-20 15:07:15
  • CSS定位属性Position详解

    2009-09-16 20:37:00
  • Pandas 中的join函数应用实现删除多余的空行

    2023-08-21 01:00:38
  • PHP实现将浏览历史页面网址保存到cookie的方法

    2023-08-16 05:25:29
  • 让sql2005运行在独立用户下出现 WMI 提供程序错误的解决方式

    2024-01-13 13:12:50
  • Python3监控疫情的完整代码

    2023-09-24 09:53:19
  • Python给定一个句子倒序输出单词以及字母的方法

    2022-11-21 00:36:50
  • Apache2.4.x版wampserver本地php服务器如何让外网访问及启用.htaccess

    2023-11-04 09:27:00
  • Pickle模块中的dump()和load()方法简介

    2023-03-21 04:18:06
  • vue awesome swiper异步加载数据出现的bug问题

    2024-05-03 15:10:58
  • 比较详细的完美解决安装sql2000时出现以前的某个程序安装已在安装计算机上创建挂起的文件操作。 <font color=red>原创</font>

    2024-01-27 03:48:54
  • SQL Server开发过程中的的常见问题总结

    2009-01-06 11:16:00
  • 《写给大家看的设计书》阅读笔记之对齐原则

    2009-07-09 16:32:00
  • python3+selenium4实现切换窗口与iframe的方法

    2022-08-08 16:34:16
  • python中WSGI是什么,Python应用WSGI详解

    2021-04-08 06:07:45
  • 将Django项目迁移到linux系统的详细步骤

    2021-02-11 02:13:09
  • 利用 PyCharm 实现本地代码和远端的实时同步功能

    2022-03-05 08:54:10
  • 新版php study根目录下文件夹无法显示的图文解决方法

    2023-11-15 00:44:29
  • 在 Python 中进行 One-Hot 编码

    2023-04-06 06:02:55
  • 谈PHP生成静态页面分析 模板+缓存+写文件

    2023-11-14 12:44:39
  • asp之家 网络编程 m.aspxhome.com