python发邮件

news2024/12/26 0:25:27

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('发送成功')

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2054877.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

开源前端埋点监控插件Web-Tracing

Web-Tracing是一款专为前端项目设计的前端监控插件&#xff0c;它基于JavaScript设计&#xff0c;兼容跨平台使用&#xff0c;并提供了全方位的监控功能。 开源地址&#xff1a;https://gitee.com/junluoyu/web-tracing-analysis 以下是关于Web-Tracing的详细介绍&#xff1a;…

李沐:创业一年,人间三年

大家好&#xff0c;我是 Bob! &#x1f60a; 一个想和大家慢慢变富的 AI 程序员&#x1f4b8; 分享 AI 前沿技术、项目经验、面试技巧! 欢迎关注我&#xff0c;一起探索&#xff0c;一起破圈&#xff01;&#x1f4aa; 李沐&#xff1a;创业一年&#xff0c;人间三年 前不久&am…

【项目】Java文档搜索引擎测试报告

一、项目背景 随着Java技术的不断发展和广泛应用&#xff0c;Java开发者对于API文档的需求日益增加。高质量的API文档不仅能帮助开发者快速了解和掌握各种类、接口、方法等的功能与用法&#xff0c;还能显著提升开发效率。然而&#xff0c;在面对庞大的API文档集时&#xff0c…

爱心公益,向阳而生 ——共同家园 “向阳计划“温暖启航

“向阳计划”由大湾区共同家园线上运营建设共同家园社区公益团队。在这个快节奏的时代,总有一份温暖,能穿透喧嚣,照亮人心。今天,共同家园社区我们满怀激动与期待,正式推出“向阳计划”——一项旨在汇聚社会各界爱心力量,共同为需要帮助的人群送去光明与希望的公益行动。我们共…

鸿蒙 点击获取电话号拨打电话 @ohos.telephony.call (拨打电话)

1, 先看看效果 2, 直接CV 代码 import call from ohos.telephony.callEntry Component struct Index {Statephoto: string 15517189270build() {Column() {Row() {Text(this.photo)Image($r(app.media.ic_contacts_incoming_filled)).width(30).height(30).fillColor(Color.Or…

Ajax笔记总结:第二天(Ajax完结)

Xmind鸟瞰图&#xff1a; 简单文字总结&#xff1a; ajax知识总结&#xff1a; Ajax的基本语法&#xff1a; 1.定义一个实例化对象&#xff1a;new XMLHttpRequest() 2.调用open方法填写请求方式和请求地址 3.调用send方法发送请求 4.监听请求状态 5.4代…

05 serv00安装typecho

下载 ‍ cd domain/xxx.serv00.net/# 下载typecho git clone https://github.com/typecho/typecho.git# 当前有两个目录 typecho/ 和 public_html/ ls# 替换html rm -rf public_html/ mv typecho public_html‍ 安装 浏览器访问你的网站 xxx.serv0.net&#xff0c;看见 type…

informer中的WorkQueue机制的实现分析与源码解读(3)之限速队列RateLimitingQueue

概述 前面2篇文章介绍了workqueue中的普通队列FIFO和延时队列。接下来我们分析workqueue中的第三种队列: 限速队列 client-go 的 util/workqueue 包里主要有三个队列&#xff0c;分别是普通队列Queue&#xff0c;延时队列DelayingQueue&#xff0c;限速队列RateLimitingQueue…

IDEA:如何在idea中设置自动导包

这里使用的是idea2020版本,但是不同版本操作不会有较大的差别. 在Editer中展开General之后,选中Auto Import,最后勾选中Add unambiguous imports on the fly.

pygame开发课程系列(7):打砖块,飞行射击,跳跃游戏实例开发

第七章 实践项目 在本章中&#xff0c;我们将通过三个实践项目来巩固和应用前面章节中学到的知识。这些项目涵盖了经典打砖块游戏、飞行射击游戏和简单的平台游戏&#xff0c;它们将帮助你更好地理解 Pygame 的使用&#xff0c;并为你开发自己的游戏提供灵感和实践经验。 7.1…

Java毕业论文 【二手书电子商城网站】源码见github (原创项目,从0-1自己实现)

文章目录 项目背景主要功能模块分布模块分布具体部分功能 系统架构功能演示买家部分界面&#xff1a;卖家部分界面【8002模块】&#xff1a;管理员部分界面&#xff1a; 项目github地址 项目背景 主要面向高校学生&#xff0c;将高年级同学的书回收到低年级学生的手上&#xf…

EmguCV学习笔记 C# 5.2 仿射变换

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 EmguCV是一个基于OpenCV的开源免费的跨平台计算机视觉库,它向C#和VB.NET开发者提供了OpenCV库的大部分功能。 教程VB.net版本请访问…

七天.NET 8操作SQLite入门到实战详细教程(选型、开发、发布、部署)

教程简介 EasySQLite是一个七天.NET 8操作SQLite入门到实战详细教程&#xff0c;主要是对学校班级&#xff0c;学生信息进行管理维护&#xff08;包含选型、开发、发布、部署&#xff09;&#xff01; 什么是SQLite&#xff1f; SQLite 是一个软件库&#xff0c;实现了自给自…

【蓝牙协议栈】【BLE】精讲引用(包含)服务(Included service)

1.欢迎大家关注和订阅匠心之作&#xff0c;【精讲蓝牙协议栈】、【精讲BLE协议栈】和【Android Bluetooth Stack】专栏会持续更新中.....敬请期待&#xff01; 2. 精讲蓝牙协议栈&#xff08;Bluetooth Stack&#xff09;&#xff1a;SPP/A2DP/AVRCP/HFP/PBAP/IAP2/HID/MAP/OP…

【安全靶场】-DC-8

❤️博客主页&#xff1a; iknow181 &#x1f525;系列专栏&#xff1a; 网络安全、 Python、JavaSE、JavaWeb、CCNP &#x1f389;欢迎大家点赞&#x1f44d;收藏⭐评论✍ 目标&#xff1a;192.168.216.150 一、收集信息 1.端口扫描 nmap -T4 -A 192.168.216.150 -p- 看到80端…

【comfyui 】comfyui mac配置教程

comfyui mac配置教程 1. 安装工程依赖与环境配置2. 安装Comfyui3. Comfyui模型下载与运行 1. 安装工程依赖与环境配置 首先&#xff0c;我们找到Mac电脑的终端并打开&#xff0c;我们复制下列代码并粘贴到终端&#xff0c;然后回车&#xff0c;即可开始安装Xcode工具。 xcode…

C++(week17): C++提高:(七)workflow

文章目录 一、Http协议二、Nginx1.概念2.nginx的安装和部署(1)安装nginx(2)使用nginx服务器部署静态资源 3.HTTP服务器架构(1)基于进程、基于线程&#xff1a;APache(2)事件驱动模型&#xff1a;Nginx(3)反向代理(4)负载均衡 三、workflow异步事件引擎 (异步回调模型)1.服务器底…

day26-测试之接口测试postma的请求前置脚本、关联、测试报告

目录 一、请求前置脚本 1.1.概念 1.2.步骤 1.3.代码 1.4.工作原理 二、关联 2.1.应用场景 2.2.实现步骤 2.3.代码 三、测试报告 3.1.安装newman 3.2.命令说明 一、请求前置脚本 1.1.概念 1).书写在”pre-request”标签中 2).postman在http请求发送之前&#xff0c;会自动执行…

easyexcel--多sheet页导入导出

多sheet页导出 核心代码就是下图里面的&#xff0c;使用EasyExcel.writeSheet创建一个sheet,然后用excelWriter写入就行了&#xff0c;很简单 GetMapping("downloadMultiSheet")public void downloadMultiSheet(HttpServletResponse response) throws IOException {…

Linux shell编程学习笔记73:sed命令——沧海横流任我行(上)

0 前言 在大数据时代&#xff0c;我们要面对大量数据&#xff0c;有时需要对数据进行替换、删除、新增、选取等特定工作。 在Linux中提供很多数据处理命令&#xff0c;如果我们要以行为单位进行数据处理&#xff0c;可以使用sed。 1 sed 的帮助信息&#xff0c;功能&#xff…