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      重置会话,当前传输被取消

——————————

PHP用socket连接SMTP服务器发送邮件的更多相关文章

  1. Linux 上使用 Gmail SMTP 服务器发送邮件通知

    导读 假定你想配置一个 Linux 应用,用于从你的服务器或桌面客户端发送邮件信息.邮件信息可能是邮件简报.状态更新(如 Cachet).监控警报(如 Monit).磁盘时间(如 RAID mdadm ...

  2. 微软BI 之SSIS 系列 - 使用 Script Task 访问非 Windows 验证下的 SMTP 服务器发送邮件

    原文:微软BI 之SSIS 系列 - 使用 Script Task 访问非 Windows 验证下的 SMTP 服务器发送邮件 开篇介绍 大多数情况下我们的 SSIS 包都会配置在 SQL Agent ...

  3. JavaMail SMTP服务器发送邮件程序示例 java通过dns服务器解析ip地址

    /** * JavaMail SMTP服务器发送邮件程序示例 * 扮演SMTP服务器角色与邮件客户端软件最大的区别就是: * SMTP服务器需要解析不同接收人邮件地址主机名对应的SMTP服务器主机名 ...

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

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

  5. CentOS7配置mailx使用外部smtp服务器发送邮件

    转自huskiesir的博客: 发送邮件的两种方式: 1.连接现成的smtp服务器去发送(此方法比较简单,直接利用现有的smtp服务器比如qq.新浪.网易等邮箱,只需要直接配置mail.rc文件即可实 ...

  6. centeros 7配置mailx使用外部smtp服务器发送邮件

    发送邮件的两种方式: 1.连接现成的smtp服务器去发送(此方法比较简单,直接利用现有的smtp服务器比如qq.新浪.网易等邮箱,只需要直接配置mail.rc文件即可实现) 2.自己搭建私有的smtp ...

  7. C#利用SMTP服务器发送邮件

    使用.net(C#)发送邮件学习手册(带成功案例) 1.了解发送邮件的三种方式 2.实例介绍使用client.DeliveryMethod = System.Net.Mail.SmtpDelivery ...

  8. [教程] Windows Server 2008 R2架设SMTP服务器发送邮件教程

    Windows Server 2008 R2 架设SMTP服务器实现邮件发送 目的:架设SMTP服务器实现邮件发送. 一.域名设置 添加“邮件交换记录(MX)”: Newjs.cn           ...

  9. Java通过socket实现smtp协议发送邮件

    import java.io.BufferedReader;import java.io.DataOutputStream;import java.io.IOException;import java ...

随机推荐

  1. vue 指令的用法

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. 电脑无法上网,DHCP客户端不能正确获取IP地址

    问题特征:DHCP服务器更新[保留]配置信息后,给一客户端绑定了新的IP地址;但客户端IP地址并未正确更新; 处理: 一.检查DHCP服务器配置; 1.MAC地址.IP地址均正确;并已“添加到筛选器” ...

  3. phantomjs 设置代理

    phantomjs 可通过以下设置代理ip #coding=utf-8import osimport reimport timeimport requestsfrom scrapy.selector ...

  4. Webhook

    Webhook就是用户通过自定义回调函数的方式来改变Web应用的一种行为,这些回调函数可以由不是该Web应用官方的第三方用户或者开发人员来维护,修改.通过Webhook,你可以自定义一些行为通知到指定 ...

  5. InnoDB引擎索引大观

    InnoDB是mysql处理OLTP(online transcation process)类型业务的存储引擎.为了加快数据查询速度.InnoDB引擎提供了丰富的索引实现. 1. 索引的分类 索引能够 ...

  6. jquery插件库http://www.jq22.com/

    http://www.jq22.com/ http://www.jq22.com/jquery/%E5%8A%A0%E8%BD%BD http://www.jq22.com/jquery/%E5%BC ...

  7. POJ 2430 状压DP

    题意: 思路: 先预处理出所有格子的statement statement=1–>只有上边的格子被覆盖 statement=2–>只有下边的格子被覆盖 statement=3–>上下 ...

  8. LuoguP4016 负载平衡问题(费用流)

    题目描述 G 公司有 n 个沿铁路运输线环形排列的仓库,每个仓库存储的货物数量不等.如何用最少搬运量可以使 n 个仓库的库存数量相同.搬运货物时,只能在相邻的仓库之间搬运. 输入输出格式 输入格式: ...

  9. Python day3 知识回顾

    names = ["Jonathen","Joesph","Jotaro","Josuke",["Mea&qu ...

  10. 今日SGU 5.3

    SGU 107 题意:输入一个N,表示N位数字里面有多少个的平方数的结尾9位是987654321 收获:打表,你发现相同位数的数相乘结果的最后几位,就和那两个相乘的数最后几位相乘一样,比如3416*8 ...