协议

SMTP协议

SMTP的全称是“Simple Mail Transfer Protocol”,即简单邮件传输协议。它是一组用于从源地址到目的地址传输邮件的规范,通过它来控制邮件的中转方式。SMTP 协议属于TCP/IP协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。SMTP 服务器就是遵循SMTP协议的发送邮件服务器。SMTP认证,简单地说就是要求必须在提供了账户名和密码之后才可以登录 SMTP 服务器,这就使得那些垃圾邮件的散播者无可乘之机。增加 SMTP 认证的目的是为了使用户避免受到垃圾邮件的侵扰。

SMTP已是事实上的E-Mail传输的标准。

POP协议

POP邮局协议负责从邮件服务器中检索电子邮件。它要求邮件服务器完成下面几种任务之一:从邮件服务器中检索邮件并从服务器中删除这个邮件;从邮件服务器中检索邮件但不删除它;不检索邮件,只是询问是否有新邮件到达。POP协议支持多用户互联网邮件扩展,后者允许用户在电子邮件上附带二进制文件,如文字处理文件和电子表格文件等,实际上这样就可以传输任何格式的文件了,包括图片和声音文件等。在用户阅读邮件时,POP命令所有的邮件信息立即下载到用户的计算机上,不在服务器上保留。

POP3(Post Office Protocol 3)即邮局协议的第3个版本,是因特网电子邮件的第一个离线协议标准。

IMAP协议

互联网信息访问协议(IMAP)是一种优于POP的新协议。和POP一样,IMAP也能下载邮件、从服务器中删除邮件或询问是否有新邮件,但IMAP克服了POP的一些缺点。例如,它可以决定客户机请求邮件服务器提交所收到邮件的方式,请求邮件服务器只下载所选中的邮件而不是全部邮件。客户机可先阅读邮件信息的标题和发送者的名字再决定是否下载这个邮件。通过用户的客户机电子邮件程序,IMAP可让用户在服务器上创建并管理邮件文件夹或邮箱、删除邮件、查询某封信的一部分或全部内容,完成所有这些工作时都不需要把邮件从服务器下载到用户的个人计算机上。

支持种IMAP的常用邮件客户端有:ThunderMail,Foxmail,Microsoft Outlook等。

SMTP

SMTP是发送邮件的协议,Python内置对SMTP的支持,可以发送纯文本邮件、HTML邮件以及带附件的邮件。

Python对SMTP支持有smtplibemail两个模块,email负责构造邮件,smtplib负责发送邮件。

准备工作

获取邮箱服务器的授权码

QQ邮箱为例:

2.进入到账户页面

  1. 滚动到 “开启服务”,然后选择开启“ IMAP/SMTP服务

    4.按照提示进行设置后就会出现你所需要的授权码

发送邮件

python发邮件需要掌握两个模块的用法,smtplib和email,这俩模块是python自带的,只需import即可使用。smtplib模块主要负责发送邮件,email模块主要负责构造邮件。

smtplib模块主要负责发送邮件:是一个发送邮件的动作,连接邮箱服务器,登录邮箱,发送邮件(有发件人,收信人,邮件内容)。

email模块主要负责构造邮件:指的是邮箱页面显示的一些构造,如发件人,收件人,主题,正文,附件等。

smtplib模块

基本使用

import smtplibsmtp = smtplib.SMTP()
smtp.connect('smtp.163.com',25)
smtp.login(username, password)
smtp.sendmail(sender, receiver, msg.as_string())
smtp.quit()

说明:

smtplib.SMTP():实例化SMTP()

connect(host,port):

host:指定连接的邮箱服务器。常用邮箱的smtp服务器地址如下:

新浪邮箱:smtp.sina.com

新浪VIP:smtp.vip.sina.com

搜狐邮箱:smtp.sohu.com

126邮箱:smtp.126.com

139邮箱:smtp.139.com

QQ邮箱:smtp.qq.com

163网易邮箱:smtp.163.com

port:指定连接服务器的端口号,默认为25.(企业邮箱一般走465,994,更为安全)

login(user,password):

user:登录邮箱的用户名。

password:你刚才获取的授权码(不是登录密码)

sendmail(from_addr,to_addrs,msg,…):

from_addr:邮件发送者地址

to_addrs:邮件接收者地址。字符串列表[‘接收地址1’,‘接收地址2’,‘接收地址3’,…]或’接收地址’

msg:发送消息:邮件内容。一般是msg.as_string():as_string()是将msg(MIMEText对象或者MIMEMultipart对象)变为str。

quit():用于结束SMTP会话。

email模块

email模块下有mime包,mime英文全称为“Multipurpose Internet Mail Extensions”,即多用途互联网邮件扩展,是目前互联网电子邮件普遍遵循的邮件技术规范。

该mime包下常用的有三个模块:text,image,multpart

导入方法如下:

from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.image import MIMEImage

构造一个邮件对象就是一个Message对象,如果构造一个MIMEText对象,就表示一个文本邮件对象,如果构造一个MIMEImage对象,就表示一个作为附件的图片,要把多个对象组合起来,就用MIMEMultipart对象,而MIMEBase可以表示任何对象。它们的继承关系如下:

Message
+- MIMEBase+- MIMEMultipart+- MIMENonMultipart+- MIMEMessage+- MIMEText+- MIMEImage

2.1 text说明

邮件发送程序为了防止有些邮件阅读软件不能显示处理HTML格式的数据,通常都会用两类型分别为"text/plain"和"text/html"

构造MIMEText对象时,第一个参数是邮件正文,第二个参数是MIME的subtype,最后一定要用utf-8编码保证多语言兼容性。

2.1.1添加普通文本

text = "hello mail!"
text_plain = MIMEText(text,'plain', 'utf-8')

2.1.2添加超文本

html = """
<html>  <body>  <p> Here is the <a href="http://www.baidu.com">link</a> you wanted.</p> </body>
</html>
"""
text_html = MIMEText(html,'html', 'utf-8')

2.1.3添加附件

sendfile=open(r'D:\pythontest\1111.txt','rb').read()
text_att = MIMEText(sendfile, 'base64', 'utf-8')
text_att["Content-Type"] = 'application/octet-stream'
text_att["Content-Disposition"] = 'attachment; filename="显示的名字.txt"'

2.2 image说明

添加图片:

sendimagefile=open(r'D:\pythontest\testimage.png','rb').read()
image = MIMEImage(sendimagefile)
image.add_header('Content-ID','<image1>')

2.3 multpart说明

常见的multipart类型有三种:multipart/alternative, multipart/related和multipart/mixed。

邮件类型为"multipart/alternative"的邮件包括纯文本正文(text/plain)和超文本正文(text/html)。

邮件类型为"multipart/related"的邮件正文中包括图片,声音等内嵌资源。

邮件类型为"multipart/mixed"的邮件包含附件。向上兼容,如果一个邮件有纯文本正文,超文本正文,内嵌资源,附件,则选择mixed类型。

msg = MIMEMultipart('mixed')

我们必须把Subject,From,To,Date添加到MIMEText对象或者MIMEMultipart对象中,邮件中才会显示主题,发件人,收件人,时间(若无时间,就默认一般为当前时间,该值一般不设置)。

msg = MIMEMultipart('mixed')
msg['Subject'] = 'Python email test'
msg['From'] = 'XXX@163.com <XXX@163.com>'
msg['To'] = 'XXX@126.com'
msg['Date']='2012-3-16'

说明:

msg.add_header(_name,_value,**_params):添加邮件头字段。

msg.as_string():是将msg(MIMEText对象或者MIMEMultipart对象)变为str,如果只有一个html超文本正文或者plain普通文本正文的话,一般msg的类型可以是MIMEText;如果是多个的话,就都添加到MIMEMultipart,msg类型就变为MIMEMultipart。

msg.attach(MIMEText对象或MIMEImage对象):将MIMEText对象或MIMEImage对象添加到MIMEMultipart对象中。MIMEMultipart对象代表邮件本身,MIMEText对象或MIMEImage对象代表邮件正文。

以上的构造的文本,超文本,附件,图片都何以添加到MIMEMultipart(‘mixed’)中:

msg.attach(text_plain)
msg.attach(text_html)
msg.attach(text_att)
msg.attach(image)

实例代码:

import smtplib
from email.mime.application import MIMEApplication
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMETextfrom_mail = '发送邮箱'
to_mails = '接收邮箱,可以是个列表'
password = '你的授权码'# 普通纯文本和html邮件
def text_mail():# 消息主体content = '<h1>这是一个html邮件</h1>'# 配置邮件内容# 如果加上参数MIMEText(content,'html','utf-8')就可以指定是超文本标记语言# 默认的类型是'plain'msg = MIMEText(content)# 配置标题msg['Subject'] = '邮件标题'# 配置发送人msg['From'] = from_mail# 配置收件人的别名msg['To'] = '2001'# 创建SMTP服务器对象smt = smtplib.SMTP('smtp.qq.com')# 登录服务器smt.login(user=from_mail, password=password)# 发送邮件try:# 调用sendmail方法发送邮件# 第一个参数是发送人,必须跟登录账号相同# 第二个是收件人列表,也可以是一个单独的邮箱账号# msg.as_string():是将msg(MIMEText对象或者MIMEMultipart对象)变为str,# 如果只有一个html超文本正文或者plain普通文本正文的话,一般msg的类型可以是MIMEText;# 如果是多个的话,就都添加到MIMEMultipart,msg类型就变为MIMEMultipart。smt.sendmail(from_mail, to_mails, msg.as_string())print('邮件发送成功!')except Exception as erro_msg:print('发送失败', erro_msg)# 关闭邮件服务器smt.quit()# 带附件的邮件
def multipart_mail():"""带附件的邮件要用MIMEMultipart对象每一个附件就像一个个部件一样,需要单独构造最后将小部件都添加到MIMEMultipart中就像搭积木一样:return:None"""# 构建消息主体content = '这里是消息主体!'content_part = MIMEText(content)# 构建图片附件# MIMEImage(图片的二进制数据,图片名字)image = 'galaxy.jpg'image_part = MIMEImage(open(image, 'rb').read(), image.split('.')[-1])# 附件需要添加邮件头字段,指定文件类型和文件名# 不然接收方会看到纯二进制的数据# 第一个第二个参数固定写法,原理不详image_part.add_header('Content-Disposition', 'attachment', filename=image)# 构建文档或其他文件# MIME的类型有很多,可以针对图片,音频,视频等等# 如果不知道文件的类型,最简单的方式就是直接用MIMEApplicationmd = 'HTH项目开发文档.md'md_part = MIMEApplication(open(md, 'rb').read())md_part.add_header('Content-Disposition', 'attachment', filename=md)# 部件构建好了就创建MIMEMultipart对象,一个个添加m = MIMEMultipart()m.attach(content_part)m.attach(image_part)m.attach(md_part)# 跟文本邮件一样设置基本参数m['Subject'] = '我是标题'm['From'] = from_mailm['To'] = '2001'# 发送邮件跟文本邮件一样try:smt = smtplib.SMTP('smtp.qq.com')smt.login(from_mail, password)smt.sendmail(from_mail, to_mails, m.as_string())print('发送成功')except Exception as erro_msg:print('发送失败', erro_msg)def main():# 普通邮件# text_mail()# 带附件的邮件multipart_mail()if __name__ == '__main__':main()

推荐一个超简单的三方邮件库
yagmail

django发送邮件

配置

# 发送邮件设置
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
# SMTP地址
EMAIL_HOST = 'smtp.qq.com'
# SMTP端口
EMAIL_PORT = 465
# 自己的邮箱
EMAIL_HOST_USER = '2551628690@qq.com'
# 自己的邮箱授权码,非密码
EMAIL_HOST_PASSWORD = 'xxxxxxxxxx'
EMAIL_USE_SSL = True
# 与SMTP服务器通信时,是否启动TLS链接(安全链接)。默认是false

视图

from django.shortcuts import render, HttpResponse
from django.core.mail import send_mail# Create your views here.def send(request):send_mail(# 发送邮件的标题subject = '这是一个标题!',# 发送邮件的内容message = 'Here is the message.',# 发送者from_email = '2551628690@qq.com',# 接受者recipient_list = ['1838531437@qq.com', '442276457@qq.com'],# 发送失败是否返回错误信息fail_silently=False,)return HttpResponse('发送成功')

邮件注册登录或者激活

(1)在全局setting.py中设置

EMAIL_HOST = 'smtp.163.com' # 163邮箱的 SMTP 地址
EMAIL_PORT = 465
EMAIL_HOST_USER = '1502928xxxx@163.com' # 我自己的邮箱
EMAIL_HOST_PASSWORD = 'BETUYITZTTWJUKKG' # 邮箱授权嘛
EMAIL_USE_SSL = True #  与SMTP服务器通信时,是否启动TLS链接(安全链接)。默认是false

(2)新建一个发送邮件的试图函数view_helper.py

from django.core.mail import send_mail
from django.template import loaderdef sendEmail(name,email,token):subject = '红浪漫账户激活'  # 主题message = ''index = loader.get_template('axf/user/register/active.html')context = {'name': name,'url': 'http://47.107.87.249:8000/axfuser/account/?token='+str(token)}result = index.render(context=context)html_message = resultfrom_email = '15029281055@163.com'# 'yulin_ljing@163.com'# 接收者recipient_list = [email]send_mail(subject=subject,message=message,html_message=html_message,from_email=from_email,recipient_list=recipient_list)

(3)在template文件夹下新建mailtemplate.html文件(要发送的模板)

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>送给来自星星的你</title>
</head>
<body>
<h1>尊贵的{{ name }}VIP,你好:</h1>欢迎光临红浪漫,点击下面链接激活更多服务<br/>
&nbsp&nbsp&nbsp&nbsp<a href="{{ url }}">激活</a>如果链接失效,请访问下方链接<br/>&nbsp&nbsp&nbsp&nbsp{{ url }}</body>
</html>

(3)视图函数为

# 注册
def register(request):if request.method == 'GET':return render(request, 'axf/user/register/register.html')elif request.method == 'POST':# 注册# get方法中 应该写的页面中的name的属性值name = request.POST.get('name')password = request.POST.get('password')email = request.POST.get('email')icon = request.FILES.get('icon')# 密码加密# make_password()password = make_password(password)user = AxfUser()user.name = nameuser.password = passworduser.email = emailuser.icon = icontoken =uuid.uuid4() # 生成唯一的标识符user.token = tokenuser.save()cache.set('token',user.id,timeout = 60) # 将token写入缓存redis中并设置过期时间# 发送邮件sendEmail(name,email,token) # 调用发送邮件的函数return HttpResponse('注册成功')return render(request,'axf/user/register/register.html')

(3)点击邮件进行激活

def account(request):# 将当前注册的用户字段修改token = request.GET.get('token')user_id = cache.get(token) # 从缓存中获取tokenif user_id:user = AxfUser.objects.get(pk=user_id)user.active = Trueuser.save()# 删除缓存,激活成功即删除cache.delete(token)return HttpResponse('恭喜你激活成功')else:return HttpResponse('邮件已经过期')

这样就可以进行邮箱认证了,更详细的内容请参考https://blog.csdn.net/geek_xiong/article/details/90324013

python进行邮件发送以及django中利用邮件注册激活功能相关推荐

  1. python 邮箱验证_在Django中进行用户注册和邮箱验证的方法

    本文主要介绍我在利用Django写文章时,采用的注册方法.首先说一下整体逻辑思路: •处理用户注册数据, •产生token,生成验证URL, •发送验证邮件, •用户登录网址,进行验证, •验证处理. ...

  2. python的软件叫什么-django中的app是指什么

    Django中的app(application)就是应用的意思,当我们的项目足够大的时候,我们将功能单独分成多个app进行开发. Django中的app app(application)就是应用的意思 ...

  3. python打乱数据集_在Keras中利用np.random.shuffle()打乱数据集实例

    我就废话不多说了,大家还是直接看代码吧~ from numpy as np index=np.arange(2000) np.random.shuffle(index) print(index[0:2 ...

  4. python怎么打开h5文件_python中利用h5py模块读取h5文件中的主键方法

    如下所示: import h5py import numpy as np #HDF5的写入: imgData = np.zeros((2,4)) f = h5py.File('HDF5_FILE.h5 ...

  5. python 识别图片中的中文_Python中利用Tesseract软件来识别图片中的英文与中文

    OCR与Tesseract介绍 将图片翻译成文字一般被称为光学文字识别(Optical Character Recognition,OCR).可以实现OCR 的底层库并不多,目前很多库都是使用共同的几 ...

  6. python图片显示英文字符_Python中利用Tesseract软件来识别图片中的英文与中文

    OCR与Tesseract介绍 将图片翻译成文字一般被称为光学文字识别(Optical Character Recognition,OCR).可以实现OCR 的底层库并不多,目前很多库都是使用共同的几 ...

  7. python写邮箱系统_Python django实现简单的邮件系统发送邮件功能

    本文实例讲述了Python django实现简单的邮件系统发送邮件功能.分享给大家供大家参考,具体如下: django邮件系统 Django发送邮件官方中文文档 总结如下: 1.首先这份文档看三两遍是 ...

  8. java 邮件发送_Java 基于JavaMail的邮件发送

    http://blog.csdn.net/xietansheng/article/details/51673073 http://blog.csdn.net/xietansheng/article/d ...

  9. python 数列筛选_对numpy中的数组条件筛选功能详解

    在程序设计中,时常会遇到数据的唯一化.相同.相异信息的提取等工作,在格式化的向量存储矩阵中南,numpy能够提供比较不错的快速处理功能. 1,唯一化的实现: In [63]: data = np.ar ...

最新文章

  1. 报告 | 2019年全球数字化转型现状研究报告
  2. 89. Leetcode 96. 不同的二叉搜索树 (动态规划-基础题)
  3. 腾讯面试题 linux下free命令详解
  4. VS2008如何自动添加消息映射
  5. java 写文件 0x0d_Java 读写文件 - My and My Princess…… - OSCHINA - 中文开源技术交流社区...
  6. 使用GridView做出列选择效果(获取动态生成的控件.鼠标点选GridView.Ajax控件)
  7. C语言循环为1404的循环,考试,求大神帮忙,C语言,小弟感激不尽
  8. java分布式对象(RMI+部署使用RMI的程序)
  9. 【爱心代码大全】——情人节表白代码送给她属于我们程序员的浪漫
  10. “ == “运算符与equals()方法的区别
  11. kafka集群安装部署
  12. 索尼入局日本打车市场,联合6家出租车公司推AI打车软件
  13. 周期性行业是什么意思_什么样的股票适合长期持有?股票知识学习
  14. 一文精讲Wireshark的抓包和分析
  15. 2020年会必备,Excel轻松制作抽奖小游戏
  16. 《自控力》 第三章读书笔记
  17. ubuntu安装frps服务器与xtcp配置
  18. 沙尘暴天气空气净化器市场走俏
  19. 带你学C带你飞 | printf函数 | 变量 | 常量和宏定义 | 数据类型 | 取值范围 | 字符串 | 运算符
  20. Kettle连接 SAP Hana 数据库

热门文章

  1. 电容有什么作用?为什么cpu电源引脚都并联一个电容?
  2. 商家入驻天猫商城需要多少钱 天猫入住有哪些常见问题
  3. 《Python 黑科技》一键分析评论关键词,制作精美词云
  4. 谷歌地图获取点击时候的具体经纬度api
  5. Paintinglite迎来v2.1.2优化版本迭代,引入Pod安装
  6. 服务器和交换机物理连接_服务器与交换机连接及校园网搭建方案
  7. Excel在线常用工具
  8. 开源切片工具--TileStache
  9. Ruby 文件目录操作(实例讲解更易懂)
  10. SMP并行编程为什么这么难-从Linux自旋锁到图灵机