关注《一碳科技》,获取更多知识!

前言

相信大家都有过被C语言网络编程所支配的恐惧吧?其实,小编在刚刚学习这方面的知识的时候也有这样的感受,并且所有的资料都是从网络寻找的,但是,现在你们不同了,因为这篇文章将会带你们一步步地,写出你们第一个使用SMTP协议来发送邮件的C语言程序,这个和小编刚学习的时候可不同呀!

文章末尾有总结,这是精髓哦

言归正传,代码写起来!

首先,这篇文章不是讲理论的文章,而是让你们动手实践的文章,目的在于让各位看官能动手写出能编译成功、能成功运行、能成功发送邮件的C语言程序,这篇文章不会涉及太多的理论知识,并且代码也没有经过特别的封装,旨在让各位看官能编写出这个程序,所以看官跟着文章动手做就可以了。

第一步

首先,引用stdio.h、winsock2.h、windows.h(可有可无,下文讲到),注意,这里有一个地方有很多人会出错,如果你要引用windows.h的话,就得在引用winsock2.h之后才能引用windows.h,否则会出现“未定义标识符”的情况,如下图↓

这是正确写法

错误写法

按照错误写法进行调试的话,会出现以下错误提示↓

然后我们再声明一个变量和两个函数,变量是用来储存服务器返回的数据的,两个函数分别是用来创建套接字(socket)和接收服务器返回数据的,这里我们声明了一个字符型数组,数组大小我们用BUFSIZ代替,这里有人就会问了:“为什么用BUFSIZ作为数组大小呢?”,答案是:“减轻系统负担”,不理解?没关系,先把代码运行起来,然后再慢慢研究。

除了以上步骤,我们还需要写入以下两行代码,加入两个库文件,其中User32.lib是可有可无的,加入User32.lib只是为了能够调用MessageBox()函数而已。

到这里,我们的第一步完成了!接下来是第二步

第二步

初始化

前期的准备工作做好了,我们现在开始编写我们要用到的函数——socket_connect_server(void),从字面的意思上来看,大家都应该明白这个函数是干嘛的吧?没错,它是用来创建套接字并连接SMTP服务器的。

我们要创建一个套接字,初始化完成后,我们要把它记在某个地方,要不然“忘记”了怎么办?所以我们要声明一个变量来存放套接字初始化后的数据——WSADATA wd,wd就是用来存放这些数据的变量。

好了,我们用到的主要变量已经声明完毕,接下来要初始化,我们要向编译器说明,我们要用到Ws2_32.lib和Winsock2.h中的哪个库文件(简单来说就是初始化而已),如图,代码可以这么写↓

创建套接字

开始创建socket,这里我们要用到socket()函数,socket()需要三个参数,但是一般情况下,按照图中的代码写也是可以的,所以,这行代码各位看官照抄就行了!其实,这三个参数很容易理解,这里就不“搬书”了。

输入服务器信息

这里解释一下inet_addr()函数,它的功能是将一个点分十进制的IP转换成一个长整数型数(u_long类型),说白了,就是数据类型转换,将IP地址的数据类型成能够存到addr这个结构体的数据类型。

还有一个htons()函数,它的作用是将括号里面的数值,转化成网络字节顺序(TCP/IP中规定数据表现形式),简单点讲,就是将括号里面的数值转化成另一种表现形式。

连接服务器

套接字有了,服务器也有了,接下来要干嘛呢?那就是连接服务器!连接服务器我们要用到connet()函数而不是bind()函数,这里简单的记一下“connet()用在客户端,bind()用在服务器”。

这里跟大家说一下,connet()函数其中第一个参数是SOCKADDR类型,而我们这里为什么用SOCKADDR_IN类型呢?请看下图↓

SOCKADDR_IN强制转换成SOCKADDR类型

图中的代码将smtp邮箱IP地址存放在SOCKADDR_IN的S_addr成员中,然后再将端口号放在sin_port成员中,分开进行,而SOCKADDR就不一样了,它将IP地址和端口号一起放在sa_data[14]这个成员中,这样看来SOCKADDR是一种通用的套接字地址,SOCKADDR_IN是internet环境下套接字的地址形式。说白了,就是“SOCKADDR_IN更适合用于网络编程”,记住这句话就对了!

第三步

就是我们的recv_show()函数,这个函数比较简单,这里就不多说了,照抄!

服务器已经连接了、接收数据并打印的函数也有了,接下来就是按照SMTP协议发送数据

这里会用到send()函数,它有三个参数,分别是已连接的socket、发送的字符串、发送字符串长度、调用执行方式(一般为0)。

代码书写示例:send(socket_use,"发送的数据\r\n",strlen("发送的数据\r\n"),0),为什么后面会有\r\n?这个跟SMTP协议有关,\r\n与CMD命令行发送邮件时的“回车”效果一样。

注意:

发送的账号、密码要通过base64加密,不会如何加密?那么,请百度搜索:“base64”发送和接收的邮箱要开启smtp服务!发件人和收件人可以是同一个邮箱发送邮件的最后三行语句特别重要,注意格式(文章末尾有)

接下来就是按照SMTP协议来发送数据和接收数据了

如图,参照CMD命令通过SMTP协议发送邮件的实例,来写C语言发送邮件的代码↓

CMD发送邮件的过程

举个例子,我们第一步要发送“helo 163.com”,那么,我们用C语言发送是这样的,send(socket_use,"helo 163.com\r\n",strlen("helo 163.com\r\n"),0),按照这行代码,以此类推写下去,然后再用recv_show()输出服务器应答的信息。

注意这三行C语言代码,跟CMD发邮件过程对比以下↓

最后

这是程序运行之后的结果

以下是全部代码↓

图片难以查看?那就关注《一碳科技》,私信我们拿源码哦!

举报/反馈

如何用c语言编写发邮件程序,想学C语言发邮件程序?5分钟教会你:附送源码+教学!...相关推荐

  1. 自动发邮件的程序 c语言,5分钟!教你用C语言发送邮件:附送源码+教学!

    5分钟!教你用C语言发送邮件:附送源码+教学!-1.jpg (10.71 KB, 下载次数: 0) 2018-9-3 02:21 上传 关注<一碳科技>,获取更多知识! 前言 相信年夜家都 ...

  2. C语言使用1到9求出所有k个数字的所有组合的算法(附完整源码)

    C语言使用1到9求出所有k个数字的所有组合的算法 C语言使用1到9求出所有k个数字的所有组合的算法完整源码(定义,实现,main函数测试) C语言使用1到9求出所有k个数字的所有组合的算法完整源码(定 ...

  3. c语言练习的软件,我想学C语言,在自己的电脑上练习,要安装什么软件呢?

    希望能对你有所帮助: 1. C语言学习系统 3.2 C语言是一门非常有用高级语言,是您踏上计算机学习之路的必修课,几乎所有的计算机考试 dl.pconline.com.cn/html/1/9/dlid ...

  4. 三菱R系列PLC程序 全部采用ST语言编写,内部使用函数块和结构体,程序思路清晰

    三菱R系列PLC程序 全部采用ST语言编写,内部使用函数块和结构体,程序思路清晰,简洁明了. 通过结构体和函数块的使用,可以使您在程序编写水平得到很大提高. ST语言是PLC后续的主流语言,是日后编程 ...

  5. 编程行业高手级别必学C语言,要挣大钱必学C语言,要做黑客、红客必学C语言,要面试名企、外企、高薪职位必学C语言。

    于大部分程序员, C语言 是学习 编程 的第一门语言,很少有不了解C的程序员. C语言除了能让你了解编程的相关概念,带你走进编程的大门,还能让你明白程序的运行原理,比如,计算机的各个部件是如何交互的, ...

  6. 有没有c 或c语言的短期培训学校,根河学c语言编程,根河学c语言编程的学校,根河学c语言编程报个培训班怎么样...

    根河学c语言编程,根河学c语言编程的学校,根河学c语言编程报个培训班怎么样 首页 > 软件 > 根河学c语言编程 作者:镀金池   发布时间:2017-11-30 11:02 另外,尽早调 ...

  7. C语言课设-----工资管理系统(附全部源码)

    C语言课设-----工资管理系统(附全部源码) 本系统分三个部分: 1.出售金鱼 2.数字菱形 3.工资管理系统 (ps:另外添加了登录界面 id:qwq password:123 可自己在代码里再更 ...

  8. Python语言打造智能语音助手——附完整源码

    Python语言打造智能语音助手--附完整源码 随着智能家居.智能办公等领域的逐渐兴起,实现语音控制与交互已成为了一种趋势.而Python语言是一门极具魅力的编程语言,其强大的库.简洁的语法以及易于学 ...

  9. SpringBoot+Mysql+小程序实现的美团外卖美食小程序系统附带前台和后台代码整套源码包运行(问题解答)

            博主介绍:✌在职Java研发工程师.专注于程序设计.源码分享.技术交流.专注于Java技术领域和毕业设计✌ 项目名称 SpringBoot+Mysql+小程序实现的美团外卖美食小程序系 ...

最新文章

  1. Python学习笔记(二)——HelloWorld
  2. 关于centos docker版本过低导致 is not a valid repository/tag: invalid reference format
  3. 通过 crontab将linux中的top信息写入文件中
  4. oracle 给表空间改名,Oracle重命名表空间和删除表空间
  5. python虚拟环境管理工具_Python虚拟环境和包管理工具Pipenv的使用详解--看完这一篇就够了...
  6. Postico —— OS X 上的免费 PostgreSQL 客户端
  7. ARTS打卡计划第6周-REVIEW-超越编码的避免项目失败的软技能
  8. centos7.0 安装vsftp实录
  9. 浅谈FTP服务的几个知识点
  10. Linux正确查看内存占用
  11. [病毒木马] 什么是LSP劫持
  12. Linux安装JDK11
  13. 微信小程序获取用户信息及手机号授权的流程
  14. matlab绘制一般计算时间函数的曲线
  15. 后盾人tp5教程_5个出色的应用程序以开放数据为后盾
  16. CF838D Airplane Arrangements
  17. 读书笔记《深度学习与图像识别原理与实践 大白话讲解对小白易懂》2022-8-5
  18. 小程序scroll-view,滚动到最低_小程序滚动到底部
  19. ROS暑期学校与ROSCon 2018
  20. python 爬去拉钩测试招聘信息

热门文章

  1. css+js解决文本两端对齐以及分散对齐
  2. 给 FreeBSD 12.1 安装 GNOME3 图形界面
  3. ruby on rails win下安装
  4. 了解react-hook以及State Hook
  5. VB.NET excel 列排序
  6. 南京邮电大学微型计算机原理与接口技术实验,南京邮电大学《微机原理与接口技术》上机实验参考答案(四次全).pdf...
  7. G. Good Key, Bad Key(暴力)
  8. Kali社会工程学套件入侵Windows
  9. 服务器响应551,为什么输出fi上的ftp响应551错误
  10. 什么是网络爬虫以及通用爬虫和聚焦爬虫的介绍