PHP用socket连接SMTP服务器发送邮件

PHP用socket连接SMTP服务器发送邮件学习实验记录:

分析与SMTP会话的一般流程
1. HELO XXX \r\n //XXX就是自己起个名字,和服务器打个招呼
返回 250 表示成功
2. AUTH LOGIN \r\n //请求与服务器开始验证用户(登陆)
返回 334 表示成功
3. 用户名 \r\n //直接发送用户名PHP中将用户名base64_encode()下
返回 334 表示成功
4. 密码 \r\n //直接发送密码PHP中将密码base64_encode()下
返回235表示成功
5. MAIL FROM \r\n //发件人邮箱地址,一般和上面的用户名密码对应的油箱
返回 250 表示成功
6. RCPT TO \r\n //收件人地址
返回 250 表示成功
7. DATA \r\n //告诉服务器下面开始传输邮件
返回 354 表示成功
8. 传输邮件数据:可以发送邮件了,格式为
From:回信人地址 \r\n //貌似可以写别人的,嘿嘿
Subject:邮件标题 \r\n
To:收件人地址 \r\n
\r\n
正文数据 \r\n
以这个格式发送至服务器,返回250表示发送成功
9. QUIT \r\n 断开连接
返回 221 表示成功
PHP实验程序如下:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>mail</title>
</head>
<body>
<?php
//以QQ邮箱为例子,要先开通SMTP/POP3功能
$smtp="smtp.qq.com";   //SMTP邮件发送服务器
$title="标题";     //邮件标题
$username="qq邮箱帐户";   //SMTP用户名
$passwd="邮箱密码";   //SMTP密码
$mailfrom="qq邮箱帐户下的地址,也就是自己的QQqq邮箱地址,不能填别人的"; //发送人
$mailfrom1="别人点回复邮件将回复到此回复邮箱中,可以填写别人的";        //回复邮件人
$rcptto="收件箱地址"; //收件人
$mail="邮件内容";     //邮件正文
 
smail($smtp,$title,$username,$passwd,$mailfrom,$mailfrom1,$rcptto,$mail);
 
function smail($smtp,$title,$username,$passwd,$mailfrom,$mailfrom1,$rcptto,$mail){
$message="";
$message .= "正在连接服务器...<br>";
$link = fsockopen($smtp,25);
if ($link){
 set_socket_blocking($link,true);
 $lastmessage=fgets($link,512);
 
 if (!ereg("^220",$lastmessage)){
  $message .= "与服务器连接失败" . $lastmessage . "<br>";
 }
 else{
  $message .= "与服务器连接成功,服务器就绪:" . $lastmessage . "<br>";
 
  fputs($link,"HELO phpsetmail"."\r\n");
  $lastmessage=fgets($link,2000);
  if (ereg("^250",$lastmessage)){
   $message .= "与服务器HELO成功:" .$lastmessage. "<br>";
  }
  else{
   $message .= "与服务器HELO失败:" .$lastmessage. "<br>";
  }
 
  fputs($link,"AUTH LOGIN"."\r\n");
  $lastmessage=fgets($link,2000);
  if (ereg("^334",$lastmessage)){
   $message .= "请求与服务器进行用户验证成功:" .$lastmessage. "<br>";
  }
  else{
   $message .= "请求与服务器进行用户验证失败:" .$lastmessage. "<br>";
  }
 
  fputs($link,base64_encode($username)."\r\n");
  $lastmessage=fgets($link,2000);
  if (ereg("^334",$lastmessage)){
   $message .= "与服务器用户验证成功:" .$lastmessage. "<br>";
  }
  else{
   $message .= "与服务器用户验证失败:" .$lastmessage. "<br>";
  }
 
  fputs($link,base64_encode($passwd)."\r\n");
  $lastmessage=fgets($link,2000);
  if (ereg("^235",$lastmessage)){
   $message .= "与服务器密码验证成功:" .$lastmessage. "<br>";
  }
  else{
   $message .= "与服务器密码验证失败:" .$lastmessage. "<br>";
  }
 
  fputs($link,"MAIL FROM:$mailfrom"."\r\n");
  $lastmessage=fgets($link,2000);
  if (ereg("^250",$lastmessage)){
   $message .= "与服务器MAIL FROM成功:" .$lastmessage. "<br>";
  }
  else{
   $message .= "与服务器MAIL FROM失败:" .$lastmessage. "<br>";
  }
 
  fputs($link,"RCPT TO:$rcptto"."\r\n");
  $lastmessage=fgets($link,2000);
  if (ereg("^250",$lastmessage)){
   $message .= "与服务器RCPT TO成功:" .$lastmessage. "<br>";
  }
  else{
   $message .= "与服务器RCPT TO失败:" .$lastmessage. "<br>";
  }
 
  fputs($link,"DATA"."\r\n");
  $lastmessage=fgets($link,2000);
  if (ereg("^354",$lastmessage)){
   $message .= "请求与服务器发送邮件数据成功:" .$lastmessage. "<br>";
   fputs($link,"From:$mailfrom1" . "\r\n");
   fputs($link,"Subject:$title" . "\r\n");
   fputs($link,"To:$rcptto" . "\r\n");
   fputs($link,"\r\n");
   fputs($link,$mail . "\r\n");
   fputs($link,"." . "\r\n");
   $lastmessage=fgets($link,2000);
   if (ereg("^250",$lastmessage)){
    $message .= "发送邮件数据成功:" .$lastmessage. "<br>";
   }
   else{
    $message .= "发送邮件数据失败:" .$lastmessage. "<br>";
   }
 
  }
  else{
   echo "请求与服务器发送邮件数据成功:" .$lastmessage. "<br>";
  }
 
  fputs($link,"QUIT"."\r\n");
  $lastmessage=fgets($link,2000);
  if (ereg("^221",$lastmessage)){
   $message .= "与服务器断开连接成功:" .$lastmessage. "<br>";
  }
  else{
   $message .= "与服务器断开连接失败:" .$lastmessage. "<br>";
  }
 
 }
 echo "s_".$message;
}
else{
 echo "err_";
}
fclose($link);
}
?>
</body>
</html>
例子成功返回如下
s_正在连接服务器...
与服务器连接成功,服务器就绪:220 Esmtp QQ Mail Server
与服务器HELO成功:250 Esmtp OK
请求与服务器进行用户验证成功:334 XXXXXXXXX
与服务器用户验证成功:334 XXXXXXXX
与服务器密码验证成功:235 Authentication successful
与服务器MAIL FROM成功:250 Ok
与服务器RCPT TO成功:250 Ok
请求与服务器发送邮件数据成功:354 End data with .
发送邮件数据成功:250 Ok: queued as
与服务器断开连接成功:221 Bye
附:SMTP基本命令集:
命令       描述
——————————
HELO      向服务器标识用户身份发送者能欺骗,说谎,但一般情况下服务器都能检测到。
MAIL      初始化邮件传输
          mail form :
RCPT      标识单个的邮件接收人;常在MAIL命令后面  可有多个rcpt to:
DATA      在单个或多个RCPT命令后,表示所有的邮件接收人已标识,并初始化数据传输结束。
VRFY      用于验证指定的用户/邮箱是否存在;由于安全方面的原因,服务器常禁止此命令
EXPN      验证给定的邮箱列表是否存在,扩充邮箱列表,也常被禁用
HELP      查询服务器支持什么命令
NOOP      无操作,服务器应响应OK
QUIT      结束会话
RSET      重置会话,当前传输被取消
——————————

转载于:https://www.cnblogs.com/yisuo/p/6784041.html

PHP用socket连接SMTP服务器发送邮件相关推荐

  1. dz邮箱验证怎么设置_详细步骤!Discuz如何设置通过 SOCKET 连接 SMTP 服务器发送(支持 ESMTP 验证)实现论坛邮箱验证功能...

    论坛如何实现邮箱功能呢?今天研究了半天,最终终于成功了. 在网上找了一堆资料也没有一个靠谱的资料,所以在这里记录下我的步骤和方法,希望可以给其他小伙伴一点参考和帮助. 实现思路: 通过注册腾讯企业邮箱 ...

  2. 使用Telnet连接smtp服务器发送邮件

    我们可以通过 Telnet 发送一条邮件,并了解其过程. 1. 前提准备 1.1 开启 Telnet 按下快捷键 Win + S,在搜索框内输入 "启用或关闭Windows功能", ...

  3. PHP邮件发送:PHP使用SMTP服务器发送邮件

    1.下载好phpmailer 后只需要几个重要的文件即可,其余的都可以删除 class.phpmailer.php class.smtp.php class.pos3.php(我未用到这个接受文件) ...

  4. PHPMailer 使用SMTP服务器发送邮件

    phpmailer 安装或者下载方式: 1.从 github 上下载: https://github.com/PHPMailer/PHPMailer/ 2.使用 composer 安装: compos ...

  5. php语言smtp类,php mailer类调用远程SMTP服务器发送邮件实现方法

    这篇文章主要介绍了php mailer类调用远程SMTP服务器发送邮件实现方法,结合实例形式分析了php mailer类的调用及邮件发送相关技巧,需要的朋友可以参考下 本文实例讲述了php maile ...

  6. Ubuntu 使用 heirloom-mail 调用外部邮箱 SMTP 服务器发送邮件

    使用本地服务发邮件,经常被过滤掉而且占用资源,发送成功率不高.所以使用外部SMTP服务器发送邮件成为了需求. SMTP认证的目的是为了使用户避免受到垃圾邮件的侵扰,简单地说就是要求必须在提供了账户名和 ...

  7. 易语言发信服务器没有反应,还不会使用易语言连接发信服务器发送邮件的朋友看过来...

    还不会使用易语言连接发信服务器发送邮件的朋友看过来 许多易语言新手不会使用易语言连接发信服务器发送邮件,主要问题就是对易语言不熟悉导致的,本教程将教大家易语言利用163邮箱连接发信服务器与发送邮件命令 ...

  8. C#使用163的SMTP服务器发送邮件

                                      C#使用163的SMTP服务器发送邮件 public class TestSend163Email { /// <summar ...

  9. Python邮件功能 - 使用163邮箱SMTP服务器发送邮件

    概述 Python发送邮件主要用到smtplib和email两个模块,其中smtplib负责发送邮件,email负责构建邮件内容. 使用Python可以发送简单文本邮件.HTML格式的文件.带附件的邮 ...

最新文章

  1. ubuntu18 安装python3.8.tgz
  2. 十八、redis.conf配置详解
  3. linux常用的makefile模版编写
  4. 软件介绍网站:“软矿”x-berry
  5. matlab车辆测距,一种基于单目视觉的车辆测距方法
  6. android 销毁按钮,Android实现所有Activity全部销毁
  7. the jacobian matrix and the gradient matrix
  8. AcWing 5. 多重背包问题 II(二进制优化)
  9. Redis3.0--集群安装部署
  10. Oracle11G数据库的双机热备份配置--基础篇
  11. md4c语言_C语言开发世嘉MD游戏【二】:Hello World
  12. 7-1 掉入陷阱的数字
  13. 今天的两个收获--linux的特性和海森堡式错误
  14. 逻辑设计基础_第2周-布尔代数及表达式化简
  15. 2016.8.6 学习总结
  16. 2019年软件QA与测试八大关键词
  17. 路由器和三层交换机的搞笑文章
  18. 文献综述撰写格式及写作技巧
  19. Go语言圣经阅读-第二周
  20. antd pro mysql_antd pro table中的文件上传

热门文章

  1. 写一个方法,用一个for循环打印九九乘法表
  2. 电脑重启 硬件问题引发的人品问题
  3. Sophos 修复严重的防火墙 RCE 漏洞
  4. 苹果发布 iOS 和 macOS 更新,修复已遭利用0day
  5. 这个严重 0day 可导致79款 Netgear 路由器遭远程接管,无补丁
  6. 呐,一个苹果洞赚10万美元的详细经验都在这里了~
  7. 苹果新专利曝光,可通过GPS和视觉识别器来识别车辆
  8. HTTPConnectionPool(host:XX)Max retries exceeded with url 解决方法
  9. PHP关闭$_ENV后获取服务器参数的办法
  10. java replaceAll() 方法要用 4 个反斜杠,表示一个反斜杠,该怎么解决