版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第2章7.完整的TCP客户端示例将上述步骤组合起来,得到了一个完整的TCP客户端示例:importsocket#创建TCP/IP套接字sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)#连接到服务器server_address=(localhost,10000)#替换为实际的主机名和端口号sock.connect(server_address)#连接服务器#在try块中,执行可能发生异常的操作try:#发送数据message='Thisisthemessage.Itwillberepeated.'print(f'Sending:{message}')sock.sendall(message.encode('utf-8'))#查找响应amount_received=0amount_expected=len(message)whileamount_received<amount_expected:data=sock.recv(16)amount_received+=len(data)print(f'Received:{data.decode("utf-8")}')#finally块中的代码无论是否发生异常都会执行finally:#关闭套接字sock.close()向服务端发送请求后,运行结果如下:Sending:Thisisthemessage.Itwillberepeated.Received:ThisisthemessReceived:age.ItwillbeReceived:repeated.2.3.3处理并发连接1.多线程服务器示例:importsocket#导入socket模块,用于创建和管理网络连接importthreading#导入threading模块,用于创建多线程#这是处理客户端连接的函数defhandle_client(connection,client_address):try:#无限循环,直到没有数据接收或连接中断whileTrue:data=connection.recv(1024)#接收客户端发送的数据,最大接收1024字节ifdata:connection.sendall(data)#如果接收到数据,原样返回给客户端else:break#如果没有数据,说明客户端可能断开连接,退出循环finally:connection.close()#在任何情况下,确保连接被关闭#创建一个TCP/IP套接字sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)#定义服务器地址和端口server_address=('localhost',10000)#服务器在本地主机的10000端口监听#将套接字绑定到指定的地址和端口sock.bind(server_address)#开始监听传入的连接,队列最大长度为1sock.listen(1)#无限循环以接受客户端连接whileTrue:#接受新的客户端连接connection,client_address=sock.accept()#当有客户端连接时,accept()会返回一个新的套接字和客户端地址#创建一个新的线程来处理这个客户端client_thread=threading.Thread(target=handle_client,args=(connection,client_address))#使用线程处理多个客户端client_thread.start()#启动新线程2.多进程服务器示例:importsocket#导入用于网络通信的socket模块importos#导入用于与操作系统交互的模块frommultiprocessingimportProcess#从多进程模块中导入Process类#处理客户端连接的函数defhandle_client(connection,client_address):try:#无限循环,直到没有数据或连接断开whileTrue:data=connection.recv(1024)#接收最多1024字节的数据ifdata:connection.sendall(data)#回显接收到的数据else:Break#如果没有数据,退出循环finally:connection.close()#在函数结束时关闭连接#创建TCP/IP套接字sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)#创建TCP套接字server_address=('localhost',10000)#服务器地址和端口sock.bind(server_address)#绑定地址和端口sock.listen(1)#开始监听传入的连接#主循环,处理客户端连接whileTrue:connection,client_address=sock.accept()#接受新的客户端连接#为每个新连接创建一个新的进程client_process=Process(target=handle_client,args=(connection,client_address))client_process.start()#启动新的进程#在主进程中关闭连接,因为这个连接已经被传递给子进程connection.close()3.I/O多路复用示例:importsocket#用于创建和管理网络套接字importselect#用于异步I/O监控importqueue#用于创建消息队列以存储客户端数据#创建TCP/IP套接字sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)#创建TCP套接字server_address=('localhost',10000)#定义服务器地址和端口sock.bind(server_address)#绑定地址和端口sock.listen(1)#开始监听传入连接sock.setblocking(0)#将套接字设置为非阻塞模式#用于select的输入和输出集合inputs=[sock]#监控输入事件的套接字列表,初始值包含服务器套接字outputs=[]#监控输出事件的套接字列表message_queues={}#存储客户端消息的队列,键是套接字whileinputs:#只要有套接字在输入列表中,就继续循环#使用select.select监控可读、可写和异常套接字readable,writable,exceptional=select.select(inputs,outputs,inputs)#处理可读套接字forsinreadable:ifsissock:#如果可读的是服务器套接字,表示有新的客户端连接connection,client_address=s.accept()#接受新的客户端连接connection.setblocking(0)#设置新连接为非阻塞模式inputs.append(connection)#将新连接加入inputsmessage_queues[connection]=queue.Queue()#为新连接创建消息队列else:#如果是客户端套接字,接收数据data=s.recv(1024)#接收最多1024字节的数据ifdata:#如果接收到数据message_queues[s].put(data)#将数据放入对应的消息队列ifsnotinoutputs:#如果套接字不在outputs中,添加进去outputs.append(s)else:#如果没有数据,表示客户端可能断开连接ifsinoutputs:#从outputs中移除outputs.remove(s)inputs.remove(s)#从inputs中移除s.close()#关闭套接字delmessage_queues[s]#删除对应的消息队列#处理可写套接字forsinwritable:try:#尝试从消息队列中获取下一条消息next_msg=message_queues[s].get_nowait()exceptqueue.Empty:#如果队列是空的outputs.remove(s)#将套接字从outputs中移除else:#如果成功获取消息s.send(next_msg)#发送消息给客户端#处理出现异常的套接字forsinexceptional:#如果套接字有异常inputs.remove(s)#从inputs中移除ifsinoutputs:#如果在outputs中outputs.remove(s)#也移除s.close()#关闭套接字delmessage_queues[s]#删除消息队列4.异步服务器importasyncio#异步I/O模块,用于异步操作和协程#处理客户端连接的异步函数asyncdefhandle_client(reader,writer):#从客户端读取数据,最多100字节data=awaitreader.read(100)#将数据解码为字符串message=data.decode()#获取客户端的地址信息addr=writer.get_extra_info('peername')print(f"Received{message}from{addr}")#打印接收到的信息print(f"Send:{message}")#打印即将发送的信息writer.write(data)#将数据写回客户端,实现回显awaitwriter.drain()#等待数据发送完毕print("Closetheconnection")#通知关闭连接writer.close()#关闭连接#主函数,创建并启动异步服务器asyncdefmain():#使用asyncio.start_server创建服务器server=awaitasyncio.start_server(handle_client,'localhost',10000)#监听localhost上的10000端口#获取服务器套接字的地址信息addr=server.sockets[0].getsockname()#获取服务器监听的地址和端口print(f'Servingon{addr}')#打印服务器的地址信息#确保服务器在异步上下文中保持活动状态asyncwithserver:#让服务器永久运行,处理传入的客户端连接awaitserver.serve_forever()#保持服务器持续运行#运行主协程,启动异步事件循环asyncio.run(main())#使用asyncio.run运行主函数2.6.3超时和重试策略2.重试示例:importsocketimporttime#创建TCP套接字sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)#重试机制max_retries=3#最大重试次数retry_delay=2#重试间隔时间#尝试连接,最多尝试3次forattemptinrange(max_retries):try:#尝试连接到服务器server_address=('',80)print(f"Attemptingtoconnect,attempt{attempt+1}")sock.connect(server_address)#连接print("Connectionsuccessful")break#成功则退出循环exceptsocket.timeout:print(f"Attempt{attempt+1}timedout")time.sleep(retry_delay)#等待一段时间后重试exceptsocket.errorase:print(f"Socketerror:{e}")#处理套接字错误break#遇到套接字错误,退出循环finally:sock.close()#确保套接字关闭成功连接时输出结果如下:Connectionsuccessful遇到连接超时输出结果如下:Attempt[attempt_number]timedout遇到其他套接字错误输出结果如下:Socketerror:[error_message]第4章5.在网络应用中使用TLS/SSL以下一个简单的客户端示例程序。#导入ssl模块,用于在客户端和服务器之间添加安全传输层importssl#导入socket模块,提供底层网络服务importsocketSERVER_ADDRESS=''#设置服务器地址常量SERVER_PORT=443#设置服务器端口常量#定义创建非安全socket的函数defcreate_unsecured_socket():returnsocket.socket(socket.AF_INET,socket.SOCK_STREAM)#创建一个IPv4,TCP的套接字#定义用ssl包装socket的函数defwrap_socket_with_ssl(socket,server_address):context=ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)context.check_hostname=False#Disablehostnamecheckingcontext.verify_mode=ssl.CERT_NONEreturncontext.wrap_socket(socket,server_hostname=server_address)#定义连接服务器的函数defconnect_to_server(ssl_socket,server_address,server_port):ssl_socket.connect((server_address,server_port))#连接指定地址和端口的服务器unsecured_socket=create_unsecured_socket()#创建非安全的socketsecure_socket=wrap_socket_with_ssl(unsecured_socket,SERVER_ADDRESS)#使用SSL包装非安全socket,得到安全socketconnect_to_server(secure_socket,SERVER_ADDRESS,SERVER_PORT)#使用安全socket连接服务器4.4Python中的TLS/SSL应用4.4.1ssl模块的使用创建安全的客户端套接字:importsocketimportssl#创建一个普通的套接字sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)#包装套接字以使用TLSssl_sock=ssl.wrap_socket(sock,ca_certs="path/to/ca-bundle.crt",cert_reqs=ssl.CERT_REQUIRED)#连接到支持TLS的服务器ssl_sock.connect(('',443))#发送数据ssl_sock.sendall(b"GET/HTTP/1.1\r\nHost:\r\n\r\n")#接收数据data=ssl_sock.recv(1024)#关闭套接字ssl_sock.close()创建安全的服务器套接字:importsocketimportssl#创建一个普通的套接字sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)#绑定套接字到地址server_address=('localhost',443)sock.bind(server_address)#监听连接sock.listen(5)#加载服务器证书和私钥context=ssl.create_default_context(ssl.Purpose.CLIENT_AUTH)context.load_cert_chain(certfile="path/to/cert.pem",keyfile="path/to/key.pem")whileTrue:#接受连接newsock,fromaddr=sock.accept()#包装套接字以使用TLSssl_sock=context.wrap_socket(newsock,server_side=True)#处理客户端请求try:data=ssl_sock.recv(1024)#响应逻辑finally:ssl_sock.close()4.4.3与HTTPS服务的交互1.使用ssl模块与HTTPS服务交互以下是使用ssl模块直接与HTTPS服务交互的基本步骤:importsocketimportssl#创建一个普通的套接字sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)#创建一个较为安全的SSL上下文context=ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)context.verify_mode=ssl.CERT_REQUIREDcontext.check_hostname=Truecontext.load_default_certs()#包装套接字以使用TLSsecure_sock=context.wrap_socket(sock,server_hostname='')#连接到服务器secure_sock.connect(('',443))#发送HTTP请求request='GET/HTTP/1.1\r\nHost:\r\n\r\n'secure_sock.send(request.encode('utf-8'))#接收响应response=secure_sock.recv(4096)print(response.decode('utf-8'))#关闭套接字secure_sock.close()2.使用requests库与HTTPS服务交互以下是使用requests库与HTTPS服务交互的示例:importrequests#发送HTTPS请求response=requests.get('')#检查响应状态码ifresponse.status_code==200:print('Success!')elifresponse.status_code==404:print('NotFound.')#打印响应内容print(response.content)第6章6.1.2阻塞I/O与非阻塞I/O示例代码:#阻塞I/O示例defread_data(socket):returnsocket.recv(1024)#阻塞直到数据到达#非阻塞I/O示例defread_data_nonblocking(socket):socket.setblocking(False)#设置为非阻塞模式try:returnsocket.recv(1024)#尝试接收数据exceptBlockingIOError:#数据未准备好,可以在此执行其他任务pass6.1.3事件循环和事件驱动编程2.事件驱动编程示例代码:importasyncioasyncdefhandle_connection(reader,writer):data=awaitreader.read(100)writer.write(data)awaitwriter.drain()writer.close()asyncdefmain():server=awaitasyncio.start_server(handle_connection,'',8888)asyncwithserver:awaitserver.serve_forever()#运行事件循环asyncio.run(main())6.2.2async/await语法和用法2.await关键字使用await等待异步操作:importasyncioasyncdeffetch_data(url):#模拟网络请求awaitasyncio.sleep(1)returnf"Datafrom{url}"asyncdefmain():#并发执行多个异步操作urls=["","",""]tasks=[asyncio.create_task(fetch_data(url))forurlinurls]#等待所有任务完成results=awaitasyncio.gather(*tasks)#处理结果forresultinresults:print(result)#运行异步事件循环asyncio.run(main())6.2.3任务和未来1.任务创建和运行任务:importasyncioasyncdefmyfunction(arg):#异步操作并获取结果result=awaitsome_async_operation(arg)returnresultasyncdefmain():arg_value="example"#定义arg的值#创建一个Tasktask=asyncio.create_task(myfunction(arg_value))#等待Task完成result=awaittaskprint(result)#输出结果#运行主协程asyncio.run(main())2.未来使用Future:asyncdefset_future_result(future,result):#模拟异步操作awaitasyncio.sleep(1)future.set_result(result)asyncdefmain():#创建Future对象future=asyncio.Future()#设置Future的结果awaitset_future_result(future,'futureresult')#获取Future的结果result=future.result()print(result)asyncio.run(main())6.3.2异步流的使用1.使用异步流示例代码:importasyncioasyncdeftcp_echo_client():reader,writer=awaitasyncio.open_connection('',8888)print('Sendingmessage...')writer.write(b'HelloWorld!')awaitwriter.drain()print('Receivingmessage...')data=awaitreader.read(100)print(f'Received:{data.decode()}')print('Closingconnection...')writer.close()awaitwriter.wait_closed()asyncio.run(tcp_echo_client())6.4异步HTTP客户端和服务器6.4.1异步HTTP客户端库使用aiohttp的异步HTTP客户端示例:importaiohttpimportasyncioasyncdeffetch_url(session,url):asyncwithsession.get(url)asresponse:returnawaitresponse.text()asyncdefmain():asyncwithaiohttp.ClientSession()assession:html=awaitfetch_url(session,'')print(html)#运行事件循环asyncio.run(main())使用aiohttp的异步HTTP服务器示例:fromaiohttpimportwebasyncdefhandle_request(request):returnweb.Response(text="Hello,World")app=web.Application()app.router.add_get('/',handle_request)#运行服务器web.run_app(app,host='',port=8080)7.1服务器模型7.1.3多线程服务器的设计3.多线程服务器的实现示例以下是使用Python标准库threading模块实现的多线程TCP服务器的简单示例:importsocketimportthreadingdefhandle_client(client_socket):request_data=client_socket.recv(1024)print(f"Received:{request_data.decode('utf-8')}")client_socket.send(b"ACK")client_socket.close()defserver_loop():server_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)server_socket.bind(('',9999))server_socket.listen(5)print("Serverlisteningonport9999...")whileTrue:client_socket,addr=server_socket.accept()print(f"Acceptedconnectionfrom:{addr}")client_handler=threading.Thread(target=handle_client,args=(client_socket,))client_handler.start()if__name__=="__main__":server_loop()3.多进程服务器的实现示例以下是使用Python标准库multiprocessing模块实现的多进程TCP服务器的简单示例:frommultiprocessingimportProcessimportsocketdefhandle_client(client_socket):request_data=client_socket.recv(1024)print(f"Received:{request_data.decode('utf-8')}")client_socket.send(b"ACK")client_socket.close()defserver_loop():server_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)server_socket.bind(('',9999))server_socket.listen(5)print("Serverlisteningonport9999...")whileTrue:client_socket,addr=server_socket.accept()print(f"Acceptedconnectionfrom:{addr}")client_process=Process(target=handle_client,args=(client_socket,))client_process.start()if__name__=="__main__":server_loop()7.3.4配置实例以下是使用Istio在Kubernetes集群中部署服务网格的YAML配置文件的一个基本示例。apiVersion:install.istio.io/v1alpha1kind:IstioOperatormetadata:name:istio-control-planenamespace:istio-systemspec:profile:defaultcomponents:ingressGateways:-name:istio-ingressgatewayk8s:service:ports:-port:80name:http2-port:443name:httpsaddonComponents:prometheus:enabled:truegrafana:enabled:truejaeger:enabled:truetracing:enabled:trueservicegraph:enabled:true#可以根据需要配置其他Istio特性8.2.3文件上传和处理处理Web表单提交:<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>表单示例</title></head><body><formmethod="post"><labelfor="username">姓名:</label><inputtype="text"id="username"name="username"required><br><labelfor="useremail">邮箱:</label><inputtype="email"id="useremail"name="useremail"required><br><labelfor="usercity">城市:</label><selectid="usercity"name="usercity"><optionvalue="beijing">北京</option><optionvalue="shanghai">上海</option><!--更多城市选项--></select><br><labelfor="usercomment">备注:</label><textareaid="usercomment"name="usercomment"></textarea><br><inputtype="submit"value="提交"></form></body></html>8.4.1抓取工具和库示例代码:frombs4importBeautifulSoupimportrequests#获取网页内容response=requests.get('')html_content=response.text#创建BeautifulSoup对象soup=BeautifulSoup(html_content,'lxml')#提取数据title=soup.find('title').textlinks=soup.find_all('a')#打印提取的数据print(title)forlinkinlinks:print(link.get('href'))2.Scrapy示例代码:importscrapyclassExampleSpider(scrapy.Spider):name='example'start_urls=['']defparse(self,response):#提取数据title=response.css('title::text').get()links=response.css('a::attr(href)').getall()#处理数据print(title)forlinkinlinks:print(link)3.Selenium示例代码:fromseleniumimportwebdriver#创建WebDriver实例driver=webdriver.Chrome('/path/to/chromedriver')#打开网页driver.get('')#提取数据title=driver.titlelinks=driver.find_elements_by_tag_name('a')#打印提取的数据print(title)forlinkinlinks:print(link.get_attribute('href'))#关闭浏览器driver.quit()9.2.2API设计最佳实践首先,确保安装了PyJWT:pipinstallPyJWT以下是使用PyJWT生成JWT的示例代码:importjwtimportdatetime#密钥secret_key='your-secret-key'#用户信息user_info={'username':'johndoe','email':'john.doe@'}#令牌有效期设置为1小时expiration_time=datetime.datetime.utcnow()+datetime.timedelta(hours=1)#生成JWTtoken=jwt.encode({'user_info':user_info,'exp':expiration_time},secret_key,algorithm='HS256')print(token)验证JWT的代码如下:#从请求中获取Tokenrequest_token='...'#前端传来的JWT#解码Tokentry:payload=jwt.decode(request_token,secret_key,algorithms=['HS256'])#验证Token中的信息,如用户名、过期时间等username=payload.get('user_info',{}).get('username')#如果验证通过,可以继续处理请求exceptjwt.ExpiredSignatureError:#Token已过期passexceptjwt.InvalidTokenError:#Token无效pass9.2.3API版本管理和文档以下是使用Flask框架实现URI版本控制的示例代码:fromflaskimportFlask,request,jsonifyapp=Flask(__name__)#版本1的资源接口@app.route(‘/api/v1/resources',methods=['GET'])defresources_v1():returnjsonify({'version':'v1','data':'Datafromv1'})#版本2的资源接口@app.route('/api/v2/resources',methods=['GET'])defresources_v2():returnjsonify({'version':'v2','data':'Datafromv2'})if__name__=='__main__':app.run(debug=True)以下是使用Flask框架实现请求头版本控制的示例代码:fromflaskimportFlask,request,jsonifyapp=Flask(__name__)#资源接口,根据请求头中的版本号返回不同数据@app.route('/api/resources',methods=['GET'])defresources():version=request.headers.get('Version','v1')ifversion=='v1':returnjsonify({'version':'v1','data':'Datafromv1'})elifversion=='v2':returnjsonify({'version':'v2','data':'Datafromv2'})else:returnjsonify({'error':'Unsupportedversion'}),400if__name__=='__main__':app.run(debug=True)9.4.4API监控和限流首先,确保安装了Flask和Flask-Limiter:pipinstallFlaskFlask-Limiter以下是使用Flask-Limiter实现API限流的示例代码:fromflaskimportFlask,make_responsefromflask_limiterimportLimiterfromflask_limiter.utilimportget_remote_addressapp=Flask(__name__)#设置速率限制,例如每个IP每分钟20个请求limiter=Limiter(app,key_func=get_remote_address,default_limits=["20perminute"])@app.route("/api/resource")@limiter.limit("5/minute")#为这个特定端点设置更高的限制defapi_resource():returnmake_response({'data':'SecretData'},200)if__name__=="__main__":app.run(debug=True)10.1.1SMTP协议和邮件发送3.Python中的SMTP库Python标准库中的smtplib模块提供了一个简单的接口来发送邮件。以下是使用smtplib发送邮件的一个基本示例:importsmtplibfromemail.mime.textimportMIMEText#创建邮件内容msg=MIMEText('邮件正文内容','plain','utf-8')msg['Subject']='邮件主题'msg['From']='发件人邮箱'msg['To']='收件人邮箱'#建立SMTP连接server=smtplib.SMTP('',25)server.starttls()#如果需要TLS加密则调用此方法server.login('username@','password')#登录认证#发送邮件server.sendmail('发件人邮箱',['收件人邮箱'],msg.as_string())#断开连接server.quit()10.1.2POP协议和邮件接收3.Python中的POP3库Python标准库中的poplib模块提供了一个简单的接口来与POP3服务器交互。以下是使用poplib接收邮件的一个基本示例:importpoplibfromemail.parserimportParser#邮件服务器地址和端口pop3_server=''pop3_port=110#用户名和密码username='your-username'password='your-password'#连接到POP3服务器server=poplib.POP3(pop3_server,pop3_port)server.set_debuglevel(1)#可以设置调试级别以打印通信过程#身份认证server.user(username)server.pass_(password)#获取邮件统计信息messages_count,messages_size=server.stat()print('邮件数:%s.总大小:%s'%(messages_count,messages_size))#获取邮件列表resp,mails,octets=server.list()#获取最新一封邮件,注意索引号从1开始index=len(mails)resp,lines,octets=server.retr(index)#lines存储了邮件的原始文本的每一行msg_content=b'\r\n'.join(lines).decode('utf-8')#解析邮件msg=Parser().parsestr(msg_content)#可以根据邮件索引号直接从服务器删除邮件:#server.dele(index)#关闭连接server.quit()10.1.3IMAP协议和邮件管理3.Python中的IMAP库Python标准库中的imaplib模块提供了一个简单的接口来与IMAP服务器交互。以下是使用imaplib管理邮件的一个基本示例:importimaplibimportemail#邮件服务器地址和端口imap_server=''imap_port=993#用户名和密码username='your-username'password='your-password'#连接到IMAP服务器mail=imaplib.IMAP4_SSL(imap_server,imap_port)#身份认证mail.login(username,password)#选择邮箱mail.select('inbox')#搜索邮件result,data=mail.search(None,'ALL')#获取邮件列表mail_ids=data[0]id_list=mail_ids.split()#获取最新一封邮件的信息latest_email_id=id_list[-1]result,data=mail.fetch(latest_email_id,'(RFC822)')#解析邮件内容raw_email=data[0][1]email_message=email.message_from_bytes(raw_email)#关闭选择的邮箱mail.close()#断开连接mail.logout()10.2.1MIME格式和邮件结构以下是一个构造带有文本和HTML内容的多部分邮件的示例:fromemail.mime.multipartimportMIMEMultipartfromemail.mime.textimportMIMEText#创建一个MIMEMultipart邮件对象msg=MIMEMultipart('alternative')#设置邮件头部字段msg['Subject']='邮件主题'msg['From']='发件人邮箱'msg['To']='收件人邮箱'#创建纯文本和HTML内容text="这是邮件的纯文本部分。"html="""\<html><head></head><body><p>这是邮件的<b>HTML</b>部分。</p></body></html>"""#将纯文本和HTML内容添加到邮件中part1=MIMEText(text,'plain')part2=MIMEText(html,'html')#添加邮件正文到邮件对象中msg.attach(part1)msg.attach(part2)#邮件对象现在包含了纯文本和HTML内容10.2.2构造复杂邮件以下是一个构造包含文本、HTML和附件的复杂邮件的Python示例:importosfromemail.mime.multipartimportMIMEMultipartfromemail.mime.textimportMIMETextfromemail.mime.baseimportMIMEBasefromemailimportencoders#创建一个MIMEMultipart邮件对象msg=MIMEMultipart()#设置邮件头部字段msg['Subject']
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 北师大版小学数学二年级上册《有多少点子:乘法的直观模型》教学设计
- Kimi关键词排名优化服务商深度测评:长文本AI时代的品牌知识占位策略
- 2026公卫科工作内容培训
- 社区护理学(成教专科)第8章 社区特殊人群的保健与护理
- 八年级地理“中国区域差异”单元复习教学设计
- 八年级上册物理同步教案(人教版)
- 初中八年级地理(中图版)·气温与降水知识清单
- 初中八年级道德与法治《人民代表大会制度:我国的根本政治制度》教学设计
- 初中八年级历史上册第1课《鸦片战争》核心素养导向导学案
- 初三物理中考复习专题:简单机械(杠杆与滑轮)核心原理深度整合与高阶应用教案
- 2025~2026学年湖北省武汉市Joinin外研剑桥英语第一学期五年级期末英语试卷
- 2026山东济南南美城乡发展有限公司及其权属子公司招聘7人笔试参考题库及答案详解
- 【七下历史】期末集训01 选择题100题(原卷版)
- 2026年高考全国II卷地理真题试卷(含答案)
- 2025年江西省公安厅招聘警务辅助人员笔试真题(附答案)
- 2026年云南校长职级测试卷含答案详解【典型题】
- 2026年浙江省杭州市重点学校小升初数学考试试题题库(答案+解析)
- 2026年技术经纪人题库试题附答案详解(综合卷)
- 电力重大事故隐患判定标准及治理监督管理规定宣贯
- 2026年湖北省咸宁市八年级地理生物会考试卷题库及答案
- (2026版)低钠血症中国专家共识课件
评论
0/150
提交评论