简单邮件传输协议SMTP

很多应用都需要发送邮件的功能。在PHP中自带一个mail()函数,但如果想通过mail()函数发送邮件,必须先安装SMTP服务器。如果不想安装SMTP邮件服务器,却想发送邮件,这时,Socket就派上用场了。可以使用Socket连接一个已有的邮件服务器,如163提供的SMTP服务器,然后用它发送邮件。

1. SMTP协议概述
SMTP(Simple Mail Transfer Protocol,简单邮件传输协议)是由源地址到目的地址传送邮件的一组规则,用来控制信件的中转方式。SMTP协议属于TCP/IP协议族,它使每台计算机在发送或中转信件时能找到下一个目的地。通过使用指定的服务器,把Email寄到收信人的服务器上。

SMTP服务器是遵循SMTP协议的邮件服务器,用来发送或中转电子邮件。首先,客户端需要建立一个与SMTP服务器的TCP连接,端口一般为25。在连接建立之后,客户端和服务器先执行一些应用层的握手操作,让SMTP服务器知道客户端的信息,并且对客户端需求做出响应等。

在SMTP握手阶段,客户端向SMTP服务器分别指定发件人和收件人的电子邮件地址。握手阶段完毕,SMTP服务器把客户端发出的邮件消息添加到发信队列中,通过TCP提供的可靠数据传输服务把该消息准确地传送到收件人的服务器。

连接和发送过程如下:
(1)建立TCP连接。
(2)客户端发送HELO命令以标识发件人自己的身份,客户端发送MAIL命令。服务器以OK作为响应,表明准备接收。
(3)使用AUTH命令登录SMTP服务器,输入用户名和密码(注意,用户名和密码都需要base64加密)。
(4)客户端发送RCPT命令,标识该电子邮件的计划接收人,可以有多个RCPT行。服务器以OK作为响应,表示愿意为收件人发送邮件。
(5)协商结束后,使用DATA命令发送。
(6)以 . 号表示结束,输入内容一起发送出去,结束此次发送,用QUIT命令退出。

2. SMTP协议应用:使用Socket发送邮件
SMTP协议建立在TCP协议之上,所以原则上按照SMTP协议的规范,使用Socket跟SMTP服务器进行交互。下面使用PHP的Socket实现发送邮件的功能。本例中使用fsockopen()函数代替socket_*()系列函数。
fsockopen()函数的好处是把Socket连接绑定到一个流上,然后使用各种操作流的函数操作这个Socket连接。fsockopen()函数创建的Socket连接句柄可以提供给诸如fgets()、fputs()、fwrite()、fread()、fclose()等流函数使用。

下面封装一个发送邮件的类Smtp.php文件,按照SMTP协议实现,代码如下:
SMTP发送邮件测试,新建一个test_mail.php,代码如下:
在浏览器中,访问该php测试文件,就可以发送邮件了。
可以看出,原本单纯依靠PHP无法完成的任务,结合Socket就可以轻而易举地实现。有人会问:PHP与C语言怎么交互?你可能会想到用C语言写PHP扩展,或者使用exec、system等命令,但是,为什么不换一个思路呢?比如,用C语言提供服务,用PHP请求这个服务,PHP就能借助C语言完成许多看似不可能的任务。现在流行的WebGame就是利用C、Java等重量级语言在底层完成复杂的运算,通过Socket把接口提供给PHP使用。

你可能感兴趣的:(smtp,简单邮件传输协议)