Python 连接数据源与邮件功能(九)

2023-05-05 17:38:46 python 功能 连接 邮件 数据源

一、概述

连接数据源和邮件发送和邮件接收也是在项目中很常见的功能,数据量小的话,可以存在MySQL、Redis、PostgreSQL 等等,数据量大的话,就可以考虑大型分布式高可用存储数据库系统例如:Hadoop、StarRocks、ClickHouse等等。邮件发送一般用于通知,像告警通知,下单通知,支付通知等等。

二、Python 连接数据源

1)Python MySQL 基础操作

Python是一种流行的编程语言,而MySQL是一种常用的关系型数据库管理系统。Python中有许多不同的MySQL库可供使用,其中一些常用的库包括:

  • MySQL Connector——这是MySQL官方提供的Python库,可以在Python 2.7和Python 3.x中使用。它提供了与MySQL数据库的连接和交互的API,并支持多种操作系统。

  • PyMySQL ——这是一个纯Python实现的MySQL客户端库,可以在Python 2.7和Python 3.x中使用。它提供了一种简单而直接的方法来连接到MySQL服务器,并执行查询和其他操作。

1、部署MySQL

MySQL的介绍和部署可以参考我以下几篇文章:

  • MySQL原理介绍

  • MySQL高可用实战( MHA)

  • 【云原生】MySQL on k8s 环境部署

2、MySQL Connector 库

Python 通过 MySQL Connector 模块提供了访问 MySQL 数据库的能力,可以通过该模块使用一系列的函数来进行数据库操作。

下面是一些常用的 Python MySQL 函数:

  • connect():用于连接 MySQL 数据库,返回一个连接对象。

  • cursor():用于创建一个游标对象,该对象用于执行查询语句和读取数据。

  • execute():用于执行 SQL 语句,返回受影响的行数。

  • fetchone():用于获取结果集中的下一行数据。

  • fetchall():用于获取结果集中的所有数据。

  • commit():用于提交事务。

  • rollback():用于回滚事务。

  • close():用于关闭连接。

以下是使用MySQL Connector进行连接和增删改查的演示示例。

【1】安装 mysql-connector-python 库

首先,需要安装mysql-connector-python库:

pip install mysql-connector-python
【2】连接 MySQL

要进行数据库操作,需要先连接MySQL数据库。连接MySQL数据库的代码如下:

import mysql.connector

# 连接到MySQL服务器
conn = mysql.connector.connect(
user='username',
password='password',
host='hostname',
database='database_name'
)

mycursor = conn.cursor()

# 关闭连接
mycursor.close()
conn.close()

在连接数据库时需要替换hostuserpassworddatabase为相应的值。

【3】增加数据

可以使用 execute() 函数执行 INSERT INTO 语句,将数据插入到数据库中。以下是一个示例:

import mysql.connector

# 连接到MySQL服务器
conn = mysql.connector.connect(
user='username',
password='password',
host='hostname',
database='database_name'
)

mycursor = conn.cursor()

sql = "INSERT INTO customers (name, address) VALUES (%s, %s)"
val = ("John", "Highway 21")
mycursor.execute(sql, val)

conn.commit()

print(mycursor.rowcount, "record inserted.")

# 关闭连接
mycursor.close()
conn.close()

在这个例子中,将一条记录插入到名为"customers"的表中。通过将数据作为元组传递给execute()方法,将值插入到占位符中。后,需要使用commit()方法提交更改。

【4】查询数据

可以使用 execute() 函数执行 SELECT 语句,查询数据库中的数据。以下是一个示例:

import mysql.connector

# 连接到MySQL服务器
conn = mysql.connector.connect(
user='username',
password='password',
host='hostname',
database='database_name'
)

mycursor = conn.cursor()

mycursor.execute("SELECT * FROM customers")

myresult = mycursor.fetchall()

for x in myresult:
print(x)

# 关闭连接
mycursor.close()
conn.close()

在这个例子中,从名为"customers"的表中选择所有记录,并使用fetchall()方法将结果存储在变量myresult中。后,使用循环打印每个记录。

【5】更新数据

可以使用 execute() 函数执行 UPDATE 语句,更新数据库中的数据。以下是一个示例:

import mysql.connector

# 连接到MySQL服务器
mydb = mysql.connector.connect(
user='username',
password='password',
host='hostname',
database='database_name'
)

mycursor = mydb.cursor()

sql = "UPDATE customers SET address = 'Canyon 123' WHERE address = 'Highway 21'"

mycursor.execute(sql)

mydb.commit()

print(mycursor.rowcount, "record(s) affected")

# 关闭连接
cursor.close()
conn.close()

在这个例子中,将名为"customers"的表中地址为"Highway 21"的记录的地址更新为"Canyon 123"。

【6】删除数据

可以使用 execute() 函数执行 DELETE 语句,删除数据库中的数据。以下是一个示例:

import mysql.connector

# 连接到MySQL服务器
mydb = mysql.connector.connect(
user='username',
password='password',
host='hostname',
database='database_name'
)

mycursor = mydb.cursor()

sql = "DELETE FROM customers WHERE address = 'Canyon 123'"

mycursor.execute(sql)

mydb.commit()

print(mycursor.rowcount, "record(s) deleted")

# 关闭连接
cursor.close()
conn.close()

2、PyMySQL 库

Python PyMySQL 是一个纯 Python 实现的 MySQL 客户端库,使用 PyMySQL 可以连接 MySQL 数据库并执行数据库操作。下面介绍一些 PyMySQL 常用的函数:

  • connect():用于连接 MySQL 数据库,返回一个连接对象。

  • cursor():用于创建一个游标对象,该对象用于执行查询语句和读取数据。

  • execute():用于执行 SQL 语句,返回受影响的行数。

  • executemany():用于执行多个 SQL 语句,返回受影响的行数。

  • fetchone():用于获取结果集中的下一行数据。

  • fetchall():用于获取结果集中的所有数据。

  • fetchmany():用于获取结果集中指定数量的数据。

  • commit():用于提交事务。

  • rollback():用于回滚事务。

  • close():用于关闭连接。

【1】安装 PyMySQL 库

首先,需要安装PyMySQL库:

pip install PyMySQL
【2】连接 MySQL

要进行数据库操作,需要先连接MySQL数据库。连接MySQL数据库的代码如下:

接下来,连接到MySQL服务器并执行查询:

import pymysql

# 连接到MySQL服务器
conn = pymysql.connect(
host='hostname',
port=port,
user='username',
password='password',
db='database_name',
charset='utf8'
)

# 创建游标对象
mycursor = conn.cursor()

在上面的代码中,需要将hostnameportusernamepassworddatabase_name替换为实际的数据库连接信息。

【3】增加数据

可以使用 execute() 函数执行 INSERT INTO 语句,将数据插入到数据库中。以下是一个示例:

import pymysql

# 连接数据库
conn = pymysql.connect(
host="localhost",
user="username",
password="password",
database="mydatabase"
)

# 创建游标对象
mycursor = conn.cursor()

# 执行插入语句
sql = "INSERT INTO customers (name, address) VALUES (%s, %s)"
val = ("John", "Highway 21")
mycursor.execute(sql, val)

# 提交事务
conn.commit()

# 打印插入数据的 ID
print(mycursor.lastrowid)

# 关闭连接
cursor.close()
conn.close()
【4】查询数据

可以使用 execute() 函数执行 SELECT 语句,查询数据库中的数据。以下是一个示例:

import pymysql

# 连接数据库
conn = pymysql.connect(
host="localhost",
user="username",
password="password",
database="mydatabase"
)

# 创建游标对象
mycursor = conn.cursor()

# 执行查询语句
sql = "SELECT * FROM customers"
mycursor.execute(sql)

# 获取结果集中的所有数据
myresult = mycursor.fetchall()

# 打印数据
for x in myresult:
print(x)

# 关闭连接
cursor.close()
conn.close()
【5】更新数据

可以使用 execute() 函数执行 UPDATE 语句,更新数据库中的数据。以下是一个示例:

import pymysql

# 连接数据库
conn = pymysql.connect(
host="localhost",
user="username",
password="password",
database="mydatabase"
)

# 创建游标对象
mycursor = conn.cursor()

# 执行更新语句
sql = "UPDATE customers SET address = 'Canyon 123' WHERE address = 'Highway 21'"
mycursor.execute(sql)

# 提交事务
conn.commit()

# 打印受影响的行数
print(mycursor.rowcount)

# 关闭连接
cursor.close()
conn.close()
【6】更新数据

可以使用 execute() 函数执行 DELETE 语句,删除数据库中的数据。以下是一个示例:

import pymysql

# 连接数据库
conn = pymysql.connect(
host="localhost",
user="username",
password="password",
database="mydatabase"
)

# 创建游标对象
mycursor = conn.cursor()

# 执行删除语句
sql = "DELETE FROM customers WHERE address = 'Canyon 123'"
mycursor.execute(sql)

# 提交事务
conn.commit()

# 打印受影响的行数
print(mycursor.rowcount)

# 关闭连接
cursor.close()
conn.close()

上述代码演示了如何连接到 MySQL 数据库、执行插入、更新、删除和查询操作以及关闭连接。在实际应用中,还可以使用其他函数来执行复杂的操作,如连接池、事务管理等。

2)Python Redis 基础操作

Redis 是一种基于内存的数据结构存储系统,它可以用作数据库、缓存和消息代理。Python 是一种流行的编程语言,提供了一个 Redis 客户端库,可以轻松地与 Redis 交互。下面是一些 Python Redis 基本操作的示例。

1、部署 Redis

Redis 的介绍和部署可以参考我以下几篇文章:

  • Redis原理介绍

  • Redis原理介绍与环境部署(主从模式、哨兵模式、集群模式)

  • 【云原生】Redis on k8s 编排部署讲解与实战操作

2、Python Redis 基本操作

【1】安装 Redis 客户端库

要在 Python 中使用 Redis,需要安装 Redis 客户端库。可以使用 pip 工具安装:

pip install redis
【2】连接 Redis

在 Python 中连接 Redis,需要使用 Redis 客户端库中的 Redis 类。可以使用以下代码连接到 Redis:

import redis

redis_client = redis.Redis(host='localhost', port=6379, db=)
【3】设置键值对

可以使用 set 方法设置键值对:

redis_client.set('key', 'value')

也可以使用 mset 方法一次设置多个键值对:

redis_client.mset({'key1': 'value1', 'key2': 'value2'})
【4】获取键值对

可以使用 get 方法获取单个键的值:

value = redis_client.get('key')
print(value)

也可以使用 mget 方法一次获取多个键的值:

values = redis_client.mget(['key1', 'key2'])
print(values)
【5】删除键

可以使用 delete 方法删除一个键:

redis_client.delete('key')

也可以使用 delete 方法删除多个键:

redis_client.delete('key1', 'key2')
【6】判断键是否存在

可以使用 exists 方法判断一个键是否存在:

exists = redis_client.exists('key')
print(exists)
【7】设置过期时间

可以使用 expire 方法设置一个键的过期时间(以秒为单位):

redis_client.expire('key', 60)

也可以使用 expireat 方法设置一个键的过期时间(以 Unix 时间戳为单位):

import time

expire_time = int(time.time()) + 60
redis_client.expireat('key', expire_time)
【8】自增和自减

可以使用 incr 方法对一个键进行自增操作:

redis_client.set('count', )
redis_client.incr('count')

也可以使用 decr 方法对一个键进行自减操作:

redis_client.set('count', 10)
redis_client.decr('count')

以上是一些 Python Redis 的基本操作示例,可以根据具体需要进行适当修改和调整。

三、邮件功能

Python 中可以使用标准库中的 smtplib 和 email 模块来发送和接收电子邮件。

1)开通邮箱服务功能

1、邮件协议介绍

SMTP、POP3和IMAP都是电子邮件协议,用于在计算机之间传递和接收电子邮件。

  • SMTP(Simple Mail Transfer Protocol)是用于发送电子邮件的协议。它定义了电子邮件如何通过互联网发送,包括如何连接到邮件服务器、如何验证身份、如何传输邮件、如何处理错误等。

  • POP3(Post Office Protocol version 3)是用于接收电子邮件的协议。它定义了电子邮件如何从邮件服务器下载到本地计算机上的电子邮件客户端。POP3协议允许用户下载所有的邮件,但是在本地计算机上只保留一份副本。

  • IMAP(Internet Message Access Protocol)也是用于接收电子邮件的协议。它定义了电子邮件如何从邮件服务器下载到本地计算机上的电子邮件客户端。IMAP协议允许用户对邮件进行管理和组织,例如在本地计算机上创建文件夹来存储邮件,而不是在邮件服务器上。这使得IMAP更适合那些需要在多个设备上使用电子邮件的用户。

总之,SMTP、POP3和IMAP是三种不同的协议,每个协议都有其独特的作用,使得电子邮件的发送和接收变得更加便捷和高效。简单地说,SMTP管,POP3/IMAP管

POP(Post Office Protocol)和 IMAP(Internet Message Access Protocol)都是电子邮件客户端和邮件服务器之间的协议,但是它们在处理电子邮件的方式上有一些重要的区别:

  • 工作方式:POP将邮件从邮件服务器下载到本地计算机上的邮件客户端,然后将邮件从邮件服务器中删除,这意味着用户只能在本地计算机上访问邮件的一份副本;而IMAP将邮件保留在邮件服务器上,只有在用户请求访问邮件时才会下载邮件到本地计算机上的邮件客户端。

  • 多设备支持:由于POP只下载邮件的一份副本到本地计算机上,因此如果用户使用多个设备(如电脑、平板电脑、智能手机等)来访问邮件,则每个设备上的邮件客户端都会显示不同的邮件状态。而IMAP协议允许用户在多个设备上访问邮件,因为邮件始终保留在邮件服务器上。

  • 邮件管理:IMAP允许用户在邮件服务器上对邮件进行管理,例如创建、删除和重命名文件夹,标记邮件已读或未读等。这使得用户可以轻松地在多个设备之间同步邮件状态。而POP协议只是简单地下载邮件并删除它们,不能像IMAP那样管理邮件。

  • 带宽:由于IMAP只在用户需要访问邮件时才下载邮件,因此它可以节省带宽。而POP在每次下载邮件时都会占用带宽,因为它要下载所有邮件的一份副本。

总之,IMAP是更先进的邮件协议,可以提供更多的功能和灵活性,特别是对于那些需要在多个设备上访问邮件的用户。而POP适合那些只使用单个设备访问邮件的用户。

2、QQ邮箱开启邮件服务设置

3、163邮箱开启邮件服务设置



后整理一下邮箱服务器:

2)Python 邮件示例讲解

以下是一个简单的 Python 脚本,演示了如何使用这两个模块来发送电子邮件。

发送邮件实例:

import smtplib
from email.mime.text import MIMEText
from email.header import Header

# 设置邮件参数
smtp_server = 'smtp.example.com' # 邮件服务器
from_addr = 'your_email@example.com' # 发件人邮箱
to_addr = 'recipient_email@example.com' # 收件人邮箱
username = 'your_email@example.com' # 发件人邮箱账号
password = 'your_email_password' # 发件人邮箱密码

# 构建邮件内容
msg = MIMEText('Hello, this is a test email sent by Python.', 'plain', 'utf-8')
msg['From'] = Header('Sender Name', 'utf-8')
msg['To'] = Header('Recipient Name', 'utf-8')
msg['Subject'] = Header('Python Test Email', 'utf-8')

# 发送邮件
try:
server = smtplib.SMTP(smtp_server, 25)
server.login(username, password)
server.sendmail(from_addr, to_addr, msg.as_string())
server.quit()
print("Email sent successfully!")
except smtplib.SMTPException:
print("Error: 无法发送邮件")

接收邮件示例:

import poplib

# 设置邮件参数
pop_server = 'pop.example.com' # 邮件服务器
username = 'your_email@example.com' # 邮箱账号
password = 'your_email_password' # 邮箱密码

# 连接到邮件服务器
server = poplib.POP3(pop_server)
server.user(username)
server.pass_(password)

# 获取邮件列表
resp, mails, octets = server.list()
print("Total emails: {}".format(len(mails)))

# 获取新一封邮件
resp, lines, octets = server.retr(len(mails))
msg_content = b'\n'.join(lines).decode('utf-8')

# 解析邮件内容
from email.parser import Parser
msg = Parser().parsestr(msg_content)
print("Subject: {}".format(msg['Subject']))
print("From: {}".format(msg['From']))
print("To: {}".format(msg['To']))
print("Content:\n{}".format(msg.get_payload()))

这里的示例代码仅仅是一个简单的示例,可以根据具体的需要来修改和扩展。在使用示例时,注意修改上面的连接信息哦。

相关文章