Python 邮件工具,简洁高效,快来试试
off999 2024-12-13 15:36 24 浏览 0 评论
代码如下:
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email import encoders
import tkinter as tk
from tkinter import filedialog
from tkinter import ttk
import re
import os
sender_email = "本人邮箱"
# 定义最大附件大小(以字节为单位)
MAX_ATTACHMENT_SIZE = 5 * 1024 * 1024 # 5MB
# 支持的文件类型列表
SUPPORTED_FILE_EXTENSIONS = [
'txt', 'csv', 'html', 'xml',
'jpg', 'jpeg', 'png', 'gif',
'pdf',
'doc', 'docx',
'xls', 'xlsx',
'ppt', 'pptx'
]
# 发送邮件的函数
def send_email(receiver_email, subject, content, attachment_path=None):
# 设置邮件服务器信息(以 QQ 邮箱为例)
smtp_server = "smtp.qq.com"
smtp_port = 587
username = sender_email
password = "邮箱授权码"
# 创建一个多部分的邮件对象
msg = MIMEMultipart()
# 设置邮件主题
msg['Subject'] = subject
# 设置发件人邮箱
msg['From'] = sender_email
# 设置收件人邮箱
msg['To'] = receiver_email
# 将邮件正文添加到邮件对象中
msg.attach(MIMEText(content))
# 如果有附件路径
if attachment_path:
file_extension = attachment_path.split(".")[-1].lower()
if file_extension not in SUPPORTED_FILE_EXTENSIONS:
print("不支持的文件类型。")
return False
file_size = os.path.getsize(attachment_path)
if file_size > MAX_ATTACHMENT_SIZE:
print("附件过大。")
return False
maintype, subtype = '', ''
if file_extension in ['txt', 'csv', 'html', 'xml']:
maintype = 'text'
subtype = file_extension
elif file_extension in ['jpg', 'jpeg', 'png', 'gif']:
maintype = 'image'
subtype = file_extension
elif file_extension in ['pdf']:
maintype = 'application'
subtype = 'pdf'
elif file_extension in ['doc', 'docx']:
maintype = 'application'
subtype = 'msword'
elif file_extension in ['xls', 'xlsx']:
maintype = 'application'
subtype = 'vnd.ms-excel'
elif file_extension in ['ppt', 'pptx']:
maintype = 'application'
subtype = 'vnd.ms-powerpoint'
else:
maintype = 'application'
subtype = 'octet-stream'
part = MIMEBase(maintype, subtype)
part.set_payload(open(attachment_path, "rb").read())
encoders.encode_base64(part)
# 确保文件名使用原始文件名,不进行额外编码或处理
raw_filename = os.path.basename(attachment_path)
part.add_header('Content-Disposition', f'attachment; filename="{raw_filename}"')
msg.attach(part)
# 连接服务器并发送邮件
try:
with smtplib.SMTP(smtp_server, smtp_port) as server:
server.starttls()
server.login(username, password)
server.sendmail(sender_email, receiver_email, msg.as_string())
return True
except Exception as e:
print(f"发送邮件时出现错误:{e}")
return False
# 选择附件的函数
def select_attachment():
attachment_path = filedialog.askopenfilename()
attachment_entry.delete(0, tk.END)
attachment_entry.insert(0, attachment_path)
# 发送邮件的函数
def send():
receiver_email = receiver_entry.get()
subject = subject_entry.get()
content = text_entry.get("1.0", tk.END)
attachment_path = attachment_entry.get()
if not receiver_email:
print("收件人邮箱不能为空。")
return
if not subject:
print("邮件主题不能为空。")
return
if not content:
print("邮件正文不能为空。")
return
if not re.match(r'^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+#39;, receiver_email):
print("收件人邮箱格式不正确。")
return
if send_email(receiver_email, subject, content, attachment_path if attachment_path else None):
print("邮件发送成功!")
else:
print("邮件发送失败!")
root = tk.Tk()
root.title("邮件发送工具")
# 设置主题颜色
style = ttk.Style()
style.theme_use('clam')
style.configure('TFrame', background='#D3E0F2')
style.configure('TLabel', background='#D3E0F2', foreground='black', font=('Helvetica', 12))
style.configure('TEntry', fieldbackground='white', font=('Helvetica', 12))
style.configure('TText', background='white', font=('Helvetica', 12))
style.configure('TButton', background='#87CEEB', foreground='black', font=('Helvetica', 12))
frame = ttk.Frame(root)
frame.pack(padx=20, pady=20)
# 接收人邮箱输入框的标签
receiver_label = ttk.Label(frame, text="接收人邮箱:")
receiver_label.grid(row=0, column=0, sticky='w', pady=5)
# 接收人邮箱输入框
receiver_entry = ttk.Entry(frame)
receiver_entry.grid(row=0, column=1, pady=5)
# 邮件主题输入框的标签
subject_label = ttk.Label(frame, text="邮件主题:")
subject_label.grid(row=1, column=0, sticky='w', pady=5)
# 邮件主题输入框
subject_entry = ttk.Entry(frame)
subject_entry.grid(row=1, column=1, pady=5)
# 邮件正文输入框的标签
text_label = ttk.Label(frame, text="邮件正文:")
text_label.grid(row=2, column=0, sticky='w', pady=5)
# 邮件正文输入框
text_entry = tk.Text(frame, height=10, width=50)
text_entry.grid(row=2, column=1, pady=5)
# 附件上传的标签
attachment_label = ttk.Label(frame, text="附件:")
attachment_label.grid(row=3, column=0, sticky='w', pady=5)
# 附件路径输入框
attachment_entry = ttk.Entry(frame)
attachment_entry.grid(row=3, column=1, pady=5)
# 选择附件的按钮
attachment_button = ttk.Button(frame, text="选择附件", command=select_attachment)
attachment_button.grid(row=3, column=2, pady=5)
# 发送按钮
send_button = ttk.Button(frame, text="发送", command=send)
send_button.grid(row=4, column=1, pady=10)
root.mainloop()注意:一是设置本人邮箱。二是设置授权码。
不同的邮箱服务提供商设置授权码的方法可能会有所不同。以 QQ 邮箱为例:
- 登录 QQ 邮箱网页版。
- 在邮箱首页点击顶部的 “设置” 按钮,选择 “账户” 选项卡。
- 在页面中找到 “POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV 服务” 板块。
- 开启 “POP3/SMTP 服务” 或 “IMAP/SMTP 服务”(根据你的需求选择)。
- 按照提示进行短信验证等操作后,系统会生成一个授权码,将这个授权码复制并妥善保存,在使用 Python 等程序发送邮件时,用这个授权码代替邮箱密码进行登录。
Python 邮件发送工具详解与教程
在日常的工作和生活中,我们经常需要发送邮件来进行沟通和信息传递。本文将介绍一个使用 Python 和 Tkinter 库创建的邮件发送工具,它可以让你方便地发送带有附件的邮件。
一、工具概述
这个邮件发送工具使用了 Python 的smtplib、email等模块来实现邮件的发送功能,同时结合 Tkinter 库创建了一个图形用户界面(GUI),让用户可以通过直观的界面操作来发送邮件。
二、代码详解
1. 导入必要的模块
这里导入了一系列模块,包括用于发送邮件的smtplib和构建邮件内容的email模块,以及用于创建 GUI 的tkinter及其子模块。re模块用于正则表达式匹配,用于验证邮箱地址格式。os模块用于获取文件大小等操作。
2. 定义常量和支持的文件类型列表
首先定义了发送邮件的发件人邮箱地址。然后设置了最大附件大小为 5MB。最后列出了支持的文件类型,包括文本文件、图片、PDF、Office 文档等。
3. 发送邮件的函数send_email
这个函数接受收件人邮箱地址、邮件主题、邮件正文内容和附件路径作为参数。首先设置了 QQ 邮箱的 SMTP 服务器信息、用户名和密码。然后创建一个多部分的邮件对象,设置邮件主题、发件人、收件人,并将邮件正文添加到邮件对象中。
如果有附件路径,先检查文件类型是否在支持的列表中,以及文件大小是否超过最大限制。根据文件扩展名确定 MIME 类型,创建附件对象,设置附件内容、编码和头部信息,确保文件名使用原始文件名,然后将附件添加到邮件对象中。
最后,尝试连接 SMTP 服务器,启动 TLS 加密,登录邮箱,发送邮件。如果成功返回True,否则打印错误信息并返回False。
4. 选择附件的函数select_attachment
这个函数使用filedialog.askopenfilename()打开文件选择对话框,让用户选择附件。然后清空附件输入框内容,并将选择的附件路径插入到输入框中。
5. 发送邮件的函数send
这个函数获取用户在界面中输入的收件人邮箱地址、邮件主题、邮件正文内容和附件路径。然后进行一系列输入验证,包括检查收件人邮箱是否为空、邮件主题和正文是否为空,以及收件人邮箱格式是否正确。如果验证通过,调用send_email函数发送邮件,并根据返回值打印相应的消息。
6. 创建 Tkinter 主窗口和界面组件
首先创建了 Tkinter 主窗口,并设置了标题。然后使用ttk.Style设置主题颜色为浅蓝色,并调整了字体大小。接着创建一个ttk.Frame作为容器,设置边距并将其放置在主窗口中。
在框架中添加了接收人邮箱输入框的标签和输入框、邮件主题输入框的标签和输入框、邮件正文输入框的标签和文本框、附件上传的标签和输入框以及选择附件的按钮、发送按钮。
7. 进入 Tkinter 事件循环
这行代码启动了 Tkinter 的事件循环,使程序能够响应用户的操作。
三、使用步骤
- 运行程序,将出现一个邮件发送工具的图形界面。
- 在 “接收人邮箱” 输入框中输入收件人的邮箱地址。
- 在 “邮件主题” 输入框中输入邮件的主题。
- 在 “邮件正文” 输入框中输入邮件的内容。
- 如果需要添加附件,可以点击 “选择附件” 按钮,选择要发送的文件。
- 检查输入是否正确,确保收件人邮箱格式正确、邮件主题和正文不为空。
- 点击 “发送” 按钮,程序将尝试发送邮件。
通过这个邮件发送工具,你可以方便地发送邮件,并且可以添加附件,满足日常的邮件发送需求。希望本文对你理解和使用这个工具有所帮助。
相关推荐
- win11家庭版和专业版哪个好(win11家庭版和专业版哪个好用)
-
win11用专业版本最好,玩游戏最稳定。相对于前代的操作系统来讲,windowS11系统无论哪个版本都非常稳定,但是在门斗41所有版本当中,最稳定的是专业版,但是这个版本占用的空间很大,对硬件的要求...
- win7连不上win10打印机拒绝访问
-
原因及解决方法:1.在Win10Cortana搜索框中,搜索控制面板将打开;2.转到控制面板,选择查看方法作为一个小图标,然后单击程序和功能;3.单击以启用或禁用Windows功能选项;4....
- 电脑主机不启动但通电(电脑主机开机不通电没反应)
-
第1步:首先检查电脑的外部接线是否接好,把各个连线重新插一遍,看故障是否排除。第2步:如果故障依旧,接着打开主机箱查看机箱内有无多余金属物,或主板变形造成的短路,闻一下机箱内有无烧焦的糊味,主板上有无...
- 苹果一体机怎么重装系统(苹果一体机重装系统win10)
-
苹果更换硬盘后,如果您没有创建一个启动磁盘或者使用TimeMachine备份系统,您可以按照以下步骤重新安装操作系统:1.准备一个可用于安装系统的启动磁盘。您可以使用官方提供的macOS安装介质(...
-
- 装系统的u盘怎么制作(装系统怎么制作u盘启动盘)
-
1、下载安装u当家u盘启动盘制作工具,完成之后打开该软件2、将之前准备好的U盘插入电脑,U当家会自动识别并选为默认,如果有多个U盘可以在“选择U盘”的下拉框中选择要制作成U盘启动盘的U盘。3、点击下面的“一键制作”按钮。(如果是电脑主板是U...
-
2025-11-15 07:03 off999
- 台电u盘怎么样
-
感觉台电U盘还是可以的,我知道台电是国内最成功的数码产品制造商之一,是一个致力于IT及消费数码类产品研发、生产、销售及服务的一体化品牌,U盘很好用,用的人很多。威刚是480Mbit/S只是USB2...
- u盘重装系统蓝屏进不去(u盘装系统重启蓝屏)
-
尊敬的用户您好:可按下面的步骤进行系统盘装系统:1.买一张win7光盘,将系统光盘放入光驱里。2.打开电源,然后观察屏幕的提示,在启动系统之前有按“f2进行bios设置。3.设置启动方式。找到boot...
- win快捷键大全(win快捷键大全表)
-
win快捷键:单独按Windows:显示或隐藏“开始”功能表Windows+BREAK:显示“系统属性”对话框Windows+D:显示桌面或恢复桌面Windows+M:最小化所有窗口Windows...
- u盘突然要格式化怎么回事(用着的u盘突然要格式化)
-
U盘提示格式化的原因可能有以下几点:文件系统损坏:U盘的文件系统可能出现损坏,导致无法正常读取和写入数据。病毒感染:U盘可能被病毒感染,病毒会破坏文件系统或隐藏文件。不兼容的文件系统:U盘可能使用了一...
- 路由器pppoe怎么设置(路由器如何设置pppoe上网)
-
移动宽带PPPOE是不用设置的,你只要把帐号和密码填上其他都不选就能上网。但是要注意连接到你电脑的网线是直接经过一个路由器后连接到猫上的,因为我见过有人是这样连接的猫---路由器---路由器---电脑...
- win7桌面图标设置在哪里(win7桌面图标在哪个文件夹)
-
要调出Win7桌面图标,首先需要进入桌面。可以通过点击任务栏上方的“显示桌面”按钮或按下Windows键+D快捷键进入桌面。在桌面上右键单击空白区域,选择“个性化”,然后选择“更改桌面图标”选项。在弹...
- win7手机壁纸(windows7手机桌面主题)
-
1.首先我们打开手机进入到桌面,找到设置图标点击打开。华为手机如何设置自定义锁屏壁纸2.进入到设置界面之后,点击下方的显示选项。华为手机如何设置自定义锁屏壁纸3.然后我们就可以在显示界面中找到壁纸...
- 怎么开启路由器wifi(怎么开启路由器的dhcp功能)
-
把路由器改为开放网络方法如下:1、打开浏览器,在地址栏输入路由器网关IP地址(路由器背后的标签上有,一般是192.168.1.1),输入登录用户名和密码(一般均为admin);2、登录成功后就显示运行...
- win10加载不出来桌面黑屏(window10加载不出来)
-
方法一、如果是遇到了突发性黑屏首先尝试使用Ctrl+Alt+Delete组合键来进行电脑重启一般重启可以解决大部分黑屏故障。win10电脑黑屏按什么键恢复_win10电脑黑屏一键恢复的方法方法...
- 怎么用火绒关闭win安全中心(win10火绒安全软件怎么关闭)
-
一、火绒防火墙关闭方法在电脑上运行火绒软件后,点击首页界面的“防护中心”,在病毒防护界面可以关闭文件、U盘、邮件等保护功能,。系统防护:在该界面可以关闭系统防护功能,。网络防护:可以关闭网络保护等功...
欢迎 你 发表评论:
- 一周热门
-
-
抖音上好看的小姐姐,Python给你都下载了
-
全网最简单易懂!495页Python漫画教程,高清PDF版免费下载
-
Python 3.14 的 UUIDv6/v7/v8 上新,别再用 uuid4 () 啦!
-
python入门到脱坑 输入与输出—str()函数
-
飞牛NAS部署TVGate Docker项目,实现内网一键转发、代理、jx
-
宝塔面板如何添加免费waf防火墙?(宝塔面板开启https)
-
Python三目运算基础与进阶_python三目运算符判断三个变量
-
(新版)Python 分布式爬虫与 JS 逆向进阶实战吾爱分享
-
慕ke 前端工程师2024「完整」
-
失业程序员复习python笔记——条件与循环
-
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python封装 (57)
- python写入txt (66)
- python读取文件夹下所有文件 (59)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)
