之前写过一篇《使用PHP发送邮件》,方法是利用nette/mail组件发送邮件。
以下内容整理自《PHP核心技术与最佳实践》。
PHP有一个自带的mail()函数,但是要想使用SMTP协议发送邮件,需要安装SMTP服务器。如果不想安装,可以使用Socket发送邮件。SMTP协议建立在TCP协议之上,所以原则上按照SMTP协议的规范,使用Socket跟SMTP服务器进行交互。
SMTP连接与发送过程如下:
1)建立TCP连接。
2)客户端发送HELO命令以标识发件人自己的身份,客户端发送MAIL命令。服务器以OK作为响应,表明准备接收。
3)使用AUTH命令登陆SMTP服务器,输入用户名和密码(注意,用户名和密码都需要base64加密)。
4)客户端发送RCPT命令,标识该电子邮件的计划接收人,可以有多个RCPT行。服务器以OK作为响应,表示愿意为收件人发送邮件。
5)协商结束后,使用DATA命令发送。
6)以”.”号表示结束,输入内容一起发送出去,结束此次发送,用QUIT命令退出。
例如,使用Telnet创建一个SMTP会话,其中S代表服务器,C代表客户端,代码如下:
C: open smtp.qq.com 25
S: 220 esmtp4.qq.com Esmtp QQ Mail Server
C: HELO smtp qq.com
S: 250 esmtp4.qq.com
C: AUTH login
S: 334 VXNlcm5hbWU6
C: 这里输入使用base64加密过的用户名
S: 334 UGFzc3dvcmQ6
C: 这里输入使用base64加密过的密码
S:235 Authentication successful
C: MAIL FROM:<liexusong@qq.com>
S: 250 sender <liexusong@qq.com> OK
C: RCPT TO:<liexusong@163.com>
S: 250 recipient <liexusong@163.com> OK
C: DATA
S: 354 Enter mail,end with "." on a line by itself
C: This is example from smtp protocol
C:.
S: 250 message sent
C: QUIT
S: 221 goodbye
本来想用qq邮箱发邮件,但是qq邮箱开启SMTP后页面老是出错,使用163邮箱可以正常发送邮件,邮箱需开启POP3/SMTP服务。
代码:
smtp_mail.php
<?php
class smtp_mail{
private