侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

python实现邮件发送功能

Python  /  管理员 发布于 7年前   146

什么是POP3、SMTP和MAP?

POP3是Post Office Protocol 3的简称,即邮局协议的第三个版本,他是规定怎样将个人计算机连接到Internet的邮件服务器和下载电子邮件的协议。它是因特网电子邮件的第一个离线协议的标准。POP3允许用户从服务器上把邮件存储到本地计算机上,同时删除保存在邮件服务器上的邮件,而POP3服务器则是遵循POP3协议的接受邮件服务器,用来接受电子邮件。

SMTP的全称是Simple Mail Transfer Protocol,即简单的邮件传输协议。它是一组用于从源地址到目的地的地址传输邮件的规范,通过它控制邮件的中转方式。SMTP协议属于TCP/IP协议簇,它帮助每台计算机在发送或者中转信件时找到下个目的地。SMTP服务器就是遵循SMTP协议的发送邮件服务器。

SMTP认证,简单来说就是要求必须在提供了账户名和密码之后才能登陆SMTP服务器。

IMAP全称是Iternet Mail Access Protocol,即交互式邮件存取协议,它是跟POP3类似的邮件访问标准协议之一。不同的是,开启了IMAP后,你在电子邮件客户端收取的邮件仍然保存在服务器上,同时在客户端上的操作都会反馈到服务器上,如:删除邮件、标记邮件等,服务器上的邮件也会做相应的动作。无论从浏览器登陆还是客户端登陆邮箱看到的邮件以及状态都是一致的。

我们使用网易的163邮箱来发送邮件,所以我们需要先将163邮箱的POP3/SMTP/IMAP都给打开。

具体步骤是:设置->POP3/SMTP/IMAP->设置POP3/SMTP/IMAP,点击复选框时邮箱会要求你设置授权码,设置授权码,然后一定要将授权码给记住,后面会用到。邮箱设置好后我们就开始编写代码发送邮件。

首先引入我们需要导入的库及包

import smtplibimport email# MIME 多邮件扩充协议from email.mime.text import MIMETextfrom email.mime.image import MIMEImagefrom email.mime.multipart import MIMEMultipart

然后设置邮箱的域名,端口,发送者邮箱,接收者邮箱

host = 'smtp.163.com' # 使用163邮箱port = '465' # 163邮箱服务器的端口号sender = '[email protected]' # 发送者的邮箱password = 'xxxxxx' # 授权码receiver = 'xxxxxx' # 接收者的邮箱,可以为其他类型的邮箱,如果是多个接收者请传入列表

接下来构建文本邮箱的主体

​body = 'xxx' # 你要发送的邮件的内容subject = 'xxx' # 你要发送的邮件的标题 # plain表示邮件内容的类型,文本类型默认是plain。utf-8表示内容的编码格式。message = MIMEText(body, 'plain', 'utf-8')message['From'] = sender # 发送者message['To'] = receiver # 接收者message['Subject'] = subject # 邮件标题

接下来我们获取SMTP协议的证书,登陆我们的邮箱发送邮件

# 获取SMTP协议证书email_clint = smtplib.SMTP_SSL(host, port)# 登陆邮箱,这里也是用授权码登陆邮箱的login_result = email_clint.login(sender, password)# 发送邮件email_clent.sendmail(from_addr=sender, to_addrs=receiver, msg=message.as_string())# 关闭邮件发送客户端email_client.close()

其实这里我们可以打印login_result,如果返回的状态码是235则证明邮件发送成功。

下面是发送文本邮件的全部代码。

import emailimport smtplibfrom email.mime.text import MIMETextfrom email.mime.image import MIMEImagefrom email.mime.multipart import MIMEMultipart class SendEmail(object): def __init__(self): self.host = 'smtp.163.com' self.port = '465' self.sender = '[email protected]' self.password = 'xxxxxx'  def send_email(self, receiver, subject='', body=''): message = MIMEText(body, 'plain', 'utf-8') message['From'] = self.sender message['To'] = receiver message['Subject'] = subject  try:  email_clint = smtplib.SMTP_SSL(self.host, self.port)  print('获取证书成功')  login_result = email_clint.login(self.sender, self.password)  print('开始登陆')  if login_result[0] == 235:  print('登陆成功')  email_clint.sendmail(self.sender, receiver, message.as_string())  print('邮件发送成功')  else:  print('登陆失败') except Exception as e:  print('发生错误', e)

下面介绍发送HTML格式内容的邮件以及向邮件内容中添加图片。

其实发送HTML格式内容的邮件很简单,只需将发送邮件的内容格式改为html就行了,像这样

message = MIMEText('<h2 style="color">学习使我快乐</h2>', 'html', 'utf-8')

还有使用内嵌的方法向邮件内容中加入文本或者图片

# related 表示使用内嵌资源的形式,将邮件发送给对方message = MIMEMultipart('related')

然后向邮件中添加内容,如果把图片嵌入到邮件正文中只需在HTML中通过引用src="https:/article/cid:x"即可。x代表图片的编号可以是数字也可是是字符串

# ---------------发送文本-----------------message_html = MIMEText('<h2 style="color:red;font-size:100px">学习使我快乐</h2><img src="https:/article/cid:small">','html','utf-8')# 将邮件内容 装入到邮件信息当中去message.attach(message_html)# ---------------发送图片-----------------# rb 读取二进制文件(图片是二进制文件)image_data = open('1.gif','rb')# 设置读取获取的二进制数据message_image = MIMEImage(image_data.read())# 关闭刚才打开的文件image_data.close()message_image.add_header('Content-ID','small')# 添加图片文件到邮件信息当中去message.attach(message_image)

然后构建邮件的主体,发送邮件即可

message['From'] = sender # 发送者message['To'] = receiver # 接收者message['Subject'] = subject # 邮件标题​email_clint = smtplib.SMTP_SSL(host, port)login_result = email_clint.login(sender, password)email_clent.sendmail(from_addr=sender, to_addrs=receiver, msg=message.as_string())email_client.close()

我们经常会向邮件中添加附件,下面介绍添加附件的方式

添加附件也是使用内嵌的方式添加的

# 对二进制文件需要设置默认的编码形式# 对于MIMEText()来说 默认的编码形式就是base64# 如果对于二进制文件来说 没有设置base64进行编码 则附件的就会呈现乱码# --------------------添加图片附件----------------------message_image = MIMEText(open('1.gif','rb').read(),'base64','utf-8')# 设置附件在邮件中的名字message_image['Content-disposition'] = 'attachment;filename="happy.gif"'message.attach(message_image) # --------------------添加xlsx表格附件---------------message_xlsx = MIMEText(open('table.xlsx','rb').read(),'base64','utf-8')# 设置附件在邮件当中的名字message_xlsx['Content-Disposition'] = 'attachment;filename="test.xlsx"'message.attach(message_xlsx)

然后发送邮件即可。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


  • 上一条:
    python requests库爬取豆瓣电视剧数据并保存到本地详解
    下一条:
    Python字典推导式将cookie字符串转化为字典解析
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • Laravel 11.15版本发布 - Eloquent Builder中添加的泛型(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客