QT 使用 SMTP 发送邮件 // POP3 收取邮件

Qt C++应用集成SMTP邮件发送功能:SmtpClient-for-Qt库实战指南 SMTP(简单邮件传输协议)是互联网电子邮件传输的核心标准协议,其工作原理基于客户端-服务器模型,通过命令响应机制实现邮件的路由与投递。随着网络安全要求的提升,现代SMTP通信普遍采用SSL/TLS加密技术,以确保数据传输的机密性与完整性。在C++/Qt桌面应用开发中,实现稳定可靠的邮件通知功能具有重要技术价值,尤其适用于系统监控、报告自动发送、用户通知等应用场景。本文聚焦于Qt生态下的SmtpClient-for-Qt库,该库原生支持Qt6并提供了完善的异步操作机制,开发者可通过CMake集成、配置SSL 阅读详情

目录

一、邮件服务器和电子邮箱

二、邮件传输协议

1、SMTP协议

2、POP3协议

三、电子邮件的发送和接收过程

四、SMTP 协议详解

1、SMTP 发信方法

2、SMTP 的 8 种命令

3、SMTP 发信流程

4、代码

五、POP3 协议详解

POP3 收信流程

六、全球各大邮箱 的 服务器信息


 

一、邮件服务器和电子邮箱

  要在Internet上提供电子邮件功能,必须有专门的电子邮件服务器。例如现在Internet很多提供邮件服务的厂商:sina、sohu、163等等他们都有自己的邮件服务器。

  这些邮件服务器类似于现实生活中的邮局,它主要负责接收用户投递过来的邮件,并把邮件投递到邮件接收者的电子邮箱中。

  电子邮箱(E-Mail地址)的获得需要在邮件服务器上进行申请,确切地说,电子邮箱其实就是用户在邮件服务器上申请的一个账户,用户在邮件服务器上申请了一个帐号后,邮件服务器就会为这个账号分配一定的空间,用户从而可以使用这个帐号以及空间发送电子邮件和保存别人发送过来的电子邮件。

二、邮件传输协议

1、SMTP协议

简单邮件传输协议 (Simple Mail Transfer Protocol, SMTP) 

  用户连接上邮件服务器之后,要想给它发送一封电子邮件,需要遵循一定的通讯规则,SMTP协议就是用来定义这种通讯规则的。因此,我们通常也把处理用户smtp请求(邮件发送请求)的服务器称之为SMTP服务器(邮件发送服务器)。

2、POP3协议

“邮局协议版本3(Post Office Protocol - Version 3)

  同样,用户若想从邮件服务器管理的电子邮箱当中接收一封电子邮件话,它连上邮件服务器后,也要遵循一定的通讯格式,POP3协议就是用来定义这种通讯格式的。因此,我们通常也把处理用户pop3请求(邮件接收请求)的服务器称之为POP3服务器(邮件接收服务器)。

三、电子邮件的发送和接收过程

  通过一张图来说明一封邮件的发送和接收过程,如下图所示:

 

  简单说一下这个邮件收发过程:

  1、xdp@sohu.com 用户写好一封Email发送到sohu的Smtp服务器。对应于上图的步骤①

  2、sohu的Smtp服务器开始处理xdp@sohu.com 用户的请求,它会根据收件人的地址判断,当前收件人是不是自己管辖的用户,如果是,就直接将Email存放到为该收件人的分配的邮箱空间当中。sohu的Smtp服务器判断收件人地址发现,这一封Email的收件人gacl@sina.com 是Sina的邮件服务器管理的,于是又将Email转发给Sina的Smtp服务器。对应于上图的步骤②

  3、Sina的Smtp服务器开始处理sohu的Smtp服务器发送过来的Email,Sina的Smtp服务器根据收件人的地址判断,发现收件人自己管辖的用户,于是就直接将Email存放到为gacl@sina.com 用户的分配的邮箱空间当中。对应于上图的步骤③。

  4、xdp@sohu.com 用户将邮件发出去之后,就通知gacl@sina.com 用户去收取。gacl@sina.com 用户于是就连接上Sina的POP3服务器收取邮件,对应于上图的步骤④。

  5、POP3服务器从gacl@sina.com 用户的邮箱空间当中取出Email,对应于步骤⑤。

  6、POP3服务器将取出来的Email发给gacl@sina.com 用户,对应于步骤⑥。

四、SMTP 协议详解

1、SMTP 发信方法

SMTP 协议是一个简单的邮件传输协议,利用它您可以将邮件发送给别人。此协议使用命令和应答在客户端与服务器之间传输报文。即客户端发出一个命令,服务器返回一个应答。发送方与接收方进行一问一答的交互,由发送方控制这个对话。

使用 SMTP 协议的邮件服务器分为两种:

  • 一种为邮件发送服务器,通常叫做 smtpd,需要发件人进行认证。
  • 一种为邮件接收服务器,通常叫做 mx,接收外部运营商用户投递给本地用户的邮件。

     

2、SMTP 的 8 种命令

H E L O, M A I L, R C P T,D ATA 和 Q U I T 命令用于发送邮件:

        我们键入m a i l启动用户代理,然后键入主题(s u b j e c t)的提示;键入后,再键入报文的正文。在一行上键入一个句点结束报文,用户代理把邮件传给 M TA,由M TA进行交付。客户主动打开 T C P端口2 5。返回时,客户等待从服务器来的问候报文(应答代码为 2 2 0)。该服务器的应答必须以服务器的完全合格的域名开始。下一步客户用 H E L O命令标识自己。参数必须是完全合格的的客户主机名。M A I L命令标识出报文的发起人。下一个命令, R C P T,标识接收方。如果有多个接收方,可以发多个R C P T命令。邮件报文的内容由客户通过 D ATA命令发送。报文的末尾由客户指定,是只有一个句点的一行。最后的命令Q U I T,结束邮件的交换。

      R S E T 命令异常中止当前的邮件事务并使两端复位。丢掉所有有关发送方、接收方或邮件的存储信息。

      V R F Y 命令使客户能够询问发送方以验证接收方地址,而无需向接收方发送邮件。
      N O O P 命令除了强迫服务器响应一个 O K应答码(2 0 0)外,不做任何事情。
      T U R N 命令使客户和服务器交换角色,无需拆除 T C P连接并建立新的连接就能以相反方向发送邮件。

 

3、SMTP 发信流程

通过 SMTP 协议发送邮件的整体过程如下:

1、客户端 连接到 SMTP 服务器,建立会话。

    clientsocket = new QTcpSocket();
    clientsocket->
connectToHost("smtp.126.com", 25, QTcpSocket::ReadWrite);

2、客户端发送一个 HELO 或 EHLO 命令。

    【使用 helo 和连接上的 smtp 服务器打声招呼】

3、客户端发送一个 AUTH 认证命令 及 进行 用户登录(使用 smtpd 方式)。

      A> 使用 "auth login" 命令登录到 Smtp 服务器

      B> 传入 用户名 和 密码 ,必须经过 Base64 加密

4、客户端发送一个 MAIL 命令指定发件人。

      mail from:<gacl@sohu.com>

5、客户端发送一个 RCPT 命令指定收件人。

      rcpt to:<xdp_gacl@sina.cn>

6、客户端发送一个 DATA 命令,然后输入 邮件正文。

     A> 输入"data"命令 

     data  

     B> 邮件内容格式:

     from:<gacl@sohu.com> ----邮件头

     to:<xdp_gacl@sina.cn> ----邮件头

     subject:hello ----邮件头

     -----空行

     hello gacl ----邮件的具体内容

     C> 邮件附件:

     从上述的 [subject:hello ----邮件头] 往下开始替换:

     MIME-Version: 1.0

     Content-Type: multipart/mixed;boundary=@boundary@ ----见下【注1】

     -----空行

     --@boundary@\r\nContent-Type: text/plain;charset="gb2312"

     -----空行

     hello gacl ----邮件的具体内容

     --@boundary@

     Content-Type: application/octet-stream;

     name="文件名称"

     Content-Transfer-Encoding: base64

     Content-Disposition: attachment;

     filename="文件名称"

     -----空行

      要上传文件的 Byte 数据流

     --@boundary@--End--

7、客户端发送一个 . 命令(点命令)表示 DATA 命令结束。

      .

8、客户端发送一个 QUIT 命令结束会话。

     quit

【注1】

Content-Type 常见有三种:

multipart/mixed、multipart/related、multipart/alternative;

他们的范围是依次包含关系,mixed 包含 related,related 包含 alternative

+------------------------- multipart/mixed ----------------------------+
|                                                                      |
|  +----------------- multipart/related ------------------+            |
|  |                                                      |            |
|  |  +----- multipart/alternative ------+  +---
2024年C/C++实现SMTP/POP3邮件客户端:从Socket到MIME的完整指南 网络编程是构建分布式系统的核心技术,其基础在于理解应用层协议的工作原理。SMTP和POP3作为经典的邮件传输协议,采用基于TCP的“命令-响应”模式,通过状态机管理会话流程,体现了应用层协议设计的通用范式。掌握这些协议不仅能深化对网络分层的理解,更能提升处理数据编码、加密通信和错误恢复的工程能力。在C/C++中直接基于Socket实现协议交互,尤其涉及OpenSSL集成与MIME解析时,开发者必须直面内存管理、缓冲区安全和字符串处理等系统级挑战。这种实践对于构建高性能服务、嵌入式通信模块或准备底层开发面试极 阅读详情

相关推荐

基于VC++的邮件客户端开发实战:从POP3/SMTP协议到MFC界面实现

网络编程是桌面应用开发的核心技能之一,其基础在于理解TCP/IP协议栈和Socket通信原理。通过实现底层的网络通信,开发者可以精准控制数据传输,解决复杂的连接、认证与超时问题,这对于构建稳定可靠的客户端软件至关重要。在Windows平台,VC++凭借其原生的系统级控制力,成为实现这类需求的理想选择,它能直接操作Winsock API,并高效集成MFC等框架进行UI开发。电子邮件系统是网络编程的经典应用场景,其核心是SMTP和POP3这两个基于TCP的文本协议。掌握它们的工作原理,包括命令-响应流程、Bas

weixin_33713350的博客 451

使用Qt发送电子邮件

在Qt中,我们可以使用Qt邮件模块来发送电子邮件。以下是一个示例程序,演示了如何使用Qt发送电子邮件。请注意,上述示例中的SMTP服务器、端口、发件人和收件人的详细信息需要根据您自己的情况进行相应更改。首先,我们需要在Qt项目文件(.pro)中添加邮件模块的依赖。以上代码演示了如何使用Qt发送电子邮件。您可以根据自己的需求进行进一步的定制和调整。然后,我们可以编写发送电子邮件的函数。希望这可以帮助到您!如果您有任何其他问题,请随时提问。最后,我们可以在Qt应用程序的适当位置调用。函数来发送电子邮件。

2301_79366106的博客 1305

基于Qt设计的邮件收发管理系统(垃圾邮件识别)

基于Qt设计的朴素贝叶斯算法邮件收发识别系统。该系统通过对邮件主题、正文内容和附件进行检测,能够有效地识别垃圾邮件和欺诈邮件,并将其自动归类或过滤掉。同时,该系统还支持多种邮件协议(如SMTP、POP3、IMAP等),用户可以通过界面简单方便地进行邮件收发操作。

2916

Qt邮件处理DLL库实现

在现代信息社会中,电子邮件已经成为人们日常工作中不可或缺的沟通工具。随着企业对邮件系统需求的增长,开发一个既高效又安全的邮件处理系统显得尤为重要。QT邮件处理项目应运而生,其目标在于创建一个跨平台、功能完备的邮件客户端软件,以满足企业和个人用户的基本邮件收发和管理需求。头文件(Header Files)在C++编程中非常关键,它们通常包含以下内容:函数声明:使得编译器了解有哪些函数可供调用。类定义:包括类的接口,即公有成员函数和变量。宏定义。

weixin_30653091的博客 1166

Qt SMTP客户端封装实现及源代码分享

电子邮件是现代通信不可或缺的一部分,而SMTP(简单邮件传输协议)是实现电子邮件发送的核心技术。本章节将带您了解SMTP协议的基本概念、工作原理以及它在邮件发送过程中的作用。Qt网络通信模块是一个功能强大的C++库,用于开发跨平台的网络应用程序。它提供了一组易于使用的抽象类,允许开发者在不同的网络协议和传输层之间透明地切换。该模块由以下几个核心组件构成:: 这是一个抽象类,提供了TCP和UDP套接字的接口。QTcpSocket。

weixin_33660045的博客 1077

Qt pop3接收邮件并下载附件程序

Qt pop3自动登陆邮箱接收邮件,并把邮件保存到数据库,附件下载到工程目录。

SmtpClient-for-Qt:用C ++为Qt编写的SMTP客户端。 允许应用程序通过SMTP发送电子邮件(带有文本,html,附件,内联文件等的MIME)。 支持SSL和SMTP身份验证

Qt的SMTP客户端(C ++)-版本1.1 Qt的SmtpClient是为Qt 4(C ++版本)编写的小型库,该库允许应用程序使用简单邮件传输协议(SMTP)发送复杂的电子邮件(纯文本,html,附件,内联文件等)。 1.1版的新功能: 现在支持TLS(STARTTLS)连接 多种类型的收件人(收件人,抄送,密件抄送) 嵌套的mime电子邮件(混合/替代,混合/相关) 输出符合RFC2045 Qt的SMPT Client支持 与SMTP服务器的TCP和SSL连接 SMTP验证(PLAIN和LOGIN方法) 发送MIME电子邮件(给多个收件人) 电子邮件中的纯文本和HTML(带有内联文件)内容 多个附件和内联文件(用于HTML) 不同的字符集(ascii,utf-8等)和编码方法(7bit,8bit,base64) 错误处理 例子 让我们看一个简单的例子: # incl

在Qt中发送邮件的库。

发送邮件的库发送邮件的库发送邮件的库发送邮件的库发送邮件的库发送邮件的库发送邮件的库发送邮件的库发送邮件的库发送邮件的库发送邮件的库发送邮件的库发送邮件的库发送邮件的库发送邮件的库发送邮件的库发送邮件的库发送邮件的库发送邮件的库发送邮件的库发送邮件的库发送邮件的库发送邮件的库发送邮件的库发送邮件的库发送邮件的库发送邮件的库发送邮件的库发送邮件的库发送邮件的库发送邮件的库发送邮件的库发送邮件的库发送邮件的库发送邮件的库发送邮件的库发送邮件的库发送邮件的库发送邮件的库发送邮件的库发送邮件的库发送邮件的库发送邮件的库发送邮件的库发送邮件的库发送邮件的库发送邮件的库发送邮件的库发送邮件的库发送邮件的库发送邮件的库发送邮件的库发送邮件的库发送邮件的库发送邮件的库发送邮件的库发送邮件的库发送邮件的库发送邮件的库发送邮件的库发送邮件的库发送邮件的库发送邮件的库发送邮件的库发送邮件的库发送邮件的库发送邮件的库发送邮件的库发送邮件的库发送邮件的库发送邮件的库发送邮件的库发送邮件的库发送邮件的库发送邮件的库发送邮件的库发送邮件的库发送邮件的库发送邮件的库发送邮件的库发送邮件的库发送邮件的库

qt 网络发送邮件到指定邮箱

qt 网络发送邮件到指定邮箱

WSL2不能上网,Failed to connect to github.com port 443问题解决方案

WSL2不能上网: 问题:ping外网无效 例如:ping www.baidu.com失败 解决方案: 在wsl: $sudo vi /etc/wsl.conf wsl.conf: [network] generateResolvConf = false 在PowerShell: $sudo vi /etc/etc/resolv.conf resolv.conf: # This file was automatically generated by WSL. To stop automatic gen

Jason_Chen__的博客 9527

Lmcache+vllm——KVcache卸载CPU/SSD探索

目前查看了vllm、Nvidia dynamo、mooncake都没有找到将kvcache卸载到SSD的方法,幸好lmcache支持。以下进行lmcache+vllm实践,对比将kvcache分别卸载到CPU-ram和SSD上的TTFT性能差异。目前的query只是单并发,对比的效果已经比较明显了,可能多并发下对存储的要求就会更高了。

weixin_43579058的博客 2655

嵌入式通信协议----Wi-Fi协议详解(一)

Wi-Fi,又称“无线网络”,是Wi-Fi联盟的商标,一个基于IEEE 802.11标准的无线局域网技术。“Wi-Fi”常写作“WiFi”或“Wifi”,但是这些写法并没有被Wi-Fi联盟认可。Wi-Fi产品经由Wi-Fi联盟的一家独立授权测试实验室进行严格测试,产品成功通过测试后,授予制造商或销售商使用Wi-Fi标志、Wi-Fi CERTIFIED标志和相关商标,Wi-Fi联盟使用术语“Wi-Fi CERTIFIED”来称呼这类通过认证的产品。

聪聪的成长之路 1656

【论文泛读|附源码】如何进行动力学重构? 神经网络自动编码器结合SINDy发现数据背后蕴含的方程

这一篇文章叫做 **数据驱动**的**坐标发现与方程发现算法**。想回答的问题很简单,就是根据数据写方程。 想想牛顿的处境,如何根据各种不同物体下落的数据,写出万有引力的数学公式的。这篇文章就是来做这件事的。当然,这篇论文并没有从牛顿视角,完全去思考牛顿所想。而是利用现有的**深度学习技术** 和 **动力学重构的方法** 。提出了一种框架,基于现有的计算机技术,去发现物质运动背后的物理规律。 这里直接给出这篇方法的核心思路图,我们后面会逐个讲解。

qq5q13638的博客 2456

[游戏排查] Baldur‘s Gate 3 加载完成即崩溃?五步排查帮你快速定位问题

《博德之门3》加载崩溃问题解决方案:针对游戏进度条走完后闪退的情况,提供五步排查法。首先清除LevelCache缓存(成功率最高),其次检查Mod兼容性,然后切换Vulkan/DX11渲染API,再排查存档损坏问题,最后可删除配置目录(需备份存档)。重点提示Steam验证无法解决此类问题,建议按步骤顺序排查,多数情况下前两步即可解决问题。

技术小甜甜:传播可落地技术,帮助个人和企业降低解决真实场景问题的成本 3262

vue3 - 超详细 cropper.js 实现图片(头像)裁剪效果功能,在vue3中上传图像后按比例进行图片的裁剪及实时预览,Element / Ant Desi(详细示例源码,一键复制开箱即用!)

vue3图片裁剪及实时预览,vue3 vue-cropper,vue3头像裁剪,vue3 el-upload+vue-cropper 图像图片头像裁剪上传,vue3怎么进行图片的裁剪,vue3使用vue-cropper图片裁剪,vue3项目如何实现头像图片裁剪上传功能,vue3网站pc怎么将上传的图片按比例进行裁剪,vue3+element plus实现图片上传按尺寸大小裁剪,vue3中图片上传使用cropperjs 头像裁剪,vue3中图片上传使用cropperjs 头像裁剪,vue3好用的图片裁剪插件组

✅ 精选推荐文章 4506

RK3588 Buildroot 新建板级DTS

在rk3588 linux开发过程中,新创建板型主要基于硬件差异化、软件适配与优化、项目定制化等多方面需求。

501846585_QQAndroid_java 1298

SAP RAP 校验全流程:从 EML 读取到消息上屏与阻止落库

本文系统梳理了 SAP ABAP RAP 中的校验流程(The Validation Process),结合 Airline/Connection 案例,详细讲解了三类核心校验:语义键唯一性、外键有效性和字段间一致性。文章覆盖了 EML 的 READ ENTITIES 操作、reported-* 与 failed-* 结构的使用方法、消息创建与字段绑定技巧,以及处理草稿数据时的 UNION 查询策略。通过代码示例演示了如何实现校验逻辑、生成错误消息并阻止无效数据持久化,同时提供了常见问题的排查建议。全文注重

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 334

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

上一篇: QT 获取本地存储空间大小、U 盘、SD 卡 - 进度条显示已用容量
下一篇: QT 消息按钮上绘制数字气泡
LearnLHC
博客等级 码龄10年 183粉丝 149原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值