0

0

使用Socket发送邮件

不言

不言

发布时间:2018-04-26 14:40:52

|

2299人浏览过

|

来源于php中文网

原创

本篇文章是介绍关于使用Socket发送邮件,现在分享给大家,有兴趣的朋友可以看一下

之前写过一篇《使用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 25S: 220 esmtp4.qq.com Esmtp QQ Mail ServerC: HELO smtp qq.comS: 250 esmtp4.qq.comC: AUTH loginS: 334 VXNlcm5hbWU6C: 这里输入使用base64加密过的用户名S: 334 UGFzc3dvcmQ6C: 这里输入使用base64加密过的密码
S:235 Authentication successfulC: MAIL FROM:S: 250 sender  OKC: RCPT TO:S: 250 recipient  OKC: DATAS: 354 Enter mail,end with "." on a line by itselfC: This is example from smtp protocolC:.S: 250 message sentC: QUITS: 221 goodbye

本来想用qq邮箱发邮件,但是qq邮箱开启SMTP后页面老是出错,使用163邮箱可以正常发送邮件,邮箱需开启POP3/SMTP服务。
代码:
smtp_mail.php

host=$host;        $this->port=$port;        $this->user=$user;        $this->pwd=$pwd;        $this->mail_format=$mail_format;        $this->debug=$debug;        //连接SMTP服务器
        /**
         * fsockopen() 初始化一个套接字连接到指定主
         * 最后一个参数为timeout,连接时限
         */
        $this->sock=fsockopen($this->host,$this->port,$errno,$errstr,10);        if (!$this->sock){//连接失败
            exit("Error number: $errno, Error message: $errstr\n");
        }        //取得服务器信息
        $response=fgets($this->sock);        //若包含220,表示已经成功连接到服务器
        if (strstr($response,"220")===false){//首次出现地址|false
            exit("Server error: $response\n");
        }
    }    //将命令发送到服务器,然后取得服务器反馈信息,判断命令是否执行成功
    private function do_command($cmd,$return_code){
        fwrite($this->sock,$cmd);        $response=fgets($this->sock);        if (strstr($response,"$return_code")===false){            $this->show_debug($response);            return false;
        }        return true;
    }    //发送邮件
    public function send_mail($from,$to,$subject,$content){        //判断收发件邮箱地址是否合法
        if (!$this->is_email($from) or !$this->is_email($to)){            $this->show_debug('Please enter valid from/to email.');            return false;
        }        //判断主题内容是否为空
        if (empty($subject) or empty($content)){            $this->show_debug('Please enter subject/content.');            return false;
        }        //整合邮件信息,发送邮件主体时要以\r\n.\r\n作为结尾
        $detail="From:".$from."\r\n";        $detail.="To:".$to."\r\n";        $detail.="Subject:".$subject."\r\n";        if ($this->mail_format==1){            $detail.="Content-Type: text/html;\r\n";
        }else{            $detail.="Content-Type: text/plain;\r\n";
        }        $detail.="charset=utf-8\r\n\r\n";        $detail.=$content;        //此处应该有判断命令是否执行成功
        $this->do_command("HELO smtp.qq.com\r\n",250);        $this->do_command("AUTH LOGIN\r\n",334);        $this->do_command("$this->user\r\n",334);        $this->do_command("$this->pwd\r\n",235);        $this->do_command("MAIL FROM:<".$from.">\r\n",250);        $this->do_command("RCPT TO:<".$to.">\r\n",250);        $this->do_command("DATA\r\n",354);        $this->do_command($detail."\r\n.\r\n",250);        $this->do_command("QUIT\r\n",221);        return true;
    }    //判断是否为合法邮箱
    private function is_email($emial){        if(filter_var($emial,FILTER_VALIDATE_EMAIL)){            return true;
        }else{            return false;
        }
    }    //显示调试信息
    private function show_debug($message){        if ($this->debug){
            echo "

Debug: $message


"; } } }

index.php

Ai Mailer
Ai Mailer

使用Ai Mailer轻松制作电子邮件

下载
send_mail($from,$to,$subject,$content);

   相关推荐:

php实现发送16进制socket的方法

php实现socket的方法

实例详解php的socket编程

相关专题

更多
C++ 高级模板编程与元编程
C++ 高级模板编程与元编程

本专题深入讲解 C++ 中的高级模板编程与元编程技术,涵盖模板特化、SFINAE、模板递归、类型萃取、编译时常量与计算、C++17 的折叠表达式与变长模板参数等。通过多个实际示例,帮助开发者掌握 如何利用 C++ 模板机制编写高效、可扩展的通用代码,并提升代码的灵活性与性能。

10

2026.01.23

php远程文件教程合集
php远程文件教程合集

本专题整合了php远程文件相关教程,阅读专题下面的文章了解更多详细内容。

29

2026.01.22

PHP后端开发相关内容汇总
PHP后端开发相关内容汇总

本专题整合了PHP后端开发相关内容,阅读专题下面的文章了解更多详细内容。

21

2026.01.22

php会话教程合集
php会话教程合集

本专题整合了php会话教程相关合集,阅读专题下面的文章了解更多详细内容。

21

2026.01.22

宝塔PHP8.4相关教程汇总
宝塔PHP8.4相关教程汇总

本专题整合了宝塔PHP8.4相关教程,阅读专题下面的文章了解更多详细内容。

13

2026.01.22

PHP特殊符号教程合集
PHP特殊符号教程合集

本专题整合了PHP特殊符号相关处理方法,阅读专题下面的文章了解更多详细内容。

11

2026.01.22

PHP探针相关教程合集
PHP探针相关教程合集

本专题整合了PHP探针相关教程,阅读专题下面的文章了解更多详细内容。

8

2026.01.22

菜鸟裹裹入口以及教程汇总
菜鸟裹裹入口以及教程汇总

本专题整合了菜鸟裹裹入口地址及教程分享,阅读专题下面的文章了解更多详细内容。

55

2026.01.22

Golang 性能分析与pprof调优实战
Golang 性能分析与pprof调优实战

本专题系统讲解 Golang 应用的性能分析与调优方法,重点覆盖 pprof 的使用方式,包括 CPU、内存、阻塞与 goroutine 分析,火焰图解读,常见性能瓶颈定位思路,以及在真实项目中进行针对性优化的实践技巧。通过案例讲解,帮助开发者掌握 用数据驱动的方式持续提升 Go 程序性能与稳定性。

9

2026.01.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
进程与SOCKET
进程与SOCKET

共6课时 | 0.3万人学习

golang socket 编程
golang socket 编程

共2课时 | 0.1万人学习

swoole入门物联网开发与实战
swoole入门物联网开发与实战

共15课时 | 1.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号