python发邮件

1. SMTP(简单邮件传输协议)基础

SMTP 协议概述

SMTP(Simple Mail Transfer Protocol,简单邮件传输协议)是用于在计算机网络上传输电子邮件的标准通信协议。它定义了发送邮件的基本规则和流程,确保邮件从发送方顺利传输到接收方的邮箱服务器。SMTP 协议采用客户端-服务器模型,通常通过 TCP 端口 25 进行通信(在 SSL/TLS 加密的情况下通常使用端口 465 或 587)。

SMTP 协议的工作流程主要包括:

  1. 建立连接:邮件客户端与邮件服务器之间建立连接。
  2. 发送邮件数据:邮件客户端通过 SMTP 服务器发送邮件,包括发件人地址、收件人地址、邮件内容等。
  3. 邮件投递:SMTP 服务器将邮件传输到目标邮件服务器。
  4. 断开连接:邮件发送完成后,客户端与服务器断开连接。
使用 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('发送成功')

效果:
在这里插入图片描述

使用有邮箱发送验证码实现验证码登录/注册。。。敬请期待!!!

友友们还想看什么。欢迎留言!

  • 13
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千澜空

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值