当前位置: 首页 > news >正文

Smtplib之发邮件模块

目录

创建Smtp对象

Smtp类中的方法

MIME

MIMEBase

MIMEBase 

MIMEMultipart 

MIMEApplication 

MIMEAudio 

MIMEImage

MIMEText

实例

text+html格式

发送带图片附件的邮件

发送带附件的邮件

含多种格式


SMTP模块

SMTP 简单传输协议,它是一组用于由源地址 到 目的地址的 邮件传输规则;

python可以发送纯文本邮件(HTML邮件)、带附件的邮件、以及图片、音频的邮件等;

email模块:负责构建邮件;  smtplib模块:负责发送邮件


创建Smtp对象

import smtplibsmtpObj  = smtplib.SMTP( [host [, 25 [, local_hostname]]] )
# smtpObj = smtplib.SMTP_SSL( [host [, 994 [, local_hostname]]] )

参数说明:
host:  SMTP 服务器主机。 你可以指定主机的ip地址 或者 域名,如: runoob.com,这个是可选参数。

port:  如果你提供了host 参数, 你需要指定 SMTP 服务使用的端口号,一般情况下 SMTP 端口号为25。

local_hostname:  如果 SMTP 在你的本机上,你只需要指定服务器地址为 localhost 即可。 

###示例一: smtp = smtplib.SMTP()smtp.connect( [host [ , port]] )        # 连接远程smtp方法,host为远程主机地址,port为smtp端口,默认25;# 也可使用host:port形式来表示. 如:SMTP.connect("smtp.163.com","25")smtp.starttls()                         # 开启安全传输模式smtp.login("test@arcvideo.com","pwd")   # 邮箱账号登录校验smtp.sendmail(FROM, [ TO ], BODY)       # 邮件发送smtp.quit()                             # 断开smtp连接###示例二:
smtp = smtplib.SMTP( [host [ , port]] )smtp.login("test@arcvideo.com","pwd")   # 邮箱账号登录校验smtp.set_debuglevel(1)                  # 打印出和SMTP服务器交互的所有信息。smtp.sendmail(FROM, [TO], BODY)         # 邮件发送smtp.quit()                             # 断开smtp连接smtp中sendmail方法:SMTP.sendmail( from_addr, to_addrs, msg [, mail_options, rcpt_options] )  # from_addr: 发件人地址。to_addrs: 收件人地址(是字符串列表 形式)。msg: 发送消息的内容 【 msg.as_string()  】eg: smtp.sendmail( sender, receivers , msg.as_string() ) 注意:msg 是字符串,表示邮件。我们知道邮件一般由标题,发信人,收件人,邮件内容,附件等构成,发送邮件的时候,要注意msg 的格式。这个格式就是 smtp 协议中定义的格式。

Smtp类中的方法

MIME

通过邮件传输简单的文本已经无法满足我们的需求,比如我们时常会定制业务质量报表,在邮件主体中会包含 HTML、图像、声音以及附件格式等,MIME(Multipurpose Internet Mail 

Extensions,多用途互联网邮件扩展)作为一种新的扩展邮件格式很好地补充了这一点。

示例:msg.add_header('Content-ID','imgid')                                           # 设置图片ID【图片在正文中可用】msg.add_header('Content-Disposition','attachment',filename='test.xlsx')        # 为附件添加标题(没有这行,附件名称乱码)msg.add_header('Content-Disposition','attachment',filename=('utf-8','','中文标题'))   # 添加非ASCII字符时需指定编码
【图片本来在正文中,但是若加了上边2行之一,则正文中的图片 会跑到附件中。因为上边2行是专门为"附件" 服务的】eg:
msg_img.add_header('Content-ID', '<0>')msg_img.add_header('Content-Disposition', 'attachment', filename="a4.jpg")           
email.header.Header ( s=None , charset=None ):创建一个可以包含不同字符集中的字符串,并符合MIME的标头。
可选参数: s是初始标题值默认为None, 可以使用append()方法追加到标题,charset指定字符集
from email.header import Header
msg['From'] = Header( "测试邮件来自" , 'utf-8' )附加工具:email.utilsemail.utils.localtime(dt=None):返回当前时间,dt参数为datetime实例email.utils.formataddr(pair,charset='utf-8'):pair是一个元祖或列表,返回分割的标题与地址 如邮箱收件人昵称和邮箱账号示例:
from email.utils import formataddr
msg['From'] = formataddr( ['zhangsan' , 'wyh1942049307@163.com' ] )    
msg['To']   = formataddr( ['Anybody' , '92066@163.com'] )

MIMEBase

Message

+- MIMEBase

   +- MIMEMultipart

   +- MIMENonMultipart

      +- MIMEMessage

      +- MIMEText

      +- MIMEImage

如果只有一个html超文本正文 或者 plain普通文本正文的话,一般msg的类型可以是MIMEText;

如果是多个的话,就都添加到MIMEMultipart,msg类型就变为MIMEMultipart。

msg.attach ( MIMEText对象 或 MIMEImage对象 ):

将MIMEText对象或MIMEImage对象添加到MIMEMultipart对象中。

MIMEMultipart对象代表邮件本身,MIMEText对象或MIMEImage对象代表邮件正文。

以上的构造的文本,超文本,附件,图片都可以添加到MIMEMultipart('mixed')中

MIMEBase 

这是所有MIME特定类的基类

email.mime.base.MIMEBase (_maintype,_subtype,*,policy = compat32,** _ params) :

     _maintpe是Content-Type主要类型(text  or image)

     _subtype是Content-Type次要类型(plain or gif)

     _params是一个键值字典参数直接传递给Message.add_header

示例:
filename1 = '图片.pdf'
attachfile_base = MIMEBase('application', 'octet-stream')      # 创建基础对象指定类型
attachfile_base.set_payload (open(filename,'rb').read() )      # 设置我有效负载# 设置文件名可用中文【若没有下边add_header(), 则附件中图片不能正常显示】
attachfile_base.add_header('Content-Disposition', 'attachment', filename=('utf-8', '', filename1))   #为附件添加一个标题
attachfile_base.add_header('Content-Disposition', 'attachment', filename=filename1 .encode('UTF-8'))encoders.encode_base64(attachfile_base)
msg.attach(attachfile_base)                                     # 附加对象加入到msg

MIMEMultipart 

带多个部分邮件(与附件相关)

作用是生成包含多个部分邮件体的MIME对象

email.mime.multipart.MIMEMultipart( _subtype='mixed', boundary= None, _subparts = None, *, policy = compat32, ** _ params ):


_subtype 指定要添加到"Content-type:multipart/subtype" 报头的可选的三种子类型,分别为         mixed、related、alternative,默认值为 mixed。

       mixed  构建带附件的邮件;(向上兼容,如果一个邮件有纯文本正文,超文本正文,内嵌资源,附件,则选择mixed类型)           

       related 构建内嵌资源的邮件体;(内嵌图片、声音等资源)

       alternative 则实现构建纯文本(text/plain) 与 超文本(text/html) 共存的邮件体;

_subparts是有效负载的一系类初始部分,可以使用attach()方法将子部件附加到消息中。

示例:
from email.mime.multipart import MIMEMultipartmsg1 = MIMEMultipart('mixed') 等效于msg = MIMEMultipart( )  # 创建带附件的实例msg2 = MIMEMultipart('related')       # 创建内嵌资源的实例(如:在正文html中 内嵌图片)msg3 = MIMEMultipart('alternative')   # 创建纯文本与超文本实例# 创建一个带附件的实例msg = MIMEMultipart()     # 等价于 msg = MIMEMultipart('mixed') 默认值为mixted ,创建带附件的实例msg['Subject'] = subject  # MIMEMultitext() 与 MIMEMultipart() 时,均可以这样msg['From'] = sendermsg['To'] = receivers

MIMEApplication 

消息对象应用

被用来表示主要类型的MIME消息对象应用

email.mime.application.MIMEApplication( _data, _subtype='octet-stream', _encoder=email.encoders.encode_base64, *, policy=compat32, **_params ):

        _data是一个包含原始字节数据的字符串;

        _subtype指定MIME子类型默认为八位字节流;

        _encoder是一个可调用函数,它执行传输数据的实际编码,使用set_payload()将有效载荷改为编码形式,默认编码位base64,可使用email.encoders模块查看内置编码表。

示例:
filename = 'abc.pdf'with open(filename,'rb') as f:attachfile = MIMEApplication( f.read() )attachfile.add_header('Content-Disposition', 'attachment', filename=filename)msg.attach(attachfile)  # 附加对象加入到msg

MIMEAudio 

创建包含音频数据的邮件体

email.mime.audio.MIMEAudio ( _audiodata [, _subtype [, _encoder]] ):

      _audiodata 包含原始二进制音频数据的字节字符串;

      _subtype音频类型;

      _encoder编码。

示例:
from email.mime.audio import MIMEAudiomsgaudio = MIMEAudio( open('yishengsuoai.mp3','rb').read() , 'plain' )             # 文本音频对象,plain是默认。
msgaudio.add_header('Content-Disposition','attachment',filename='text.mp3') #扩展标题类型,文件名msg.attach(msgaudio)  

MIMEImage

MIMENonMultipart中的一个子类,创建包含图片数据的邮件体

email.mime.image.MIMEImage ( _imagedata [ , _subtype [ , _encoder [ , **_params]]] ):

       _imagedata 是包含原始图片数据的字节字符串;

       _sutype    指定图像子类型;

     _encoder   指定一个函数内部编码默认为:email.encoders.encode_base64默认为base64编码;

示例:
from email.mime.image import MIMEImage with open('test.png','rb') as fp:msgImage = MIMEImage( fp.read() ) msgImage.add_header('Content-ID','imgid')  # 为图片对象拓展标题字段和值msg.attach(msgImage)                       # 将图像负载添加到msg负载

MIMEText

文本  html格式邮件

MIMENonMultipart中的一个子类,创建包含文本数据的邮件体

email.mime.text.MIMEText ( _text [ , _subtype [ , _charset]] ):

      _text 要发送的文本字符串内容;

     _subtype 指定文本类型,支持 plain(默认值为txt格式) 或 html类型的字符串。发送HTML格式的时候,修改为html,但同时要求msg的内容也是html的格式;【注意:html格式的,就是放在MIMEText中的

_charset设置字符集,参数接收一个charset实例;

示例:
from email.mime.text import MIMEText# 创建文本内容的邮件体
msg = MIMEText( "python test email" , 'plain' , 'utf-8' )# 创建HTML格式的邮件体
msg = MIMEText( "<p>python test email</p><p><a href="http://www.demo.com">链接</a></p>" , 'html' , 'utf-8' )# 构造TEXT格式的消息
msg = MIMEText ("hello.text","plain","utf-8")msg["Subject"] = "xxxxx"  # 主题msg["From"] = "xxxx"      # 发送者msg["To"] = "xxxx"        # 接收者
msg["Cc"] = "xxxx"        # 抄送#注意:发送以上构造的邮件内容要使用as_string将构造的邮件内容转换为string形式。
msg.sendmail( "发件人","收件人" , msg.as_string )

实例

text+html格式

import smtplib
from email.mime.text import MIMEText
from email.header import Headersender = 'xxx@163.com'passwd = 'abcdefg'                                   receivers = '123456789@qq.com'  subject = 'python发邮Html格式测试'  content = "<html><h1>人生苦短,何必执着</h1></html>"msg = MIMEText(content, 'html', 'utf-8')msg['Subject'] = Header(subject , 'utf-8') # msg['Subject'] = subjectmsg['From'] = Header('hello', 'utf-8')     # msg['From'] = sender , 发件人为:hello#msg['From'] = '詹姆斯'                     # 可以固定写死(也可以为空)msg['To'] = Header('emmmm', 'utf-8')       # msg['To'] = receivers , 收件人为:emmmm   #msg['To'] = '湖人队'try:smtp = smtplib.SMTP('smtp.163.com', 25)smtp.login(sender, passwd)smtp.sendmail(sender, receivers, msg.as_string())print('发送成功')except:                                    # 或 except Exeception as e:print('发送失败')

发送带图片附件的邮件

import smtplib
from email.mime.image import MIMEImage
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipartsender = 'xxx@163.com'passwd = 'abcdefg'receivers = '123456789@qq.com'subject = 'python发邮带img的邮件测试'# 创建一个带附件的实例
msg = MIMEMultipart() # 等价于 msg = MIMEMultipart('mixed') 默认值为mixted ,创建带附件的实例msg['Subject'] = subjectmsg['From'] = sendermsg['To'] = receivers# 创建正文
msg.attach( MIMEText('使用python smtplib模块和email模块自动发送邮件测试', 'plain', 'utf-8') )# 创建图片附件
import osimg_file = open("/Users/benmu/Desktop/库里.jpg", 'rb').read()#img_file = open(os.getcwd()+"/a4.jpg",'rb').read() # 获取项目中的 a4.jpg图片
msg_img = MIMEImage(img_file)#没有下边2行,接收邮件端,的附件图片不能正常显示
msg_img.add_header('Content-Disposition', 'attachment', filename="a4.jpg")   #为附件添加标题(没有这行,附件名称乱码)msg_img.add_header('Content-ID', '<0>')msg.attach(msg_img)    # 附加对象加入到msgtry:s = smtplib.SMTP('smtp.163.com', 25)s.set_debuglevel(1)  # 输出发送邮件详细过程s.login(sender, passwd)s.sendmail(sender, receivers, msg.as_string())print('发送成功')except:print('发送失败')

发送带附件的邮件

模版(xlsx、csv、jpg、mp3)

下方替换的模版【各个部分一组合,就是发送多个附件】

###xlsx类型的附件【筛选、固定宽度、冻结首行;多sheet页这些; 原样发过去,格式、数据都不变】[也可发送zip文件]xlsx = MIMEApplication( open('/Users/benmu/Desktop/挂数200条.xlsx', 'rb' ).read() )      # 改为挂数200条.csv也可以xlsx.add_header('Content-Disposition', 'attachment', filename='挂数200条.xlsx')         # 为附件添加标题xlsx["Content-Type"] = 'application/octet-stream'mes.attach(xlsx)或# 读取xls文件作为附件,open()要带参数'rb',使文件变成二进制格式,从而使'base64'编码产生作用,否则附件打开乱码
att = MIMEText( open("/Users/benmu/Desktop/挂数200条.xlsx", 'rb' ).read(), 'base64', 'GB2312' )att.add_header('Content-Disposition','attachment',filename='挂数200条.xls')att['Content-Type'] = 'application/vnd.ms-excel'mes.attach(att)### jpg类型的附件
jpgpart = MIMEApplication( open('/Users/benmu/Desktop/库里.jpg', 'rb').read() )jpgpart.add_header('Content-Disposition', 'attachment', filename='库里.jpg')mes.attach( jpgpart )或fp = open('/Users/benmu/Desktop/库里.jpg', 'rb')msgImage = MIMEImage(fp.read())fp.close()msgImage.add_header('Content-Disposition', 'attachment', filename='库里.jpg')mes.attach(msgImage)### mp3类型的附件
mp3part = MIMEApplication(open('/Users/benmu/Desktop/大数据时代下数据可视化技术.m4a', 'rb').read())mp3part.add_header('Content-Disposition', 'attachment', filename='大数据时代下数据可视化技术.m4a')mes.attach(mp3part)

####带“多个”附件##### 构造附件1,传送当前目录下的 test.txt 文件
att_annex1 = MIMEText(open('/Users/benmu/Desktop/test.txt', 'rb').read(), 'base64', 'utf-8')att_annex1["Content-Type"] = 'application/octet-stream'att_annex1["Content-Disposition"] = 'attachment; filename="test.txt"'mes.attach(att_annex1)# 构造附件2,传送当前目录下的 test2.txt 文件
att_annex2 = MIMEText(open('/Users/benmu/Desktop/runoob.txt', 'rb').read(), 'base64', 'utf-8')att_annex2["Content-Type"] = 'application/octet-stream'att_annex2["Content-Disposition"] = 'attachment; filename="runoob.txt"'mes.attach(att_annex2)

含多种格式

import os
import smtplib
from email.mime.base import MIMEBase
from email.mime.multipart import MIMEMultipart
from email.header import Header
from email.mime.text import MIMEText
from email import encoders# 遍历桌面文件夹 中 文件
files ='/Users/benmu/Desktop/my_test'  # 附件中内容都在桌面的my_test文件夹中filenames = [os.path.join(files, f) for f in os.listdir(files) ]  #os.listdir()返回指定文件夹下的"所有文件和文件夹",保存到列表中sender = 'xxx@163.com'receivers = ['123456789@qq.com']passwd = 'abcdefg'subject = 'Python SMTP 邮件测试'content = MIMEText('测试发送数据:')mes = MIMEMultipart( )  # 创建带附件的实例mes.attach(content)     # 正文内容mes['From'] = Header("詹姆斯", 'utf-8')  # MIMEMultitext() 与 MIMEMultipart() 时,均可以这样mes['To'] = Header("湖人队", 'utf-8')mes['Subject'] = Header(subject, 'utf-8')for file in filenames:a = file.rfind('/')file_name = file[a+1:]       # 截取后获得文件名if file_name !='.DS_Store':  # 过滤掉以.DS_Store结尾的文件【不知哪来的】#print(file_name)        # 打印文件夹中 文件名【可去掉】part = MIMEBase('application', 'octet-stream') # 必须是使用MIMEBasepart.set_payload(open(file, 'rb').read())encoders.encode_base64(part)part.add_header('Content-Disposition', 'attachment', filename='%s' % file_name) mes.attach(part)try:smtp = smtplib.SMTP('smtp.163.com',25)smtp.login(sender, passwd)smtp.sendmail(sender, receivers, mes.as_string())print("邮件发送成功")except Exception as e:   # 或 except smtplib.SMTPException as e:print( '失败原因:' , str(e) )finally:smtp.quit()

结果:

相关文章:

Smtplib之发邮件模块

目录 创建Smtp对象 Smtp类中的方法 MIME MIMEBase MIMEBase MIMEMultipart MIMEApplication MIMEAudio MIMEImage MIMEText 实例 texthtml格式 发送带图片附件的邮件 发送带附件的邮件 含多种格式 SMTP模块 SMTP 简单传输协议&#xff0c;它是一组用于由源…...

Android 适配手机和平板

一、屏幕适配限定符Android 系统加载应用资源时 , 会根据当前运行应用的设备的相关属性 , 如 : 屏幕尺寸 / 屏幕像素密度 / 宽高比 / 屏幕方向 等属性 , 加载不同的屏幕适配限定符目录下的资源 ;如 : 横竖屏切换时 , res/layout-land 目录中 , 存放的是横屏布局 , res/layout-p…...

时序预测 | MATLAB实现LSTM-SVR(长短期记忆神经网络-支持向量机)时间序列预测

时序预测 | MATLAB实现LSTM-SVR(长短期记忆神经网络-支持向量机)时间序列预测 目录时序预测 | MATLAB实现LSTM-SVR(长短期记忆神经网络-支持向量机)时间序列预测效果一览基本介绍模型介绍LSTM模型SVR模型LSTM-SVR模型程序设计参考资料致谢效果一览 基本介绍 本次运行测试环境MA…...

分阶段构建golang运行环境Dockerfile镜像

在开始这项工作之前大家可以先去看一下docker官方给出关于空镜像scratch的说明&#xff0c;采用官方简单的一句话就是&#xff1a;scratch是一个明确的空图像&#xff0c;特别是对于“从头开始”构建图像。分阶段构建镜像就会用到scratch这个空镜像&#xff0c;这样的好处是可以…...

Vue-cli脚手架在做些什么(源码角度分析)

什么是Vue脚手架&#xff1f;在学习初期&#xff0c;我们的项目往往需要借助webpack、vite等打包工具配置Vue的开发环境&#xff0c;但是在真实开发中我们不可能每个项目从头来完成所有的webpack配置&#xff0c;这样显得开发的效率会大大的降低&#xff1b;所有的真实开发中&a…...

【Nginx】|入门连续剧——安装

作者&#xff1a;狮子也疯狂 专栏&#xff1a;《Nginx从入门到超神》 坚持做好每一步&#xff0c;幸运之神自然会降临在你的身上 目录一. &#x1f981; 前言Ⅰ. &#x1f407; 为啥我们要使用Nginx&#xff1f;二. &#x1f981; 搭建流程Ⅰ. &#x1f407; 环境准备Ⅱ. &…...

从0开始学python -38

Python3 面向对象-1 Python从设计之初就已经是一门面向对象的语言&#xff0c;正因为如此&#xff0c;在Python中创建一个类和对象是很容易的。本章节我们将详细介绍Python的面向对象编程。 如果你以前没有接触过面向对象的编程语言&#xff0c;那你可能需要先了解一些面向对…...

算法设计与分析期末考试复习(二)

分治法 将一个难以直接解决的大问题&#xff0c;分割成一些规模较小的相同问题&#xff0c;以便各个击破&#xff0c;分而治之。最好使子问题的规模大致相同。 分解&#xff08;Divide&#xff09;&#xff1a;将一个难以直接解决的大问题&#xff0c;分割成一些规模较小的子…...

九龙证券|4D毫米波雷达成市场新宠,相关概念股大涨,会贡献多少业绩?

近日&#xff0c;4D毫米波雷达成为A股新宠&#xff0c;相关概念股如经纬恒润&#xff08;688326.SH&#xff09;一周内涨幅接近20%&#xff0c;威孚高科&#xff08;000581.SZ&#xff09;5个买卖日内涨幅超越25%。 有音讯称特斯拉将在3月1日投资者活动日会宣告新款Model 3的全…...

Git天天用,不得不看的那些事

作为一个工作两年的开发同学&#xff0c;git是每天都要接触的工具。但IDEA对git的封装已经满足了日常的代码提交需求&#xff0c;所以一直是以点点点的形式进行代码提交与更新&#xff0c;几乎没用命令行提交过&#xff08;现在想来也是有些惭愧&#xff09;&#xff0c;对于gi…...

IDE 文档注释使用,模板注释,ide配置templates

文档注释基于javadoc模板 类注释 /*** 暂无介绍** author admin* version 1.0.0* <dt><span class"simpleTagLabel">时间:</span></dt>* <dd>2023/2/24</dd>*/方法注释 /*** 暂无描述** author admin* param args */javadoc相…...

力扣-查询近30天活跃用户数

大家好&#xff0c;我是空空star&#xff0c;本篇带大家了解一道简单的力扣sql练习题。 文章目录前言一、题目&#xff1a;1141. 查询近30天活跃用户数二、解题1.正确示范①提交SQL运行结果2.正确示范②提交SQL运行结果3.正确示范③提交SQL运行结果4.其他总结前言 一、题目&…...

企企通聚源池| 聚合海量资源全网寻源,赋能供采双方撮合交易

目前&#xff0c;我们正处于一个飞速发展的信息时代&#xff0c;随着大数据时代的来临&#xff0c;在企业的日常经营中&#xff0c;数据无处不在&#xff0c;各类数据的采集、整合、分析对企业的发展、决策有着十分重要的作用。数据管理作为企业一项重要的建设工作&#xff0c;…...

【算法数据结构体系篇class09】:链表问题:快慢指针、回文结构、复制、中点,分区、相交

一、链表解题的方法论 1)对于笔试&#xff0c;不用太在乎空间复杂度&#xff0c;一切为了时间复杂度2)对于面试&#xff0c;时间复杂度依然放在第一位&#xff0c;但是一定要找到空间最省的方法二、链表常用数据结构和技巧1&#xff09;使用容器(哈希表、数组等)2&#xff09;快…...

实验室信息化管理行业方案

为适应新时代下的管理机制与应用场景&#xff0c;越来越多的检测实验室需对研发部门和实验部门进行全面的、现代化的、电子化的综合管理&#xff0c;帮助检测机构对实验室的规划与计划、项目立项与管理、项目成果、合同&#xff0c;以及基建等工作进行统一的管理&#xff0c;而…...

docker学习

docker 环境搭建 MySql # mysql5.7 docker run --name mysql10 -p 3306:3306 -v D:\MySql\conf:/etc/mysql/conf.d -v D:\MySql\data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD123456 -d mysql:5.7docker run --name mysql10 -p 3306:3306 -v /etc/mysql/conf.d:/etc/mysql/co…...

Linux 常用命令

重启 # 重启&#xff08;root 用户操作&#xff09; reboot# 强制重启 reboot -f关机 # 关机 # shutdown [OPTION] [TIME] [MESSAGE] shutdown-h 关机 -r 重启-c 取消上一个命令 第二个参数指的是多少分钟后执行操作&#xff0c;以分钟为单位&#xff0c;如果不加时间&am…...

数据结构-顺序表(2)

目录 1. 线性表 2. 顺序表 2.1 动态顺序表 3. 接口实现 前期工作 3.1 初始化、销毁与检查容量 3.1.1 初始化 3.1.2 销毁 3.1.3 检查容量 3.2 尾插 3.3 尾删 3.4 头插 3.5 头删 3.6 插入 3.7 删除 顺序表源码 SeqList.h SeqList.c test.c 写在最后&#xff…...

初学C/C++内存管理--new和delete的使用

一&#xff0c;内存分布 栈区&#xff1a; 一般的局部变量和函数的返回数据以及返回地址&#xff0c;函数的参数都在战栈区上开辟空间。栈区开空间一般由编译器自动管理&#xff0c;出了生命周期自动释放。也可以通过一些方式自己手动开辟栈区空间&#xff0c;不过一般用不到…...

【Java】volatile

一、volatile volatile是Java虚拟机提供的轻量级的同步机制&#xff0c;它有&#xff13;个特性&#xff1a; &#xff11;&#xff09;保证可见性 &#xff12;&#xff09;不保证原子性 &#xff13;&#xff09;禁止指令重排 当写一个volatile变量时&#xff0c;JMM会把该…...

Python爬虫实战:研究MechanicalSoup库相关技术

一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

【kafka】Golang实现分布式Masscan任务调度系统

要求&#xff1a; 输出两个程序&#xff0c;一个命令行程序&#xff08;命令行参数用flag&#xff09;和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽&#xff0c;然后将消息推送到kafka里面。 服务端程序&#xff1a; 从kafka消费者接收…...

【磁盘】每天掌握一个Linux命令 - iostat

目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat&#xff08;I/O Statistics&#xff09;是Linux系统下用于监视系统输入输出设备和CPU使…...

在Ubuntu中设置开机自动运行(sudo)指令的指南

在Ubuntu系统中&#xff0c;有时需要在系统启动时自动执行某些命令&#xff0c;特别是需要 sudo权限的指令。为了实现这一功能&#xff0c;可以使用多种方法&#xff0c;包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法&#xff0c;并提供…...

【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)

要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况&#xff0c;可以通过以下几种方式模拟或触发&#xff1a; 1. 增加CPU负载 运行大量计算密集型任务&#xff0c;例如&#xff1a; 使用多线程循环执行复杂计算&#xff08;如数学运算、加密解密等&#xff09;。运行图…...

有限自动机到正规文法转换器v1.0

1 项目简介 这是一个功能强大的有限自动机&#xff08;Finite Automaton, FA&#xff09;到正规文法&#xff08;Regular Grammar&#xff09;转换器&#xff0c;它配备了一个直观且完整的图形用户界面&#xff0c;使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...

Yolov8 目标检测蒸馏学习记录

yolov8系列模型蒸馏基本流程&#xff0c;代码下载&#xff1a;这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中&#xff0c;**知识蒸馏&#xff08;Knowledge Distillation&#xff09;**被广泛应用&#xff0c;作为提升模型…...

GruntJS-前端自动化任务运行器从入门到实战

Grunt 完全指南&#xff1a;从入门到实战 一、Grunt 是什么&#xff1f; Grunt是一个基于 Node.js 的前端自动化任务运行器&#xff0c;主要用于自动化执行项目开发中重复性高的任务&#xff0c;例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...

RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)

RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发&#xff0c;后来由Pivotal Software Inc.&#xff08;现为VMware子公司&#xff09;接管。RabbitMQ 是一个开源的消息代理和队列服务器&#xff0c;用 Erlang 语言编写。广泛应用于各种分布…...

MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用

文章目录 一、背景知识&#xff1a;什么是 B-Tree 和 BTree&#xff1f; B-Tree&#xff08;平衡多路查找树&#xff09; BTree&#xff08;B-Tree 的变种&#xff09; 二、结构对比&#xff1a;一张图看懂 三、为什么 MySQL InnoDB 选择 BTree&#xff1f; 1. 范围查询更快 2…...