socket编程之使用socket发送电子邮件(PHP)
发布日期:2021-09-30 04:14:35 浏览次数:2 分类:技术文章

本文共 4133 字,大约阅读时间需要 13 分钟。

我们知道,PHP发送邮件有两种方式,一个是mail()函数,另一个就是socket发送邮件。对于第一种方式,我不多做介绍,因为它的用法相对简单,只是说可能需要配置的东西比较多。详细可参加PHP文档。这里,我主要谈谈第二种方式。

 

讲到第二种方式,我首先要谈谈发送邮件的原理。

 

发送邮件是基于客户/服务器模式的,也就是说,客户端首先需要向服务器端发送连接请求,当双方连接后,再进行数据的传输,与此同时,我们又不能随便的进行传输,而是要遵守一定的规则,这里所说的规则我们称之为协议。

在邮件系统中,主要涉及三种协议,SMTP,POP3,MIME,我们这里谈前两种;

SMTP协议:简单文件栓出协议,发送邮件使用的协议;

POP3:接收邮件协议。

 

 

 

上面的实体图正是发送邮件的原理示意图。通常我们发送邮件给另一个好友,并非直接把邮件发送到对方的客户机上。它实际上是先发送到了发送方的邮件服务器,然后发送方的邮件服务器将邮件发送到接收方的邮件服务器,收件人再从接收方的邮件服务器中获得所需邮件。举个例子来说,我们有一个163邮箱,邮件地址是hl@163.com;现在我要向145642@qq.com的邮箱中发一封邮件。实际的发送流程为,我们在在客户端使用客户端代理(如outlook)编辑好邮件,然后点击发送,这时邮件便会发送到163的邮件服务器,163邮件服务器在合适的时间会将邮件发送到QQ的邮件服务器,QQ邮件服务器接收到邮件后,根据收件人地址,会通知收件人,这时,收件人便可以从QQ邮件服务器获得邮件。大致的原理就是这样,当然,内部的工作原理还是很复杂的。

再来谈谈发送邮件的过程中所涉及的协议。我们从客户代理将邮件发送到发送放邮件服务器时,使用的是SMTP协议,发送方邮件服务器讲邮件发送到接收方邮件服务器时,使用的也是SMTP协议。当接收方代理从接收方邮件服务器获得邮件时,使用的是POP3协议,总之一句话,发送使用SMTP协议,接收使用POP3协议。

 

而我们这里要讨论的socket发送邮件,实质上就是自己编写代码取代发送方邮件代理的功能,自己将邮件发送到发送方邮件服务器中,讲到这里,大家有点明白了吧。

 

下面,讨论具体实现:

由于我们只是关心如何发送邮件,而不需要关心接收方如何获得邮件,因此,我们在编写的代码就是如何实现SMTP。

SMTP分为命令头和信息体两部分。命令头主要完成客户端和服务器的连接,验证等。整个过程由多条命令组成。每个命令发送到服务器后,由服务器给出相应信息,一般为3位数字的响应码和响应文本。每个命令及响应的最后都有一个回车符,这样使用fputs和fgets就可以进行响应的处理了。

 

客户端向邮件服务器发出的一些常用的SMTP指令为:

HELO hostname 与服务器打招呼并且告知服务器客户端使用的机器名,这里可以随便填写;

AUTH LOGIN:user,pass 邮箱帐号,密码

MAIL FROM:sender 告诉邮件服务器发信人的地址;

RCPT TO:receiver 告诉邮件服务器收信人的地址;

DATA 开始发送邮件内容,并且最后只能含有"."为结尾字符的行结束。

QUIT 传输结束,退出连接;

 

客户端每发一条命令,服务器便会返回相应的相应信息,信息格式为(响应码+空格+解释)

一些常见的相应码为:

220 服务就绪(socket返回)

221 正在处理

250 请求邮件动作成功(HELO MAIL FROM,RCPT TO,QUIT指令成功后会返回此状态码)

354 开始发送数据,以“.”结束(DATA 指令执行成功后会返回此信息);

500 语法错误,命令不能识别

550 命令不能执行,邮箱无效

 

而我们使用socket发送邮件是指上就是通过客户端向邮件服务器发送以上的命令,从而实现SMTP协议来达到发送邮件的目的。实质上outbllook之类的客户端邮件代理发送邮件原理和我们要实现的代码是一样的,只是它们将这些操作都封装好,然后提供了一个友好的界面供我们操作。

下面是我实现的代码(有详细注释):网上有很多封装好了的比较完整的发送邮件类,我只是粗略实现了它的功能,还有很多没有实现,因此,这里只供参考:

 

下面,我们就可以发送邮件了:

 

可以看到,实质上使用socket发送邮件是很简单的,其中最关键的地方是我们要理解邮件发送的原理。

 

 

 

 

转载地址:https://blog.csdn.net/huli870715/article/details/6457722 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:在smarty模板中调用PHP自定义函数(从smarty2到smarty3)
下一篇:JS判断浏览器类型,获得浏览器版本号

发表评论

最新留言

关注你微信了!
[***.104.42.241]2024年04月10日 21时36分35秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

转:【答学员问】有什么经验教训,是你在面试很多次之后才知道的? 2019-04-27
消息队列:解耦、异步、削峰,现有MQ对比以及新手入门该如何选择MQ? 2019-04-27
【奇技淫巧】-- 三角形最小路径和 2019-04-27
【小技巧】argc和argv的用法 2019-04-27
学不下去了怎么办? 2019-04-27
二叉树的前中后序遍历(迭代法)(带动画) 2019-04-27
【小技巧】【XShell】【Xftp】Windows桌面与Linux虚拟机互传文件 2019-04-27
【redis入门】Centos下安装redis 2019-04-27
【redis入门】redis安装后相关知识串讲 2019-04-27
【redis】来吧,展示一下redis 发布-订阅模式 2019-04-27
讲通C/C++预编译/条件编译指令 #ifdef,#ifndef,#endif,#define,… 2019-04-27
【redis6.0.6】redis源码慢慢学,慢慢看 -- 第二天:空间配置(zmalloc) 2019-04-27
当下热点词再学:redis缓存预热、更新、降级,限流 2019-04-27
【redis6.0.6】redis源码慢慢学,慢慢看 -- 第五天:adlist 2019-04-27
别抖,OK? 操作系统抖动现象、网络抖动与延迟、函数抖动之防抖与节流,串讲 2019-04-27
第六天:网络处理(anet部分)-- redis源码慢慢学,慢慢看【redis6.0.6】 2019-04-27
通过域名获取主机IP -- struct addrinfo 2019-04-27
【C++】算法集锦(8):从两数和问题拓展到一百数和问题 2019-04-27
【C++】算法集锦(9):背包问题 2019-04-27
【C++】算法集锦(10)通俗讲kmp算法 2019-04-27