利用libuv库和smtp协议发送邮件程序

C++网络编程实战:从Socket底层实现SMTP邮件发送客户端 网络编程是计算机通信的基础,其核心在于通过Socket API在不同主机间建立连接、传输数据。理解TCP/IP协议栈和字节流处理是掌握网络编程的关键,这不仅能提升对底层通信机制的认识,还能增强调试复杂网络问题的能力。在工程实践中,应用层协议如SMTP(简单邮件传输协议)将网络通信标准化,通过命令-响应模式实现邮件传输。通过亲手实现SMTP客户端,开发者能深入理解协议状态机、认证流程(如AUTH LOGIN)和MIME编码等核心概念,从而在系统监控、用户通知等场景中构建更可靠、可控的邮件发送功能。本文以C++ 阅读详情

我写这个程序只是练习利用libuv库写程序,怎样连接服务器,怎样处理读写。

这只是一个demo,离真正的发送邮件程序还有一些距离。

附上源代码:

#include <uv.h>
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>

#define FATAL(msg)                                        \
  do {                                                    \
    fprintf(stderr,                                       \
            "Fatal error in %s on line %d: %s\n",         \
            __FILE__,                                     \
            __LINE__,                                     \
            msg);                                         \
    fflush(stderr);                                       \
    abort();                                              \
  } while (0)


typedef struct smtp_s {
	char *helo;
	char *from;
	char *rcpt_to;
	char *data;  
	char *subject;
} smtp_t;

typedef enum {
	START = 0,
	HELO,
	FROM,
	RCPT_TO,
	DATA,
	SUBJECT,
	MAX_STATE
} smtp_states;
	
static char *smtp_code[] = {
	"220",
	"250",
	"250",
	"250",
	"354",
	"250"
};

static char *smtp_name[] = {
	"start",
	"helo",
	"from",
	"rcpt_to",
	"data",
	"subject"
};

static char *smtp_msg[] = {
	"helo vrm\r\n",
	"mail from:<engine@vrm.com\r\n",
	"rcpt to:<1348104823@qq.com>\r\n",  // 改成你自己的QQ邮箱帐号
	"data\r\n",
	"this is a test\r\n.\r\n"
};

static smtp_t smtp;
static smtp_states state = START;
static uv_loop_t *loop;


static void connect_cb(uv_connect_t *req, int status);
static void read_server_cb(uv_stream_t *stream, ssize_t nread, uv_buf_t buf);
static void write_server_cb(uv_write_t *req, int status);
static uv_buf_t alloc_cb(uv_handle_t *handle, size_t suggested_size);


static void connect_cb(uv_connect_t *req, int status)
{
	int r;
	
	uv_read_start(req->handle, alloc_cb, read_server_cb);
}


static uv_buf_t alloc_cb(uv_handle_t *handle, size_t suggested_size)
{
	return uv_buf_init(malloc(suggested_size), suggested_size);
}

static void write_server_cb(uv_write_t *req, int status)
{
	uv_err_t err;
	free(req);
	state += 1;
	if (status == 0) {
		return;
	}
	
	err = uv_last_error(loop);
	fprintf(stderr, "uv_write error: %s\n", uv_strerror(err));
	if (err.code == UV_ECANCELED) {
		return;
	}

	
}

static void read_server_cb(uv_stream_t *stream, ssize_t nread, uv_buf_t buf)
{
	uv_write_t *wr;
	size_t len;
	int flag = 0;
	if (state == MAX_STATE) {
		uv_close((uv_handle_t *) stream, NULL);
		printf("smtp end\r\n");
		return;
	}
	if (strncmp(smtp_code[state], buf.base, 3) != 0) {
		uv_close((uv_handle_t *) stream, NULL);
		fprintf(stderr, "stmp state %s error: %s\n",
			smtp_name[state],
			buf.base);
		return;
	}


	free(buf.base);
	wr = (uv_write_t *) malloc(sizeof(uv_write_t));

	len = strlen(smtp_msg[state]);
	buf = uv_buf_init(smtp_msg[state], len);

	if (uv_write(wr, stream, &buf, 1, write_server_cb)) {
		FATAL("uv_write failed");
	}
	
}

int main()
{
	uv_tcp_t tcp;
	uv_connect_t req;
	struct sockaddr_in client_addr, server_addr;
	int r;
	loop = uv_default_loop();
	
	client_addr = uv_ip4_addr("0.0.0.0", 0);
	server_addr = uv_ip4_addr("119.147.192.101", 25);

	r = uv_tcp_init(loop, &tcp);
	assert(!r);

	uv_tcp_bind(&tcp, client_addr);
	r = uv_tcp_connect(&req, &tcp, server_addr, connect_cb);
	assert(!r);

	uv_run(loop, UV_RUN_DEFAULT);

	return 0;
}


10个值得深入学习的C语言开源项目:从libuv到SQLite的工程实践 在系统编程和底层开发领域,C语言因其高性能和直接硬件操作能力而成为核心工具。其原理在于通过手动内存管理和指针操作实现对计算机资源的精细控制,这种技术价值体现在构建操作系统、嵌入式系统和高性能服务器等关键基础设施中。应用场景广泛覆盖网络通信、数据库引擎和开发工具链。本文聚焦于libuv、SQLite等兼具实用性与教育性的C开源项目,这些项目展示了跨平台异步I/O、数据库引擎实现等关键技术,为工程师提供了从原理到实践的完整学习路径。 阅读详情

相关推荐

C++后端实现高并发邮箱验证码服务:从SMTP、Redis到线程池的完整方案

在Web应用开发中,用户身份验证是保障系统安全的基础环节,邮箱验证码作为一种广泛应用的验证机制,其核心原理是通过生成随机令牌并经由邮件协议发送,实现用户身份绑定与确认。从技术实现层面看,这涉及到网络通信协议、随机数生成、缓存管理和高并发处理等多个关键技术点。其中,SMTP协议负责邮件的可靠传输,而内存数据库如Redis则因其高性能和原生支持过期时间(TTL)的特性,成为存储临时验证码的理想选择。在工程实践中,为了确保服务的高可用与响应速度,通常需要采用异步任务队列或线程池技术,将耗时的邮件发送操作与主业务逻

400

开源免费的C/C++网络库(c/c++ sockets library) 七剑下天山

(1)ACE 庞大、复杂,适合大型项目。开源、免费,不依赖第三方库,支持跨平台。 http://www.cs.wustl.edu/~schmidt/ACE.html   (2)Asio Asio基于Boost开发的异步IO库,封装了Socket,简化基于socket程序的开发。 开源、免费,支持跨平台。 http://think-async.com/   (3)POCO POC...

weixin_33859844的博客 728

TCP、UDP与QUIC协议深度解析:从核心原理到工程实践

传输层协议是网络通信的基石,负责为应用层提供端到端的逻辑通信服务。其核心原理在于在网络层IP协议提供的“尽力而为”传输基础上,通过不同的机制来保证通信质量。TCP协议通过面向连接、确认重传、滑动窗口和拥塞控制等机制,提供了高可靠性的字节流传输,其技术价值在于为HTTP、数据库连接等关键服务提供了稳定保障。UDP协议则采用无连接、不可靠的数据报模型,牺牲可靠性以换取低延迟和高效率,在实时音视频、游戏和DNS查询等场景中不可或缺。随着互联网应用对性能和安全性要求的提升,基于UDP并集成了TLS加密、多路复用和连

weixin_30691871的博客 397

libuv的TCP协议客户端和服务端实现

一.服务端 spdlog记录log不需要的可以直接删除。换成std::cout输出也可以。 #include "tcpService.h" #include <uv.h> #include <iostream> #include <string> #include "spdlogTools.h" uv_tcp_t handle; uv_loop_t* loop; tcpService::tcpService() { } void alloc_cb(uv_handl

m0_49222970的博客 1681

Linux C套接字编程实战:从TCP/UDP到epoll高并发

网络编程是构建分布式系统的基石,其核心在于理解操作系统提供的进程间通信机制。在Linux系统中,套接字(Socket)作为“一切皆文件”理念的延伸,为网络I/O提供了统一的文件描述符抽象,使得开发者可以使用read/write等标准接口操作网络连接。其底层原理基于TCP/IP协议栈,通过三次握手建立可靠连接,或通过UDP实现无连接通信,分别满足不同场景下对可靠性、实时性的需求。这项技术的核心价值在于能够高效、稳定地实现跨网络的数据交换,是开发Web服务器、实时通信、物联网设备等应用的必备技能。在实际应用中,

weixin_30896825的博客 472

树莓派Socket编程实战:从TCP/UDP原理到C语言并发服务器实现

Socket(套接字)是网络通信的基石,它定义了不同主机间进程通信的端点。其核心原理基于客户端-服务器模型,通过IP地址和端口号唯一标识通信双方。Socket API(如Berkeley Sockets)提供了统一的编程接口,屏蔽底层网络协议细节,技术价值在于实现了跨平台、跨语言的标准化网络通信能力,广泛应用于Web服务、文件传输、物联网等场景。在物联网(IoT)和嵌入式开发领域,掌握Socket编程尤为关键,它能将树莓派等设备转变为网络节点。本文以树莓派为硬件平台,深入讲解如何使用C语言实现TCP/UDP

weixin_30889885的博客 390

视频监听安防平台-libuv库通信协议封装-支持udp和tcpserver同时使用

视频监听安防平台-libuv库通信协议封装-支持udp和tcpserver同时使用 最近在上网找资料的时候,看到libuv的通信库挺强大的,而且一直都有人在维护,所有就使用这个通信库做服务端接收和发送,在库封装好之后,发现在接收和发送消息的时候总是卡主了,才发现是使用libuv库的发送的时候出现的问题,果断将发送直接用底层发送,使用socket发送,下面附注一下libuv通信库的源码,希望对大家

视频监控安防平台-国标28181 1842

libuv搭建高并发tcp服务器

采用libuv搭建高并发tcp服务器,对于没有使用libuv经验,或者无并发服务器编写经验的朋友还是有一定难度的,通常面对的问题如下(以linux环境为前提): 1,并发服务器采用什么样的服务器模型?epoll?poll?还是select? 2,选择什么样的并发服务器框架?libevent?libev?还是libuv? 3,如果使用libuv作为服务器框架,其基础框架如何搭建 4,libuv对新手并不友好,尤其是处处回调,何时申请内存,何时释放内存?新手经常碰到内存释放不正确导致程序coredump 5,l

yifan_2020的博客 3906

libuv网络库的TCP服务端与客户端

本人一直在寻找一个跨平台的网络库,boost与ACE比较庞大,不考虑。对比了libevent,libev,libuv后,最终选择了libuv.可libuv文档少,例子也简单,对于tcp只有个echo-server的例子。网上也找过对其封装的例子,如下 libsourcey库,封装了许多库。对libuv的封装跟其他代码耦合比较紧,难为剥离 http://sourcey.com/libuv-

CodeHeng的专栏 1万+

libuv之开启tcp服务端监听,并获得客户端的ip及端口

libuv中处理tcp连接的handle叫做uv_tcp_t,可以认为它是uv_stream_t的子类,所以它是可以当作流来使用的,这篇主要内容不在这,其实主要介绍两个函数 UV_EXTERN int uv_tcp_getsockname(uv_tcp_t* handle, struct sockaddr* name, int* namelen); UV_EXTERN int uv_tc

闻道百 9413

SAP BASIS运维之三方SSL证书导入

事情的起因是我司SAP使用的SSL证书即将要到期了(上一个的SAP BASIS也辞职了),需要进行证书的更换。如上图所示,我司的证书有效期到2024年4月30日到期,需要提前预防并更换,防止过期后导致接口和访问出现问题。9.在弹出的框中,选择我们在第5个步骤中导出的转换结果存储地址,并选择导出的转换文件,点打开。12.最后一步也是关键的一步,不然就会无法更新证书,再点击左上角的个人安全环境,点另存为。10.在打开后的弹窗中,输入我们在第4个步骤中设置的密码。6.经过以上步骤后,我们获得了最终的证书文件。

fegda的专栏 1882

开始使用Dotnetty高性能网络库进行网络通讯

dotnetty。它是.NET平台上的明星网络库,堪比好莱坞明星,颜值高、性能强、可靠性极高。如果你需要在.NET平台上进行高性能、高可靠性、高可扩展性的网络通信,那么就不能错过它啦!

网尘的技术专栏 2039

【BigWorld 游戏服务器引擎】Cell 架构设计介绍,及Java实现方案的探索

横向扩展(Scalability):通过动态增减CellApp和BaseApp的数量,可以轻松应对玩家人数的变化。世界可以做得非常大,只需增加更多的 Cell。负载分离(Load Separation):将不同性质的负载分离,避免了单一进程瓶颈。CPU 密集型的实时计算(CellApp)和 I/O 密集型的数据操作(BaseApp)互不影响。高效的视野管理(AOI):每个 Cell 只关心自己区域内和边界上的实体,大大降低了计算复杂度。容错性:某个CellApp。

代码时光 1203

电感选型不当的代价:从纹波激增到系统失稳的深度剖析

本文深度剖析了电感选型不当对开关电源系统的严重影响。电感值过小会导致纹波电流激增、元件热应力加剧、EMI超标乃至MOSFET击穿;电感值过大则会引起环路响应迟滞、动态性能下降和轻载效率恶化。文章通过实测案例,强调了超越经典公式进行动态与容差考量的必要性,并提供了基于饱和电流、温升电流及环路测试的精准选型方法论,帮助工程师规避从纹波失控到系统失稳的潜在风险。

flink9streamer的博客 406

Ansys Circuit新手必看:IBIS模型导入时,Pin Import和Buffer Import到底怎么选?

本文详细解析了Ansys Circuit中IBIS模型导入时Pin Import与Buffer Import的选择策略,帮助SI/PI工程师根据仿真需求做出正确决策。通过对比两种方式的特性差异和应用场景,提供实用的选择指南和性能优化建议,提升信号完整性仿真效率。

weixin_26846533的博客 258

C++实现QQ域名封禁检测工具:原理、开发与优化指南

在网络应用开发与运维中,自动化监控是保障服务可用性的关键技术。其核心原理在于通过程序模拟客户端请求,获取并解析服务器响应,从而实现对目标状态的实时感知。这种技术对于链接推广、社群运营及机器人开发等领域具有重要价值,能有效避免因域名被封禁导致的流量损失。本文聚焦于QQ生态下的特定应用场景,详细阐述了如何利用C++的高效特性与cURL库的网络能力,构建一个稳定可靠的域名封禁状态检测工具。通过模拟QQ客户端的请求过程,该工具能够自动化、批量化地完成检测任务,并支持集成到后台服务中实现7x24小时不间断监控,为开发

weixin_30407613的博客 397

51单片机也能玩转信号发生器?手把手教你用DAC0832和LM358输出四种标准波形

本文详细介绍了如何使用51单片机和DAC0832芯片搭配LM358运放,自制低成本信号发生器,实现正弦波、矩形波、三角波和锯齿波四种标准波形的输出。从硬件选型、电路设计到编程实现,手把手教你完成这一实用电子项目,总成本不到50元,适合电子爱好者和学生实践。

weixin_30530939的博客 551

Python 学习 ---> 模块、pypi ( 模块库 )、添加模块路径

什么是 模块 在 Python 中,一个.py文件就是一个模块(Module)。模块的名字就是文件的名字。在模块内部,通过全局变量__name__可以获取模块名(即字符串) 模块作用 为了实现代码的复用,通常会把一些其他程序中重用的代码拿出来单独放在一个程序文件中,

freeking101的博客 3480

二叉树三种遍历(动态图+代码深入理解)

文章目录一、图示理解(图片是一位前辈所留,在此感谢)1、先序遍历2、中序遍历3、后序遍历4、层序遍历二、深入理解三种遍历让我们来理解一下绕着外围跑一整圈的真正含义是:遍历所有结点时,都先往左孩子走,再往右孩子走。下面做一个实例吧三、代码实现加以理解以下是C语言全部代码实现下面是同样的例子用c++实现,大家可以参考一下 一、图示理解(图片是一位前辈所留,在此感谢) 1、先序遍历 先序遍历可以想象成,...

流楚丶格念的博客 3万+

一文吃透 SAP HANA Service Broker:原理、架构与落地实践

摘要:SAP HANA Service Broker 作为云原生开发的关键组件,通过标准化流程管理 HDI 容器与服务实例的生命周期,实现数据库资源的自动化配置与安全隔离。它采用服务目录、服务计划和绑定机制,将连接凭据注入应用环境变量,避免硬编码风险。在实际应用中,需根据模块生命周期决定共享或隔离容器,并通过跨容器访问模式实现安全数据共享。典型案例展示了电商平台的多模块协同与SaaS租户隔离场景,验证了其在提升运维效率与安全合规方面的价值。最佳实践强调以生命周期划边界、最小权限原则和HTTPS安全传输,为企

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

实战指南:基于Docker的GitLab CI/CD一站式环境构建

本文详细介绍了基于Docker的GitLab CI/CD一站式环境构建实战指南,涵盖从基础环境准备到高级优化技巧的全流程。通过容器化部署GitLab和Runner,实现自动化构建、测试和部署,显著提升开发效率。特别适合中小型团队快速搭建持续集成/持续交付环境。

weixin_30879169的博客 775

【Python3教程】Python3高级篇之uWSGI 安装配置

本文介绍了在Python 3环境中安装和配置uWSGI的完整流程,涵盖基本安装、Flask/Django应用部署、Nginx集成以及systemd管理等关键环节。主要内容包括:uWSGI的安装前提条件,创建简单WSGI应用,编写uWSGI配置文件(.ini格式),与Nginx配合实现生产环境部署,以及使用systemd实现服务管理。文章还提供了常见Web框架(Flask、Django)的部署示例和高级配置建议,如负载均衡、HTTPS设置等。最后列出了权限、端口占用等常见问题的解决方案,为开发者提供了一套完整

No8g攻城狮的博客 436

Node.js与Rails框架选型实战:基于请求生命周期与团队能力的决策模型

Web应用后端框架选型本质上是I/O模型、并发范式与工程效能的系统性权衡。Node.js依托事件循环与非阻塞I/O,在高并发、低延迟、实时交互场景中具备天然优势;Rails则凭借约定优于配置与成熟ORM,在业务逻辑复杂、交付周期紧张的MVP阶段显著降低认知负荷。其技术价值不仅体现于QPS或内存占用等静态指标,更在于对数据库连接池管理、N+1查询抑制、事务边界定义、微服务拆解成本等真实工程挑战的应对能力。典型应用场景包括实时协作系统、IoT设备接入网关、高吞吐API中台,以及需要快速验证商业模式的SaaS后台

weixin_30614109的博客 442

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

使用libuv写的tcp server

首次接触libuv,根据官方文档写的一个tcp server demo,记录一下

kelvin_feng的专栏 6431

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

上一篇: 基于libuv的TCP echo-server
下一篇: debian安装国际版QQ中的一些问题记录
smallmelon
博客等级 码龄16年 22粉丝 50原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值