邮件编程

在Linux的终端上,查看邮件服务器是否开启

1
2
3
4
5
6
7
8
9
rpm -q postfix || yum -y install postfix
yum -y install mailx
systemctl start postfix
netstat -utnlp | grep :25
[root@localhost xx]# useradd bob
[root@localhost xx]# useradd alice
vim /etc/hosts # 把自己的主机名和127地址绑定
127.0.0.1 xxx localhost
:wq!

发送并设置邮件

标准邮件需要三个头部信息

  • From:发件人
  • To:收件人
  • Subject:主题

SMTP

概念

  • SMTP(Simple Mail Transfer Protocol) 即简单邮件传输协议,使用 TCP 协议 25 端口
  • 它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式
  • python 的 smtplib 提供了一种很方便的途径发送电子邮件。它对 smtp 协议进行了简单的封装

SMTP对象

  • Python 发送邮件,第一步是创建 SMTP 对象
  • 创建 SMTP 对象也可以不给定参数,之后再通过对象的其他方法进行绑定

sendmail 方法

  • Python SMTP 对象使用 sendmail 方法发送邮件
  • sendmail 方法三个必须的参数有:
    • 收件人
    • 发件人
    • 消息主体 msg 是一个字符串,表示邮件
  • 将准备好的邮件发送

案例:通过本机发送邮件

准备工作

  1. 创建 bobalice 账号
  2. 编写发送邮件程序,发件人为 root,收件人是本机的 bob *和 *alice 账号
1
2
3
4
[root@localhost xxx]# useradd bob  # 创建接收邮件的用户bob和alice
[root@localhost xxx]# useradd alice
[root@localhost xxx]# mail -u bob # 查看用户bob的邮件,成功
[root@localhost xxx]# mail -u alice

代码编写

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# local_mail.py,使用本机的root用户,发送邮件给bob和alice用户  
from email.mime.text import MIMEText # 导入邮件主体内容的类
from email.header import Header # 导入邮件头部信息的类
import smtplib # 导入发送邮件的模块

msg = MIMEText('python 本地邮件测试\n', 'plain', 'utf8') # 定义文件的内容;'plain' 表示纯文本【类似vim 编写的文件】,富文本【包含图片,字体颜色等】,文本类型为'utf8'
msg['From'] = Header('发送者', 'utf8') # 声明邮件的发件人,类型为'utf8'
msg['To'] = Header('接收者们', 'utf8') # 声明接收邮件方,类型为'utf8'
msg['Subject'] = Header('py test', 'utf8') # 声明邮件的主题【标题】
smtp = smtplib.SMTP('127.0.0.1') # 创建对象,声明发送邮件的服务器
sender = 'root' # 声明发送邮件的用户
receivers = ['bob', 'alice'] # 声明接收邮件的用户,发送邮件给多个用户,用列表表示
# 从当前本机的邮件服务器上,发送邮件,指定发件人,接收方,发送的邮件【包含邮件主体,发件人,收件人,邮件标题】
# msg.as_bytes() 指定以字节的方式发送邮件
smtp.sendmail(sender, receivers, msg.as_bytes())

paramiko 模块应用

功能

实现对 SSH 的相关功能,例如:要对服务器进行远程管理的操作,就需要使用此模块

安装

1
[root@localhost xxx]# pip3 install paramiko  # 使用pip,安装paramiko模块

基本使用

常用方法解释说明

  • SSHClient:创建用于连接 ssh 服务器的实例
  • paramiko.AutoAddPolicy:设置自动添加主机密钥
  • ssh.connect:连接ssh服务器
  • ssh.exec_command:在ssh 服务器上执行指定命令

案例:实现ssh远程连接服务器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[root@localhost xxx]# python3
>>> import paramiko # 导入paramiko,远程连接模块
>>> ssh = paramiko.SSHClient() # 声明一个远程连接的客户端对象
>>> ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 设置远程连接的提示【类似:ssh 远程连接时,提示'yes/no', 要选择yes的操作】
>>> ssh.connect('127.0.0.1', username='root', password='123456') # 使用客户端对象ssh,连接服务器【指定服务器的IP地址,用户名和密码】
>>> result = ssh.exec_command('id root; id zhangsan') # 将结果返回值保存到变量result中,返回值为:输入,输出和错误的类文件对象
>>> result # 查看变量result中返回值信息【result为元组】
>>> len(result)
>>> result[0] # 查看元组result中,【输入信息】的类文件对象
>>> result[1] # 查看元组result中,【输出信息】的类文件对象
>>> result[2] # 查看元组result中,【错误信息】的类文件对象
>>> out = result[1].read() # 读取【输出信息】内容,赋值给变量out
>>> err = result[2].read() # 读取【错误信息】内容,赋值给变量err
>>> out # 查看【输出信息】内容,以bytes字节方式显示
>>> err # 查看【错误信息】内容,以bytes字节方式显示
>>> out.decode() # 查看【输出信息】内容,使用decode(),转换为字符类型
>>> ssh.close() # 断开ssh连接

练习:paramiko 实例

需求:

  • 创建 SSHClient 实例
  • 设置添加主机密钥策略
  • 连接 ssh 服务器
  • 执行指定命令
  • 在 shell 命令行中接收用于连接远程服务器的密码以及在远程主机上执行的命令
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 创建新的python文件rcmd.py ,使用paramiko, 实现ssh远程连接服务器
import paramiko #导入模块parmiko
def rcmd(host, user, passwd, port=22, cmds=None): # 定义函数rcmd(), 功能:实现ssh的远程连接,port=22 cmds=None 如果不传递参数,则使用默认值
ssh = paramiko.SSHClient() # 声明一个远程连接的客户端对象
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 设置远程连接的提示【类似:ssh 远程连接时,提示'yes/no', 要选择yes的操作】
ssh.connect(host, username=user, password=passwd, port=port) # 使用客户端对象ssh,连接服务器【指定服务器的IP地址,端口,用户名和密码】
stdin, stdout, stderr = ssh.exec_command(cmds) # 将元组中的元素,分别赋值给三个变量
out = stdout.read() # 读取输出信息和错误信息
err = stderr.read()
if out: # 输出信息out为绿色显示,错误信息err为红色显示
print('[%s]OUT:\n%s' %(host, out.decode()))
if err:
print('[%s]ERROR:\n%s' % (host, err.decode()))
ssh.close() # 关闭ssh的连接
if __name__ == '__main__':
# 调用函数,指定服务器IP地址,用户名,密码和要执行的命令,采用默认端口22
rcmd('127.0.0.1', 'root', '123456', cmds='id root; id zhangsan')

PyMySQL

准备数据库

  1. 安装 mariadb-server
  2. 启动服务
  3. 创建名为 tedu1 的数据库【utf8】
1
2
3
4
5
6
7
8
9
[root@localhost ~]# yum -y install gcc
[root@localhost ~]# yum -y install mariadb-server
[root@localhost ~]# systemctl start mariadb
[root@localhost ~]# systemctl enable mariadb
[root@localhost ~]# ss -ntulp | grep mysql
[root@localhost ~]# mysql
# 创建数据库 tedu1
# none:表示当前在哪个数据库操作
MariaDB [(none)]> CREATE DATABASE tedu1 CHARSET utf8;

PyMySQL 模块应用

连接数据库

创建连接是访问数据库的第一步

1
2
3
4
5
6
7
8
import pymysql
conn = pymysql.connect(
host='127.0.0.1',
port=3306,
user='root',
db='tedu1',
charset='utf8'
)

游标

  • 游标(cursor)就是游动的标识
  • 通俗的说,一条sql取出对应n条结果资源的接口/句柄,就是游标,沿着游标可以一次取出一行
1
cur = conn.cursor()  # 创建游标【对数据库进行增删改查】

创建表

1
2
3
4
5
6
# 建立部门表,员工表,工资表
# 定义创建departments【部门表】sql命令
create_dep = '''CREATE TABLE departments(
dep_id INT, dep_name VARCHAR(50)
)'''
cur.execute(create_dep) # 执行sql语句create_dep

插入数据

对数据库表做修改操作,必须要 commit

1
2
3
4
5
6
7
8
#向部门表中插入数据
insert_dep = 'INSERT INTO departments VALUES (%s, %s)' # 定义插入数据的变量,%s为占位符
cur.execute(insert_dep, (1, '人事部')) # 执行sql语句insert_dep, 插入一条记录
cur.executemany( # executemany(), 执行sql语句insert_dep, 同时插入多条记录
insert_dep,
[(2, '运维部'), (3, '开发部'), (4, '测试部'), (5, '财务部'), (6, '市场部')]
)
conn.commit()

查询数据

可以取出表中一条、多条或全部记录

1
2
3
4
5
6
7
8
9
10
sql4 = "SELECT * FROM departments"
cur.execute(sql4)
result = cur.fetchone()
print(result)

result2 = cur.fetchmany(2)
print(result2)

result3 = cur.fetchall()
print(result3)

修改数据

通过 update 修改某一字段的值

1
2
3
4
# 更新部门表【departments】中的数据
update_dep = 'UPDATE departments SET dep_name=%s WHERE dep_name=%s'
cur.execute(update_dep, ('人力资源部', '人事部'))
conn.commit()

删除记录

通过 delete 删除记录

1
2
3
4
#删除部门表【departments】中的id为6的数据
del_dep = 'DELETE FROM departments WHERE dep_id=%s'
cur.execute(del_dep, (6,))
conn.commit()

练习 :员工表 (EMPLOYEE) 相关操作

需求

  1. 员工表有 FIRST_NAME VARCHAR(20),LAST_NAME VARCHAR(20),AGE INT,SEX VARCHAR(1),INCOME FLOAT字段
  2. 使用 PyMySQL 创建该表
  3. 使用 PyMySQL 添加以下三条数据
    1. ‘Mac’, ‘A’, 20, ‘M’, 20000
    2. ‘Tom’, ‘B’, 20, ‘F’, 30000
    3. ‘Bob’, ‘C’, 20, ‘M’, 40000
  4. 使用 PyMySQL 查询所有用户信息,并打印结果
  5. 将 FIRST_NAME 为 Mac 的用户工资改成 10000
  6. 删除 FIRST_NAME 为 Tom 的用户信息
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
import pymysql
# 打开数据库连接
db = pymysql.connect(
host='127.0.0.1',
port=3306,
user='root',
db='tedu1',
charset='utf8'
)
# 使用 cursor() 方法创建一个游标对象 cursor
cur = db.cursor()

##########################################################
# 创建表
sql = """CREATE TABLE EMPLOYEE (
FIRST_NAME VARCHAR(20) NOT NULL,
LAST_NAME VARCHAR(20),
AGE INT,
SEX VARCHAR(1),
INCOME FLOAT
)"""
cur.execute(sql)
##########################################################
# SQL 插入语句
sql = """INSERT INTO EMPLOYEE(FIRST_NAME,
LAST_NAME, AGE, SEX, INCOME)
VALUES (%s, %s, %s, %s, %s)"""
cur.executemany( # executemany(), 执行sql语句, 同时插入多条记录
sql, [
('Mac', 'A', 20, 'M', 20000),
('Tom', 'B', 20, 'F', 30000),
('Bob', 'C', 20, 'M', 40000)
]
)
db.commit()
##########################################################
sql = "SELECT * FROM EMPLOYEE"
cur.execute(sql)
result = cur.fetchone()
print(result)
result2 = cur.fetchmany(2)
print(result2)
##########################################################
sql = 'UPDATE EMPLOYEE SET INCOME=%s WHERE FIRST_NAME=%s'
cur.execute(sql, (10000, 'Mac'))
db.commit()
##########################################################
sql = 'DELETE FROM EMPLOYEE WHERE FIRST_NAME=%s'
cur.execute(sql, ("Tom",))
db.commit()
# 关闭数据库连接
cur.close()
db.close()
更新于

请我喝[茶]~( ̄▽ ̄)~*

Chen 微信支付

微信支付

Chen 支付宝

支付宝

Chen 贝宝

贝宝