1. SMTP(简单邮件传输协议)基础
SMTP 协议概述
SMTP(Simple Mail Transfer Protocol,简单邮件传输协议)是用于在计算机网络上传输电子邮件的标准通信协议。它定义了发送邮件的基本规则和流程,确保邮件从发送方顺利传输到接收方的邮箱服务器。SMTP 协议采用客户端-服务器模型,通常通过 TCP 端口 25 进行通信(在 SSL/TLS 加密的情况下通常使用端口 465 或 587)。
SMTP 协议的工作流程主要包括:
- 建立连接:邮件客户端与邮件服务器之间建立连接。
- 发送邮件数据:邮件客户端通过 SMTP 服务器发送邮件,包括发件人地址、收件人地址、邮件内容等。
- 邮件投递:SMTP 服务器将邮件传输到目标邮件服务器。
- 断开连接:邮件发送完成后,客户端与服务器断开连接。
使用 Python 的 smtplib
模块发送邮件
Python 标准库中提供了 smtplib
模块,用于实现 SMTP 客户端功能。通过该模块,我们可以轻松地与 SMTP 服务器通信并发送电子邮件。下面是一个简单的示例代码,展示如何使用 smtplib
发送一封电子邮件:
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
# 配置邮件的发件人、收件人、主题和内容
sender_email = "your_email@example.com"
receiver_email = "receiver@example.com"
subject = "Test Email"
body = "This is a test email sent using Python."
# 创建邮件对象
msg = MIMEMultipart()
msg['From'] = sender_email
msg['To'] = receiver_email
msg['Subject'] = subject
msg.attach(MIMEText(body, 'plain'))
# 连接到 SMTP 服务器
smtp_server = "smtp.example.com"
port = 587 # 使用 TLS 端口
password = "your_password" # 发件人邮箱的密码
try:
# 创建 SMTP 会话
server = smtplib.SMTP(smtp_server, port)
server.starttls() # 启用 TLS(传输层安全)
# 登录 SMTP 服务器
server.login(sender_email, password)
# 发送邮件
server.sendmail(sender_email, receiver_email, msg.as_string())
print("Email sent successfully!")
except Exception as e:
print(f"Failed to send email: {e}")
finally:
# 关闭 SMTP 会话
server.quit()
代码说明
1 导入模块:我们导入了 smtplib
模块来处理 SMTP 连接,并使用 email.mime
模块来构建邮件内容。
2 设置邮件内容:通过 MIMEText
创建文本邮件内容,并使用 MIMEMultipart
来管理邮件的不同部分(如文本、附件等)。
3 连接到 SMTP 服务器:使用 smtplib.SMTP()
创建与 SMTP 服务器的连接,并调用 starttls()
启用 TLS 加密。
4 登录并发送邮件:通过 login()
方法登录到 SMTP 服务器,然后使用 sendmail()
方法发送邮件。
5 异常处理:使用 try-except-finally
块来处理可能的异常并确保会话关闭。
这段代码展示了如何使用 Python 发送简单的文本邮件。
2.配置SMTP服务
这里使用的是QQ邮箱
QQ邮箱
登录QQ邮箱 点击设置
点击账号
下拉找到 点击如何设置(能直接跳转到,就不贴网址了)
点击蓝字
跳转之后来到安全设置
这里的授权码就是前面代码里要写的密码
应用示例代码:
import smtplib
from email.mime.text import MIMEText # 邮件征文
from email.header import Header # 邮件头
import base64
import re
def is_english_string(s):
return re.match("^[a-zA-Z0-9 .,!?;:'\"-]+$", s) is not None
def encode_nickname(nickname, charset='UTF-8'):
m = is_english_string(nickname)
if m:
return nickname
else:
# 将中文昵称编码为UTF-8字节流
byte_nickname = nickname.encode(charset)
# 将字节流进行base64编码
base64_nickname = base64.b64encode(byte_nickname).decode(charset)
# 构造最终的nickname格式
encoded_nickname = f"=?{charset}?B?{base64_nickname}?="
return encoded_nickname
# 昵称和邮箱
nickname = "庄周"
email = "******@qq.com"
# 生成编码后的From字段
encoded_nickname = encode_nickname(nickname)
from_field = f'"{encoded_nickname}" <{email}>'
print(from_field)
# 登录邮件服务器
smtp_obj = smtplib.SMTP_SSL('smtp.qq.com', 465)
smtp_obj.login('******@qq.com', '***********') # 发件人邮箱和授权码
smtp_obj.set_debuglevel(1) # 现实调试信息
# 设置邮件头消息
msg = MIMEText('庄周骑鱼去接你', 'plain', 'utf-8')
msg['From'] = Header(from_field) # 发送者
msg['To'] = Header('有缘人', 'utf-8') # 接收者
msg['Subject'] = Header('来自**的问候', 'utf-8') # 主题
# 发送
smtp_obj.sendmail('******@qq.com', '******@****.com', msg.as_string())
smtp_obj.quit()
效果
小应用:批量发送工资条
数据是代码自动生成的 可读取实际工资条
# -------------------------------生成数据 已保存到data/salary_data_邮件.csv----------------------------
import base64
import pandas as pd
import random
from datetime import datetime, timedelta
# 唐朝人名列表
tang_dynasty_names = [
"李白", "杜甫", "王维", "白居易", "李商隐", "孟浩然", "刘禹锡", "杜牧", "韩愈", "柳宗元",
"贺知章", "李贺", "王昌龄", "储光羲", "高适", "崔颢", "王之涣", "韦应物", "元稹", "张籍"
]
# 生成数据
data = []
for i in range(20):
employee_id = random.randint(1000, 9999)
name = random.choice(tang_dynasty_names)
email = '******@qq.com' # 这个email需要改成实际工资条的主人 每次是不一样的 这里是用来构造数据 简单写了 真实读取excel/csv文档不会出我问题
basic_salary = round(random.uniform(3000, 12000), 2)
bonus = round(random.uniform(500, 3000), 2)
pre_tax_income = basic_salary + bonus
tax = round(pre_tax_income * 0.2, 2)
post_tax_income = round(pre_tax_income - tax, 2)
payday = (datetime.now() - timedelta(days=random.randint(1, 365))).strftime('%Y-%m-%d')
data.append([
employee_id, name, email, basic_salary, bonus,
pre_tax_income, post_tax_income, tax, payday
])
# 创建DataFrame
columns = [
"员工ID", "员工姓名", "邮箱", "基本工资", "奖金",
"税前总收入", "税后收入", "税金", "发放日期"
]
df = pd.DataFrame(data, columns=columns)
# 保存为CSV文件
file_path = '/salary_data_邮件.csv'
df.to_csv(file_path, index=False)
df.head()
# ----------------------------发送邮件--------------------------------
import pandas as pd
import smtplib
from email.mime.text import MIMEText
from email.header import Header
import re
# 读取工资条
data = pd.read_csv('./salary_data_邮件.csv')
print(data.columns)
id = data.员工ID
name = data.员工姓名
mail = data.邮箱
base_money = data.基本工资
bonus = data.奖金
pre_tax_income = data.税前总收入
after_tax_income = data.税后收入
tax = data.税金
date = data.发放日期
def is_english_string(s):
return re.match("^[a-zA-Z0-9 .,!?;:'\"-]+$", s) is not None
def encode_nickname(nickname, charset='UTF-8'):
m = is_english_string(nickname)
print(m)
if m:
return nickname
else:
# 将中文昵称编码为UTF-8字节流
byte_nickname = nickname.encode(charset)
# 将字节流进行base64编码
base64_nickname = base64.b64encode(byte_nickname).decode(charset)
# 构造最终的nickname格式
encoded_nickname = f"=?{charset}?B?{base64_nickname}?="
return encoded_nickname
# 昵称和邮箱
nickname = "大唐"
email = "*****@qq.com"
# 生成编码后的From字段
encoded_nickname = encode_nickname(nickname)
from_field = f'"{encoded_nickname}" <{email}>'
print(from_field)
smtp_obj = smtplib.SMTP_SSL('smtp.qq.com', 465)
smtp_obj.login('******@qq.com', '*****') # 发件人邮箱和授权码
smtp_obj.set_debuglevel(1) # 现实调试信息
for i in range(len(id)):
# 头消息
head = f'''
<head>{name[i]}</p>-<p>你好</head>
<p>少钱别找我 我只是打工的</p>
<table border="1">
<thead>
<th>基本工资</th>
<th>奖金</th>
<th>税前总收入</th>
<th>税后收入</th>
<th>税金</th>
<th>发放日期</th>
</thead>
<tr>
<td>{base_money[i]}</td>
<td>{bonus[i]}</td>
<td>{pre_tax_income[i]}</td>
<td>{after_tax_income[i]}</td>
<td>{tax[i]}</td>
<td>{date[i]}</td>
</tr>
</table>
'''
msg = MIMEText(_text=head, _subtype='html', _charset='utf-8')
msg['From'] = Header(from_field, ) # 发送者
msg['To'] = Header('有缘人', 'utf-8') # 接收者
msg['Subject'] = Header('来自大唐的问候', 'utf-8') # 主题
smtp_obj.sendmail(from_addr=email, to_addrs=f'{mail[i]}', msg=msg.as_string())
print('发送成功')
效果:
使用有邮箱发送验证码实现验证码登录/注册。。。敬请期待!!!
友友们还想看什么。欢迎留言!