当前位置: 首页 > article >正文

python:Tkinter 开发邮件客户端,能编写邮件,发送邮件带附件

Python Tkinter 邮件客户端

下面是一个使用 Python Tkinter 开发的简单邮件客户端,支持编写邮件和发送邮件功能:

功能说明

这个邮件客户端包含以下功能:

  1. 邮件编写功能

    • 收件人地址输入
    • 抄送地址输入
    • 邮件主题输入
    • 邮件正文编辑区(支持多行文本)
  2. 邮件发送功能

    • 通过SMTP协议发送邮件
    • 支持SSL/TLS加密
    • 显示发送状态
  3. SMTP配置

    • SMTP服务器地址
    • SMTP端口号
    • 发件人邮箱地址
    • 邮箱密码(授权码)
  4. 界面功能

    • 标签页布局(写邮件和配置)
    • 清空表单按钮
    • 状态栏显示操作状态

使用说明

  1. 在"配置"标签页中设置您的SMTP服务器信息:

    • SMTP服务器:例如 smtp.gmail.com (Gmail)
    • 端口:例如 587 (TLS) 或 465 (SSL)
    • 邮箱地址:您的完整邮箱地址
    • 密码:您的邮箱密码或应用专用密码
  2. 在"写邮件"标签页中:

    • 填写收件人地址(多个地址用逗号分隔)
    • 填写抄送地址(可选)
    • 输入邮件主题
    • 编写邮件正文
  3. 点击"发送"按钮发送邮件

注意事项

  • 大多数邮箱服务商需要使用应用专用密码而不是邮箱登录密码
  • Gmail用户需要在账户设置中启用"安全性较低的应用的访问权限"
  • 某些邮箱服务商可能需要使用不同的端口号(如465用于SSL)
  • 程序使用了SSL加密传输,保证通信安全

扩展建议

如果需要进一步完善此邮件客户端,可以考虑添加以下功能:

  1. 添加邮件附件支持
  2. 实现邮件接收功能(POP3/IMAP)
  3. 添加联系人管理
  4. 增加邮件草稿保存功能
  5. 实现邮件模板功能

要运行此程序,您需要安装 Python和 Tkinter(通常Python标准安装包含Tkinter)。
运行 python eMailClient_1.py
eMail

Python Tkinter 邮件客户端(带附件功能)

下面是在原有邮件客户端基础上增加了附件功能的完整代码:

# -*- coding: utf-8 -*-
""" 用 python Tkinter 开发一个邮件客户端,能编写邮件,发送邮件及附件 """
import os
import ssl
import tkinter as tk
from tkinter import ttk, messagebox, scrolledtext, filedialog
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.application import MIMEApplicationclass MailClient:def __init__(self, root):self.root = rootself.root.title("邮件客户端 (带附件)")self.root.geometry("1000x650")self.root.resizable(True, True)# 设置主题self.style = ttk.Style()self.style.theme_use('clam')# 创建主框架self.main_frame = ttk.Frame(root)self.main_frame.pack(fill=tk.BOTH, expand=True, padx=10, pady=10)# 创建标签页self.tab_control = ttk.Notebook(self.main_frame)self.tab1 = ttk.Frame(self.tab_control)self.tab2 = ttk.Frame(self.tab_control)self.tab_control.add(self.tab1, text='写邮件')self.tab_control.add(self.tab2, text='配置')self.tab_control.pack(fill=tk.BOTH, expand=True)# 写邮件标签页self.create_compose_tab()# 配置标签页self.create_config_tab()# 状态栏self.status_var = tk.StringVar()self.status_var.set("就绪")self.status_bar = ttk.Label(root, textvariable=self.status_var, relief=tk.SUNKEN, anchor=tk.W)self.status_bar.pack(side=tk.BOTTOM, fill=tk.X)# 初始化配置self.smtp_server = "smtp.example.com"self.smtp_port = 587self.email_address = "your_email@example.com"self.email_password = "your_password"# 附件相关self.attachment_path = Noneself.attachment_name = Nonedef create_compose_tab(self):# 收件人ttk.Label(self.tab1, text="收件人:").grid(row=0, column=0, sticky=tk.W, padx=5, pady=5)self.to_entry = ttk.Entry(self.tab1, width=70)self.to_entry.grid(row=0, column=1, columnspan=2, sticky=tk.W+tk.E, padx=5, pady=5)# 抄送ttk.Label(self.tab1, text="抄送:").grid(row=1, column=0, sticky=tk.W, padx=5, pady=5)self.cc_entry = ttk.Entry(self.tab1, width=70)self.cc_entry.grid(row=1, column=1, columnspan=2, sticky=tk.W+tk.E, padx=5, pady=5)# 主题ttk.Label(self.tab1, text="主题:").grid(row=2, column=0, sticky=tk.W, padx=5, pady=5)self.subject_entry = ttk.Entry(self.tab1, width=70)self.subject_entry.grid(row=2, column=1, columnspan=2, sticky=tk.W+tk.E, padx=5, pady=5)# 附件ttk.Label(self.tab1, text="附件:").grid(row=3, column=0, sticky=tk.W, padx=5, pady=5)self.attachment_frame = ttk.Frame(self.tab1)self.attachment_frame.grid(row=3, column=1, columnspan=2, sticky=tk.W+tk.E, padx=5, pady=5)self.attachment_label = ttk.Label(self.attachment_frame, text="未选择文件", width=60)self.attachment_label.pack(side=tk.LEFT, fill=tk.X, expand=True)self.add_attachment_btn = ttk.Button(self.attachment_frame, text="添加附件", width=10, command=self.add_attachment)self.add_attachment_btn.pack(side=tk.RIGHT, padx=(5, 0))self.remove_attachment_btn = ttk.Button(self.attachment_frame, text="移除", width=6, command=self.remove_attachment, state=tk.DISABLED)self.remove_attachment_btn.pack(side=tk.RIGHT)# 邮件正文ttk.Label(self.tab1, text="正文:").grid(row=4, column=0, sticky=tk.NW, padx=5, pady=5)self.body_text = scrolledtext.ScrolledText(self.tab1, width=80, height=18)self.body_text.grid(row=4, column=1, columnspan=2, sticky=tk.W+tk.E+tk.N+tk.S, padx=5, pady=5)# 按钮框架button_frame = ttk.Frame(self.tab1)button_frame.grid(row=5, column=1, columnspan=2, sticky=tk.E, padx=5, pady=10)self.send_button = ttk.Button(button_frame, text="发送", command=self.send_email)self.send_button.pack(side=tk.RIGHT, padx=5)self.clear_button = ttk.Button(button_frame, text="清空", command=self.clear_form)self.clear_button.pack(side=tk.RIGHT, padx=5)# 配置网格权重self.tab1.grid_columnconfigure(1, weight=1)self.tab1.grid_rowconfigure(4, weight=1)def create_config_tab(self):# 配置说明ttk.Label(self.tab2, text="邮件服务器配置", font=("Arial", 10, "bold")).grid(row=0, column=0, columnspan=2, sticky=tk.W, padx=5, pady=10)# SMTP服务器ttk.Label(self.tab2, text="SMTP服务器:").grid(row=1, column=0, sticky=tk.W, padx=5, pady=5)self.smtp_entry = ttk.Entry(self.tab2, width=40)self.smtp_entry.grid(row=1, column=1, sticky=tk.W+tk.E, padx=5, pady=5)self.smtp_entry.insert(0, "smtp.example.com")# 端口ttk.Label(self.tab2, text="端口:").grid(row=2, column=0, sticky=tk.W, padx=5, pady=5)self.port_entry = ttk.Entry(self.tab2, width=10)self.port_entry.grid(row=2, column=1, sticky=tk.W, padx=5, pady=5)self.port_entry.insert(0, "587")# 邮箱地址ttk.Label(self.tab2, text="邮箱地址:").grid(row=3, column=0, sticky=tk.W, padx=5, pady=5)self.email_entry = ttk.Entry(self.tab2, width=40)self.email_entry.grid(row=3, column=1, sticky=tk.W+tk.E, padx=5, pady=5)self.email_entry.insert(0, "your_email@example.com")# 密码ttk.Label(self.tab2, text="密码:").grid(row=4, column=0, sticky=tk.W, padx=5, pady=5)self.password_entry = ttk.Entry(self.tab2, width=40, show="*")self.password_entry.grid(row=4, column=1, sticky=tk.W+tk.E, padx=5, pady=5)self.password_entry.insert(0, "your_password")# 保存配置按钮ttk.Button(self.tab2, text="保存配置", command=self.save_config).grid(row=5, column=1, sticky=tk.E, padx=5, pady=10)# 配置说明note_frame = ttk.LabelFrame(self.tab2, text="配置说明")note_frame.grid(row=6, column=0, columnspan=2, sticky=tk.W+tk.E, padx=5, pady=10)note_text = """
常用邮箱配置参考:
- Gmail: SMTP服务器: smtp.gmail.com端口: 587 (TLS) 或 465 (SSL)需要启用"安全性较低的应用的访问权限"- 网易邮箱:SMTP服务器: smtp.163.com端口: 465 (SSL) 或 994 (SSL)- QQ邮箱:SMTP服务器: smtp.qq.com端口: 465 (SSL) 或 587 (TLS)需要生成授权码代替密码"""ttk.Label(note_frame, text=note_text, justify=tk.LEFT).pack(padx=10, pady=10, fill=tk.BOTH)# 配置网格权重self.tab2.grid_columnconfigure(1, weight=1)def add_attachment(self):file_path = filedialog.askopenfilename(title="选择附件",filetypes=[("所有文件", "*.*"), ("文档", "*.doc *.docx *.pdf *.txt"), ("图片", "*.jpg *.jpeg *.png *.gif"),("压缩文件", "*.zip *.rar")])if file_path:self.attachment_path = file_pathself.attachment_name = os.path.basename(file_path)self.attachment_label.config(text=self.attachment_name)self.remove_attachment_btn.config(state=tk.NORMAL)self.status_var.set(f"已添加附件: {self.attachment_name}")def remove_attachment(self):self.attachment_path = Noneself.attachment_name = Noneself.attachment_label.config(text="未选择文件")self.remove_attachment_btn.config(state=tk.DISABLED)self.status_var.set("已移除附件")def save_config(self):self.smtp_server = self.smtp_entry.get()self.smtp_port = int(self.port_entry.get())self.email_address = self.email_entry.get()self.email_password = self.password_entry.get()messagebox.showinfo("配置保存", "邮件配置已成功保存!")self.status_var.set("配置已保存")def clear_form(self):self.to_entry.delete(0, tk.END)self.cc_entry.delete(0, tk.END)self.subject_entry.delete(0, tk.END)self.body_text.delete("1.0", tk.END)self.remove_attachment()self.status_var.set("表单已清空")def send_email(self):to_email = self.to_entry.get()cc_email = self.cc_entry.get()subject = self.subject_entry.get()body = self.body_text.get("1.0", tk.END)if not to_email:messagebox.showerror("错误", "请填写收件人地址")returntry:# 创建邮件msg = MIMEMultipart()msg['From'] = self.email_addressmsg['To'] = to_emailif cc_email:msg['Cc'] = cc_emailmsg['Subject'] = subject# 添加邮件正文msg.attach(MIMEText(body, 'plain'))# 添加附件if self.attachment_path:self.status_var.set("正在添加附件...")with open(self.attachment_path, "rb") as attachment:part = MIMEApplication(attachment.read(), Name=self.attachment_name)part['Content-Disposition'] = f'attachment; filename="{self.attachment_name}"'msg.attach(part)# 连接SMTP服务器self.status_var.set("正在连接SMTP服务器...")context = ssl.create_default_context()with smtplib.SMTP(self.smtp_server, self.smtp_port) as server:server.starttls(context=context)self.status_var.set("正在登录邮箱...")server.login(self.email_address, self.email_password)# 发送邮件self.status_var.set("正在发送邮件...")recipients = [to_email]if cc_email:recipients.extend(cc_email.split(","))server.sendmail(self.email_address, recipients, msg.as_string())self.status_var.set("邮件发送成功!")messagebox.showinfo("成功", "邮件已成功发送!")self.clear_form()except smtplib.SMTPAuthenticationError:self.status_var.set("发送失败")messagebox.showerror("认证失败", "邮箱地址或密码错误,请检查配置!")except smtplib.SMTPException as e:self.status_var.set("发送失败")messagebox.showerror("SMTP错误", f"发送邮件时出错:\n{str(e)}")except Exception as e:self.status_var.set("发送失败")messagebox.showerror("错误", f"发生错误:\n{str(e)}")if __name__ == "__main__":root = tk.Tk()app = MailClient(root)root.mainloop()

新增功能说明

1. 附件功能

  • 添加附件:通过"添加附件"按钮可以选择本地文件作为邮件附件
  • 附件显示:显示已添加的附件文件名
  • 移除附件:可以随时移除已选择的附件
  • 附件类型:支持所有文件类型,并在文件选择对话框中分类显示常见文件类型

2. 界面改进

  • 附件区域位于主题和正文之间,清晰可见
  • 添加了附件状态显示(未选择文件/已选择文件)
  • 优化了状态栏信息,显示附件操作状态

3. 邮件发送处理

  • 使用MIMEApplication处理附件文件
  • 正确设置附件的Content-Disposition头部
  • 在发送过程中显示附件处理状态

4. 错误处理增强

  • 针对SMTP认证失败提供特定错误提示
  • 捕获并显示所有可能的异常
  • 提供更详细的错误信息

5. 配置说明

  • 添加了常用邮箱的配置说明(Gmail、网易邮箱、QQ邮箱)
  • 包含端口号和特殊要求提示

使用说明

  1. 配置邮件服务器

    • 在"配置"标签页填写您的SMTP服务器信息
    • 参考提供的常用邮箱配置示例
    • 点击"保存配置"按钮保存设置
  2. 添加附件

    • 在"写邮件"标签页点击"添加附件"按钮
    • 选择您要附加的文件
    • 文件名将显示在附件区域
    • 如需移除,点击"移除"按钮
  3. 发送邮件

    • 填写收件人、主题和邮件正文
    • 点击"发送"按钮发送邮件
    • 发送状态将显示在底部状态栏

注意事项

  1. 安全考虑

    • 密码字段使用掩码显示
    • 使用SSL/TLS加密传输
    • 建议使用应用专用密码而不是邮箱登录密码
  2. 附件限制

    • 大附件可能因邮件服务器限制而发送失败
    • 某些邮箱服务商有附件大小限制(如25MB)
  3. 特殊要求

    • Gmail用户需要启用"安全性较低的应用的访问权限"
    • QQ邮箱需要使用授权码代替密码
  4. 错误处理

    • 程序会捕获并显示详细的错误信息
    • 认证失败会提供特定提示
    • 发送过程中会显示状态更新

这个增强版的邮件客户端现在可以满足基本的邮件发送需求,包括添加附件功能,使用起来更加实用和便捷。
在这里插入图片描述

相关文章:

python:Tkinter 开发邮件客户端,能编写邮件,发送邮件带附件

Python Tkinter 邮件客户端 下面是一个使用 Python Tkinter 开发的简单邮件客户端,支持编写邮件和发送邮件功能: 功能说明 这个邮件客户端包含以下功能: 邮件编写功能: 收件人地址输入抄送地址输入邮件主题输入邮件正文编辑区&…...

CMake基础:gcc/g++编译选项详解

目录 1.编译步骤 2.gcc 与 g 区别 3.gcc 命令的常用选项 3.1.基础编译选项 3.2.优化选项 3.3.调试与分析选项 3.4.链接选项 3.5.语言特性选项(C 特化) 3.6.安全增强选项 3.7.架构与指令集优化 3.8.其他常用选项 4.常见编译组合示例 5.常用环…...

深入解析Java21核心新特性(虚拟线程,分代 ZGC,记录模式模式匹配增强)

文章目录 前言一、虚拟线程 (Virtual Threads - JEP 444) - 并发的革命1.1 解决的核心问题🎯1.2 工作原理与核心机制⚙️1.3 使用详解与最佳实践🛠️1.4 注意事项⚠️1.5 总结 📚 二、分代 ZGC (Generational ZGC - JEP 439) - 低延迟新高度2…...

免费批量去水印工具 - 针对文心一言生成图片

免费批量去水印工具 - 针对文心一言生成图片 工具介绍 这是一款免费的批量去水印工具,专门针对文心一言生成的图片进行处理。通过简单的操作,您可以快速去除图片中的水印。 下载链接 您可以通过以下网盘链接下载工具: 链接: https://pa…...

android 之 MediaExtractor

MediaExtractor 是Android多媒体处理的基础组件,解封装是其核心价值。 一、功能与定位 MediaExtractor 是Android多媒体框架中的媒体解封装工具,主要作用是从媒体文件(如MP4、MKV、MP3)中分离音视频轨道数据,为后续解…...

行业案例 | ASOS 借助 Azure AI Foundry(国际版)为年轻时尚爱好者打造惊喜体验

英国潮流电商ASOS借力微软Azure OpenAI,打造生成式AI购物新体验。平台整合大语言模型与推荐引擎,通过智能聊天交互帮年轻用户探索穿搭灵感,精准匹配近900个品牌的潮流单品,实现技术升级与个性化需求的双重突破。 使用 Azure Open…...

在WPS中如何启用宏VBA wps.vba.exe下载和安装

首先我们点击导航栏中的【工具】,点击左侧 运行宏,根据提示 点击 立即加载。加载卡在50%时间比较长,耐心等待。 关闭wps重新打开后, word和xls表格都可以使用了。 如果电脑无法联网,需要提前下载 WPS VBA插件 WPS VB…...

12.7Swing控件5 JProgressBar

Swing 进度条(JProgressBar)是用于可视化展示任务完成进度的组件,通常用于显示长时间运行任务的完成百分比。以下是关于 Swing 进度条的详细介绍: 1. 基本概念与用途 作用:直观展示任务完成进度,避免用户…...

Hardware-Efficient Attention for Fast Decoding

TL;DR 2025 年普林斯顿大学提出的硬件友好 attention 设计,在 MQA/GQA 与 deepseek 提出的 MLA 基础之上继续优化,提出 Grouped-Tied Attention (GTA) 和 Grouped Latent Attention (GLA),实现更高推理效率的同时也能保持较好的模型效果。 …...

LLMs 系列科普文(13)

十三、AlphaGO 提到强化学习的历史,不得不提到 alphago,如果你不记得这是什么了,那你是否还曾记得,早些年 AI 已经可以在围棋中击败人类选手了。 AlphaGO 系统又 DeepMind 公司开发,你可以在网络上找到当初人机大战的…...

kubernetes jenkins pipeline优化拉取大仓库性能指定分支+深度

有时候我们历史的git仓库,提交了某个比较大的文件如果不限制 depth ,就会拉取所有的历史提交记录,这样在历史仓库比较大的时候 clone 非常之慢,而实际上我们只需要最新的代码来构建就行了,为了优化性能,我们…...

element-plus 单选组件 el-radio,选不上,又没报错,直接复制官网也不行解决方案

在使用 Vue 框架开发项目时,Element UI 是常用的组件库。最近在开发中遇到了 Element 单选框组件el-radio的双向绑定问题,直接复制element官网上的的案例下来也是不得,经过调试和探索,终于找到了解决方案,特此记录分享…...

UDP:简洁高效的报文结构解析与关键注意事项

UDP(User Datagram Protocol)以其无连接、低开销的特性,成为实时应用(如视频、游戏、DNS)的首选传输协议。深入理解其报文结构和注意事项,是高效利用UDP的基础。 一、UDP报文结构:简洁的四段式 …...

idea 启动jar程序并调试

添加一个JAR 应用程序,填写以下内容: JAR路径:填写你要启动的jar程序的绝对路径 虚拟机选项:-Xmx1G -Xms1G -agentlib:jdwptransportdt_socket,servery,suspendn,address*:5005 程序实参(可选,minecraft专用…...

CSS 轮廓(Outline)与边框(Border)的深度解析

在 CSS 中,轮廓(outline)和边框(border)是两个用于装饰元素的重要属性,但它们在功能、渲染机制和应用场景上存在显著差异。下面从多个维度进行详细对比: 一、基础定义与语法差异 边框&#xf…...

Spring Boot 2 中 default-autowire 的使用

Spring Boot 2 中 default-autowire 的使用 在 Spring Boot 2 中,default-autowire 这个来自传统 XML 配置的概念仍然存在,但它的使用已经大大减少,因为现代 Spring Boot 应用主要使用注解驱动的配置方式。 default-autowire 在 Spring Boo…...

Docker 部署 Python 的 Flask项目

文章目录 一、构建运行 Docker 容器1. 查找合适镜像2.本地docker 拉取镜像3.项目配置1. python项目下生成 requirements.txt 依赖文件2. 生成Dockerfile文件3.忽略不必要文件4. 构建镜像 4. 运行容器5.测试 二、常见问题与解决方案 一、构建运行 Docker 容器 1. 查找合适镜像 …...

12.vite,webpack构建工具

😺😺 😺1.vite 介绍和对比 🏷️ Vite 是什么? 👉 Vite 是一个 前端构建工具 开发服务器, 可以帮你: • 开发阶段:秒开项目,改代码能瞬间热更新(…...

Vue入门到实战之第一篇【超基础】

Vue入门到实战之第一篇 学习路线1. Vue 概念1.1 Vue 是什么 2. 创建Vue实例,初始化渲染3. 插值表达式 {{ }}4. Vue响应式特性5. 开发者工具 学习路线 1. Vue 概念 1.1 Vue 是什么 概念: Vue是一个用于 构建用户界面1 的 渐进式2 框架3 1:基…...

Selenium自动化操作

1、跳转页面播放视频 我们以b站为例,测试是否可以点击模块进行播放视频 //点击页面看是否视频正常播放public void turn() throws InterruptedException {driver.findElement(By.cssSelector("#i_cecream > div.bili-feed4 > main > div.feed2 >…...

实时数据分析的技术架构:Lambda vs Kappa架构选择

文章目录 引言:实时数据分析架构的重要性Lambda架构深度解析Kappa架构技术特性架构对比分析维度性能与可扩展性评估技术栈选型指南实际应用场景分析成本效益对比模型混合架构与演进策略企业级决策框架最佳实践与案例研究技术趋势与未来展望引言:实时数据分析架构的重要性 在…...

MongoDB慢查询临时开启方法讲解

1、首先连接数据库 mongosh "mongodb://localhost:27017" 2、选择目标数据库 show databases;#显示所有数据库 use lidb;#使用某数据库 3、查看当前分析级别 db.getProfilingStatus() 输出 { was: 0, slowms: 100, sampleRate: 1, ok: 1 } #was0表示关闭&…...

springboot2.x升级springboot3.x

springboot2.x升级springboot3.x 背景升级jdk版本为17以上springboot版本修改javax包更新mybatis-plus升级swagger升级springdocspringdoc配置 背景 当前项目是springboot2.5.9版本的springbootmybatis-plus项目,需要升级到springboot3.5.0项目。 升级jdk版本为17…...

Python训练打卡Day43

复习日 1.卷积神经网络的基本概念 2.kaggle找到一个图像数据集,用cnn网络进行训练并且用grad-cam做可视化 进阶:并拆分成多个文件 tips:注册kaggle的注意事项 安装插件:Header Editor 然后打开扩展选项: 输入网址:ht…...

227.2018年蓝桥杯国赛 - 交换次数(中等)- 贪心

227. 交换次数(贪心) 1. 2018年蓝桥杯国赛 - 交换次数(中等) 标签:2018 暴力 国赛 1.1 题目描述 IT 产业人才需求节节攀升。业内巨头百度、阿里巴巴、腾讯(简称 BAT )在某海滩进行招聘活动。…...

STM32入门学习之系统时钟配置

1. 时钟就是单片机的心脏。单片机根据时钟频率来控制每个部件的工作,时钟是单片机的脉搏,决定了每条命令运行的速率,没有时钟单片机将停止工作。 如何理解“时钟决定了单片机每条命令运行的速率”? 首先需要去理解单片机中的时…...

【ArcGIS Pro微课1000例】0072:如何自动保存编辑内容及保存工程?

文章目录 一、自动保存编辑内容二、自动保存工程在使用ArcGIS或者ArcGIS Pro时,经常会遇到以下报错,无论点击【发送报告】,还是【不发送】,软件都会强制退出,这时如果对所操作没有保存,就会前功尽弃。 此时,自动保存工作就显得尤为重要,接下来讲解两种常见的自动保存方…...

AU音频软件|Audition 2025网盘下载与安装教程指南

说起AU,有些小伙伴可能第一印象是化学元素金(Aurum)。实际上,本文要介绍的AU,全称是Adobe Audition,是一款专业音频编辑和混音软件‌,广泛应用于音乐制作、广播、电影及视频声音设计等领域。 目…...

网络编程(TCP编程)

思维导图 1.基础流程 流程图中是TCP连接的基础步骤&#xff0c;其他操作都是在此基础上进行添加修改。 2.函数接口 2.1 创建套接字&#xff08;socket&#xff09; int socket(int domain, int type, int protocol); 头文件&#xff1a;#include <sys/types.h> …...

[论文阅读] 人工智能+软件工程 | 结对编程中的知识转移新图景

当AI成为编程搭档&#xff1a;结对编程中的知识转移新图景 论文信息 论文标题&#xff1a;From Developer Pairs to AI Copilots: A Comparative Study on Knowledge Transfer&#xff08;从开发者结对到AI副驾驶&#xff1a;知识转移的对比研究&#xff09; 作者及机构&#…...