Python小项目:基于tkinter开发邮件发送程序

news2024/11/18 23:29:15

文章目录

  • 1 前言
  • 2 项目概述
    • 2.1 项目目标
    • 2.2 功能列表
    • 2.3 技术概述
  • 3 代码详解
  • 4 用户操作手册
    • 步骤1:安装依赖库
    • 步骤2:登录QQ邮箱开启SMPT服务(很重要)
    • 步骤3:填写发件人信息
    • 步骤4:填写收件人信息
    • 步骤5:填写邮件信息
    • 步骤6:发送邮件
    • 注意事项
  • 5 结语

在这里插入图片描述

1 前言

在当今的数字化时代,电子邮件已成为了我们日常生活中不可或缺的一部分。无论是在私人生活还是商业领域,电子邮件的使用频率和重要性都不可低估。然而,对于经常需要发送大量邮件的人来说,手动一封一封地发送邮件可能变得非常繁琐和耗时。

因此,为了简化电子邮件发送流程,我开发了一个基于tkinter的Python小项目——邮件发送程序。利用该程序,您可以轻松快速地批量发送电子邮件,从而节省宝贵的时间和精力。

在文中,我将为您介绍这个邮件发送程序的开发过程以及其实际应用。我会逐步讲解程序的实现细节和关键功能,并提供详细的代码示例和操作指南,以确保您能够成功地使用和定制这个程序。

在这里插入图片描述

2 项目概述

在本章节中,我们将对基于tkinter开发的邮件发送程序进行项目概述。我们将介绍项目的目标、功能以及所使用的技术。

2.1 项目目标

邮件发送程序的主要目标是简化电子邮件发送的过程。本项目旨在提供一个用户友好的界面,通过减少用户的手动操作和自动化发送过程,简化电子邮件的发送流程。

2.2 功能列表

以下是邮件发送程序的主要功能列表:

  1. 提供一个直观的用户界面,使用户可以轻松输入发件人信息、收件人信息以及邮件内容。
  2. 支持用户导入收件人地址列表,以便轻松地将邮件发送给多个收件人。
  3. 使用安全的身份验证机制,确保用户的邮箱密码得到保护。
  4. 自动处理邮件的发送过程,包括建立与邮件服务器的连接和发送邮件。
  5. 提供错误处理和异常提示,以帮助用户识别和解决潜在的问题。
  6. 实现用户友好的界面,包括按钮、输入框和提示框,使用户操作更加方便和舒适。

2.3 技术概述

邮件发送程序是使用Python编程语言开发的。以下是项目中涉及的一些主要技术:

Python编程语言:Python是一种简单且强大的编程语言,适用于快速开发各种应用程序。本项目使用Python来实现整个邮件发送过程。

tkinter图形用户界面库:tkinter是Python标准库中的一个GUI工具包,用于创建用户友好的图形界面。用于邮件发送程序的界面设计和用户交互。

smtplib库:smtplib库是Python标准库中的一个用于发送电子邮件的模块。我们使用smtplib库来处理与邮件服务器的通信,建立连接和发送邮件。

在接下来的章节中,我们将深入探讨项目的安装、使用方法以及一些技巧和注意事项。让我们继续阅读,开始使用这个方便的邮件发送程序吧!

3 代码详解

在本章中,我们将深入了解基于tkinter开发的邮件发送程序的代码实现。我们将逐步解释主要函数和类的作用,以及它们在程序中的调用关系。

完整代码:

import tkinter as tk
from email.mime.text import MIMEText
from email.utils import formataddr
import smtplib
from tkinter import messagebox

# 自定义异常类,用于处理收件人为空的情况
class EmptyRecipientError(Exception):
    pass

# 自定义异常类,用于处理无效收件人的情况
class InvalidRecipientError(Exception):
    pass

# 函数:发送邮件
def sendmail(res, sender_email, sender_name, recipients, subject, password):
    # 如果收件人为空,则抛出自定义的异常
    if not recipients:
        raise EmptyRecipientError("未找到收件人.")

    error_message = ""  # 存储发送失败的错误信息
    success_message = ""  # 存储成功发送的收件人信息

    # 遍历收件人列表
    for recipient_email in recipients:
        try:
            if "@" not in recipient_email:
                raise InvalidRecipientError(f"无效的收件人邮箱: {recipient_email}")

            # 创建邮件对象
            msg = MIMEText(res, 'html', 'utf-8')
            msg['From'] = formataddr([sender_name, sender_email])
            msg['To'] = recipient_email
            msg['Subject'] = subject

            # 发送邮件
            server = smtplib.SMTP_SSL('smtp.qq.com', 465)
            server.login(sender_email, password)
            server.sendmail(sender_email, recipient_email, msg.as_string())
            server.quit()

            # 发送成功,更新成功发送的收件人信息
            success_message += f"{recipient_email}, "
        except InvalidRecipientError as e:
            # 无效收件人,更新发送失败的错误信息
            error_message += f"无效的收件人: {str(e)}\n"
        except Exception as e:
            # 发送邮件异常,更新发送失败的错误信息
            error_message += f"发送邮件至 {recipient_email} 时出错: {str(e)}\n"

    # 根据发送结果显示相应的提示信息
    if error_message and success_message:
        messagebox.showwarning("警告", "部分邮件发送失败。\n" + error_message + "\n成功发送邮件至以下收件人:" + success_message)
    elif error_message:
        messagebox.showerror("错误", "邮件发送失败。\n" + error_message)
    elif success_message:
        messagebox.showinfo("成功", "成功发送邮件至以下收件人:" + success_message)
    else:
        messagebox.showerror("错误", "未找到收件人。")

# 函数:发送邮件(界面部分)
def send_mail_with_tkinter():
    window = tk.Tk()
    window.title("QQ邮箱发送器")  # 设置窗口标题
    window.geometry("800x700")  # 设置窗口尺寸为800x600

    # 创建并显示各个控件
    label_sender_email = tk.Label(window, text="发件人邮箱(仅支持QQ邮箱):")
    label_sender_email.pack()
    entry_sender_email = tk.Entry(window)
    entry_sender_email.pack()

    label_sender_name = tk.Label(window, text="发件人名称:")
    label_sender_name.pack()
    entry_sender_name = tk.Entry(window)
    entry_sender_name.pack()

    label_recipients = tk.Label(window, text="收件人邮箱(每行一个):")
    label_recipients.pack()
    entry_recipients = tk.Text(window, height=10, width=50)
    entry_recipients.pack()

    label_subject = tk.Label(window, text="邮件主题:")
    label_subject.pack()
    entry_subject = tk.Entry(window)
    entry_subject.pack()

    label_password = tk.Label(window, text="发件人授权码:")
    label_password.pack()
    entry_password = tk.Entry(window, show="*")
    entry_password.pack()

    label_content = tk.Label(window, text="邮件内容:")
    label_content.pack()
    text = tk.Text(window, height=20, width=50)
    text.pack()

    # “发送邮件”按钮的回调函数
    def send_email():
        res = text.get("1.0", tk.END)  # 获取邮件内容
        sender_email = entry_sender_email.get()  # 获取发件人邮箱
        sender_name = entry_sender_name.get()  # 获取发件人名称
        subject = entry_subject.get()  # 获取邮件主题
        password = entry_password.get()  # 获取发件人密码

        recipients = entry_recipients.get("1.0", tk.END).strip().splitlines()  # 获取收件人邮箱,每行一个,转为列表

        try:
            # 调用发送邮件函数
            sendmail(res, sender_email, sender_name, recipients, subject, password)
        except EmptyRecipientError:
            messagebox.showerror("错误", "收件人不能为空.")
        
    button_send = tk.Button(window, text="发送邮件", command=send_email)  # 创建“发送邮件”按钮
    button_send.pack()

    window.mainloop()

# 调用函数开始邮件发送界面
send_mail_with_tkinter()

以上代码实现了一个简单的邮件发送界面,使用了tkinter库创建用户界面和控件。

这个程序的主要组成部分如下:

send_mail_with_tkinter函数

该函数用于创建并显示邮件发送界面。它的主要步骤如下:

  1. 创建一个tkinter窗口,并设置窗口的标题为"QQ邮箱发送器",尺寸为800x700。
  2. 创建各个控件的标签和输入框,用于输入发件人的邮箱、名称,收件人的邮箱列表,邮件主题,发件人的授权码,以及邮件的内容。
  3. 创建一个名为"发送邮件"的按钮,并将其回调函数设置为send_email。
  4. 进入tkinter的主事件循环,等待用户操作。

回调函数send_email

该函数用于获取用户在界面中输入的发件人信息、收件人信息、邮件主题等,并调用send_mail函数来发送邮件。

该函数的主要步骤如下:

  1. 从界面中获取发件人的邮箱、名称,收件人的邮箱列表,邮件主题,授权码和邮件的内容。
  2. 尝试调用send_mail函数来发送邮件,并捕获可能抛出的异常EmptyRecipientError。
  3. 如果抛出了EmptyRecipientError异常,则弹出一个错误消息框,提醒用户收件人不能为空。

调用send_mail_with_tkinter函数

通过调用send_mail_with_tkinter函数,程序将开始邮件发送界面。用户可以在这个界面中输入相关信息,然后点击"发送邮件"按钮来发送邮件。如果发件人信息、收件人信息、发送内容等不正确,将会显示相应的错误提示框。


这个程序的核心是send_email函数,它调用了send_mail函数来实际发送邮件。以下是send_mail函数的实现:

def send_mail(sender_email, sender_name, recipients, subject, password, content):
    try:
        message = MIMEText(content, "plain", "utf-8")  # 创建邮件正文对象
        message["From"] = formataddr((sender_name, sender_email))  # 设置发件人
        message["Subject"] = subject  # 设置邮件主题

        # 连接SMTP服务器并发送邮件
        with smtplib.SMTP_SSL("smtp.qq.com", 465) as server:
            server.login(sender_email, password)
            server.sendmail(sender_email, recipients, message.as_string())

        messagebox.showinfo("成功", "邮件发送成功")  # 弹出提示框,显示发送成功信息
    except Exception:
        messagebox.showerror("错误", "邮件发送失败")  # 弹出提示框,显示发送失败信息

send_mail函数的主要步骤如下:

  1. 创建一个MIMEText对象作为邮件正文,其中包含内容、格式和编码信息。
  2. 设置发件人的名称和邮箱地址。
  3. 设置邮件的主题。
  4. 使用SMTP_SSL连接QQ邮箱的SMTP服务器,端口号为465。
  5. 使用提供的发件人邮箱和授权码登录SMTP服务器。
  6. 使用sendmail方法发送邮件,其中sender_email是发件人邮箱,recipients是收件人邮箱列表,message.as_string()将邮件正文转化为字符串形式。
  7. 如果发送成功,弹出一个提示框,显示发送成功的信息;如果发送失败,弹出一个错误提示框,显示发送失败的信息。

请注意,在这个程序中使用了tkinter库来创建用户界面和控件,messagebox模块用于显示提示框。同时,使用了email和smtplib库来处理邮件相关的操作。

通过以上的代码,您可以创建一个简单的邮件发送界面,并实现发送邮件的功能。

4 用户操作手册

步骤1:安装依赖库

在开始使用该程序之前,请确保已安装以下依赖库:

  1. smtplib
  2. tkinter
  3. email.mime.text
  4. tkinter.messagebox
  5. email.utils

可以使用以下命令使用pip安装这些依赖库:

pip install smtplib
pip install tkinter

步骤2:登录QQ邮箱开启SMPT服务(很重要)

登录QQ邮箱→点击“设置”→点击“账号”→下滑找到“POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务”

在这里插入图片描述

如果未开服务需要点击开启,点击“管理服务”

在这里插入图片描述

点击“生成授权码”然后按照提示用注册的手机号给腾讯发送短信,并记住接下来生成的授权码!

步骤3:填写发件人信息

  1. 程序窗口将显示发件人信息的输入框。
  2. 在"发件人邮箱"输入框中,输入邮箱地址。
  3. 在"发件人姓名"输入框中,输入姓名。
  4. 在"授权码"输入框中,输入邮箱授权码。请注意,密码将被以安全的方式处理。

在这里插入图片描述

步骤4:填写收件人信息

  1. 单击"选择收件人文件"按钮来选择一个包含收件人邮箱地址的文本文件。每行一个邮箱地址。
  2. 可以从项目文件夹中选择收件人文件,或在文件选择器中手动导航到目标文件。
  3. 选择完成后,程序将加载并显示文件的路径。

步骤5:填写邮件信息

  1. 在"邮件主题"输入框中,输入要发送的邮件的主题。
  2. 在"邮件正文"输入框中,输入邮件的内容。

步骤6:发送邮件

  1. 确保已填写所有必要信息。
  2. 单击"发送邮件"按钮,程序将验证输入并尝试发送邮件。
  3. 如果出现错误或异常,程序将显示错误消息框来指示问题所在。
  4. 如果一切正常,程序将显示成功消息框以确认邮件发送成功。

注意事项

 请确保网络连接正常,以便能够连接到邮件服务器。
 如果SMTP服务器需要特定的端口号,请在代码中进行相关设置。
 在某些情况下,邮件可能会被识别为垃圾邮件。请确保邮件是合法且符合接收者的期望,以避免此类问题。
 如果遇到任何问题或错误,请尝试重新启动程序并核对输入信息。
 务必保护好邮箱授权码,避免泄露给他人。

5 结语

总结起来,以上代码展示了一个使用Python和tkinter库创建的简单邮件发送界面。该界面允许用户输入发件人的邮箱、名称,收件人的邮箱列表,邮件主题,发件人的授权码以及邮件内容,并通过调用send_mail函数发送邮件。

通过这个简单的界面,用户可以方便地发送邮件,并在发送成功或失败时得到相应的提示。需要注意的是,为了确保功能正常运行,使用的发件人邮箱必须是QQ邮箱。

这个程序使用了常用的Python库,如tkinter用于创建用户界面和控件,email用于处理邮件相关操作,以及smtplib用于连接SMTP服务器并发送邮件。

通过这个示例,您可以进一步学习和扩展,并根据具体需求进行适当的修改和优化。无论是为个人使用还是作为基础功能添加到其他项目中,这个邮件发送界面都可以帮助您更轻松地发送邮件。

希望这个示例对您有所帮助,如果需要进一步的帮助或有其他问题,请随时提问。祝您在使用Python和邮件发送方面取得成功!

在这里插入图片描述

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

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

相关文章

数字孪生与物联网(IoT)技术的结合

数字孪生与物联网(IoT)技术的结合可以在多个领域实现更智能、更高效的应用。以下是数字孪生在物联网技术中的一些应用,希望对大家有所帮助。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎交流合作。 1.实时监…

【2023 CSIG垂直领域大模型】大模型时代,如何完成IDP智能文档处理领域的OCR大一统?

目录 一、像素级OCR统一模型:UPOCR1.1、为什么提出UPOCR?1.2、UPOCR是什么?1.2.1、Unified Paradigm 统一范式1.2.2、Unified Architecture统一架构1.2.3、Unified Training Strategy 统一训练策略 1.3、UPOCR效果如何? 二、OCR大一统模型前…

WEB 3D技术 three.js 顶点缩放

本文 我们来说 顶点缩放 我们官网搜索 BufferGeometry 下面有一个 scale 函数 例如 我们先将代码写成这样 上面图片和资源文件 大家需要自己去加一下 import ./style.css import * as THREE from "three"; import { OrbitControls } from "three/examples/j…

利用C#实现贪吃蛇

说明 本文根据B站up主唐老狮的课程所学所记 目录 说明本文根据B站up主唐老狮的课程所学所记 UML面向对象七大原则总体实现目标单一职责原则(SRP,Single Responsibility Principle)开闭原则(OCP,Open-Closed Principle…

UseContentHash选项能否在打包AssetBundle时计算可靠的Hash

1)UseContentHash选项能否在打包AssetBundle时计算可靠的Hash 2)如何清理Native Reserved部分的内存 3)Addressables资源完整性校验 4)通过Image.color和CanvasRenderer.SetColor修改UI组件颜色的区别 这是第368篇UWA技术知识分享…

如何理解面向对象的OO设计原则和设计模式?

一、如何理解面向对象的编程原则? 单一职责原则(Single Responsibility Principle) 一个类,应该由一组相关性很高的数据和方法组成。一个类应该仅有一个引起它变化的原因。单一职责最难界定的就是关于“职责”的定义,往往需要丰富的经验和对业务的认知程度,这也更加容易引…

H5 - - - - - 获取图片exif相关信息

1. EXIF是什么 【可交换图像文件格式】:(英语:Exchangeable image file format,官方简称Exif),是专门为数码相机的照片设定的,可以记录数码照片的属性信息和拍摄数据。 2. EXIF 相关标识 { ApertureValu…

python封装接口自动化测试套件

在Python中,我们可以使用requests库来实现接口自动化测试,并使用unittest或pytest等测试框架来组织和运行测试套件。以下是一个基本的接口自动化测试套件封装示例: 首先,我们需要安装所需的库: pip install requests …

JSUDO|加速度与阿里云合作云产品

电讯:深圳市加速度软件开发有限公司【加速度jsudo】,与阿里云计算有限公司(简称“阿里云”)达成合作,双方将在电商、企业管理等应用软件领域就云产品和应用软件更深层次合作。 加速度软件长期以来,一直与阿…

群太多,有什么办法可以定时、批量、标签分类群发的吗?

你或许会遇到微信群组过多而导致管理困难等问题吗?对于如何高效地管理众多微信群组,实现分类管理同样具有不可忽视的重要性。 实际上,对此问题小编收到了部分朋友的疑问:“既然可以为微信好友添加标签,那为何不能为微…

如何查找iPhone中所有的应用程序

​ ​ Apple 的 App Store 共有约 200 万个适用于 iPhone 和 iPad 的应用程序。如果您像我们一样,您的 iOS 或 iPadOS 设备上可能有数十个应用程序,但没有机会将它们全部整理好。您很容易忘记主屏幕上应用程序图标的位置。 幸运的是,iPhone…

运用AI翻译漫画(二)

构建代码 构建这个PC桌面应用,我们需要几个步骤: 在得到第一次的显示结果后,经过测试,有很大可能会根据结果再对界面进行调整,实际上也是一个局部的软件工程中的迭代开发。 界面设计 启动Visual Studio 2017, 创建…

VUE部署到IIS中报404错误解决方案-配置URL重写

VUE部署到IIS中报404错误解决方案-配置URL重写 第一步,Windows服务器中开启IIS 可承载的web核心 1、添加角色和功能中安装iis 可承载web核心 第二步,下载url重写工具 官方网站下载地址: https://www.iis.net/downloads/microsoft/url-rewrit…

ASUS华硕ROG幻14笔记本2023款G14 GA402XV原装出厂Win11系统

华硕幻14锐龙R9-7940HS笔记本电脑原厂Windows11.22H2系统 适用型号:GA402XU、GA402XV、GA402XI、GA402XY、GA402XZ 链接:https://pan.baidu.com/s/1sMva1u7D8uFoGnm2Hjrdug?pwdho91 提取码:ho91 原厂系统自带所有驱动、出厂主题壁纸、…

java: 写入数据到HBase

一、添加依赖 <dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-client</artifactId><version>2.6.0</version></dependency><dependency><groupId>org.apache.hbase</groupId><art…

css 编写圆角矩形只有左侧一半的样式

实现该样式&#xff1a;尺寸大小可自由调整修改 <div class"abc"></div>.abc{width: 50px;height: 300px;border: 1px solid red;border-right: none;border-top-left-radius: 10px;border-bottom-left-radius: 10px;}

决策树--分类决策树

1、介绍 ① 定义 分类决策树通过树形结构来模拟决策过程&#xff0c;决策树由结点和有向边组成。结点有两种类型&#xff1a;内部结 点和叶结点。内部结点表示一个特征或属性&#xff0c;叶子节点表示一个类。 ② 生成过程 用决策树分类&#xff0c;从根结点开始&#xff…

智算中心基石-AI算力池化

以智算中心为代表的算力基础设施能够有效促进AI产业化和产业AI化&#xff0c;是支撑数字经济发展的重要基础底座。为了让AI 真正地赋能到千行百业&#xff0c;并推动产业数字化转型发展&#xff0c;智算中心要具备对外提供高性价比、普惠、安全算力资源的能力&#xff0c;使AI算…

CSIG青年科学家会议圆满举行,合合信息打造智能文档处理融合研究新范式

近期&#xff0c;第十九届中国图象图形学学会青年科学家会议&#xff08;简称“会议”&#xff09;在广州召开。会议由中国图象图形学学会&#xff08;CSIG&#xff09;主办&#xff0c;琶洲实验室、华南理工大学、中山大学、中国图象图形学学会青年工作委员会承办。会议面向国…

重磅上新!赛宁人员能力验证评估系统,高效解决人才培养和能力认证难

网络安全人员是安全防护的核心与关键&#xff0c;其素质与能力对关键信息基础设施网络安全防护至关重要。在金融、能源、电子政务等关键行业的网络信息安全规范或指南中&#xff0c;均对网络安全从业人员的资质、能力、培训作出相应规定。《信息安全技术 关键信息基础设施安全保…