【Python高级编程】处理其他协议

36 阅读2分钟

一、发送邮件

1、协议

(1)SMTP:发送邮件,Simple Mail Transfer Protocol

(2)POP3:邮局协议,Post Office Protocol V3

(3)IMAP:网络邮件访问协议:Internet Mail Access Protocol,比POP3实时性更强

(4)上述三种协议均为明文传输,所以建议对其进行加密(TLS)

2、如何发送邮件
# 直接导入内置模块
import smtplib, time    # smtplib模块主要用于处理SMTP协议
# email模块主要处理邮件的头和正文等数据
from email.mime.application import MIMEApplication
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
# 定义发件人和收件人
sender = 'student@woniuxy.com'  # 发送邮箱
receiver = 'dengqiang@woniuxy.com'  # 接收邮箱
# 构建邮件的主体对象
msg = MIMEMultipart()
msg['Subject'] = 'Python测试邮件'
msg['From'] = sender
msg['To'] = receiver
body = '''
<div style='font-size: 30px; color: red;'>这是一个邮件的正文, 
<a href='http://www.woniuxy.com'>点我有惊喜</a></div>
'''
content = MIMEText(body, 'html', 'utf-8')
msg.attach(content)
# 添加邮件附件
attachment = MIMEApplication(open('D:/test.jpg', 'rb').read())
filename = 'test.jpg'
attachment.add_header('Content-Disposition', 'attachment', filename=filename)
msg.attach(attachment)
# 建立与邮件服务器的连接并发送邮件
smtpObj = smtplib.SMTP()   # 如果基于SSL,则 smtplib.SMTP_SSL
smtpObj.connect('mail.woniuxy.com', '25')
smtpObj.login(user='student@woniuxy.com', password='Student123')
smtpObj.sendmail(sender, receiver, str(msg))
smtpObj.quit()
3、基于QQ邮箱发送邮件

1.png

# 如果登录SMTP+SSL邮件服务器(QQ服务器不支持连续不停止发送),如果要发送多封,建议第一款之间sleep几秒种
smtpObj = smtplib.SMTP_SSL('smtp.qq.com', 465)
smtpObj.login(user='15903523@qq.com', password='XXXXXXX')
smtpObj.sendmail(sender, receiver, str(msg))
smtpObj.quit()

二、SSH协议

基于Python代码直接可以远程操作Linux服务器(此类技术的运用:利用Python完成远程应用系统部署,远程监控,文件传输,Agentless:无代理模式)

www.jianshu.com/p/8e5b7aea5…

import paramiko
# 初始化SSH连接
transport = paramiko.Transport(('192.168.112.188', 22))
transport.connect(username='root', password='123456')
ssh = paramiko.SSHClient()
ssh._transport = transport
sftp = paramiko.SFTPClient.from_transport(transport)
# 执行命令并获取命令的结果
stdin, stdout, stderr = ssh.exec_command('ls /opt')
stdin, stdout, stderr = ssh.exec_command('ip addr')
stdin, stdout, stderr = ssh.exec_command('sh /opt/learn/pingall.sh')
print(stdout.read().decode())
# 传输文件
sftp.put('./test.jpg', '/opt/test.jpg')        # 上传到Linux
sftp.get('/opt/test.jpg', './test2.jpg')    # 从Linux下载

三、Redis通过过程

1、核心协议体
*2        # 下述的指令由两个字符串构成
$4        # 后续的字符串长度为4
auth
$6        # 后续的字符串长度为6
123456
*3
$3
set
$4
name
$5
woniu
2、使用原始Socket处理Redis
import socket
s = socket.socket()
s.connect(('192.168.112.188', 6379))
s.send('*2\r\n$4\r\nauth\r\n$6\r\n123456\r\n'.encode())
print(s.recv(1024).decode())
s.send('*3\r\n$3\r\nset\r\n$4\r\nname\r\n$7\r\nwoniuxy\r\n'.encode())
print(s.recv(1024).decode())
s.send('*2\r\n$3\r\nget\r\n$4\r\nname\r\n'.encode())
print(s.recv(1024).decode())
3、使用redis模块
import redis
red = redis.Redis(host='192.168.112.188', port=6379, password='123456', db=0)
red.set('addr', 'chengdu')
print(red.get('addr').decode())
red.rpush('students', 'zhangsan')
red.rpush('students', 'lisi')
red.rpush('students', 'wangwu')
print(red.lindex('students', 1))