首页 后端开发 php教程 用Socket发送电子邮件--续篇smtp认证_PHP

用Socket发送电子邮件--续篇smtp认证_PHP

Jun 01, 2016 pm 12:35 PM
amp 信息 发送 电子邮件 认证

SMTP

作者limodou 



  在前面我曾经写过一篇文章介绍了如何利用socket编程来发送邮件以解决web服务器不支

持mail
()函数的问题。经过我的测试也是可以使用的。但目前众多的免费邮件提供商从263开

163新浪网也快开始了均在smtp功能上增加了认证功能使得原邮件发送类无法使用。在

经过对相应smtp后续rfc的学习之后
经过了多次的试验我终于试验成功了。于是怀着急迫的心

情向大家介绍。
 



SMTP 认证功能介绍 

  此处不想向你详细介绍SMTP认证功能因为我也说不清楚详细的请参考[RFC 2554]规范。

SMTP的认证功能主要是增加了AUTH命令。AUTH命令有多种用法
而且有多种认证机制。AUTH支持

的认证机制主要有LOGIN
CRAM-MD5[注1]等。LOGIN应该是大多数免费邮件服务器都支持的263

与新浪都支持。而新浪还支持CRAM
-MD5机制。认证机制一般只在真正发送邮件之前进行而且只

需要执行一次。当认证成功后
即可按原来正常的处理发送邮件。原理是口令-应答(Challenge-

Response)即由服务器发送命令要求客户端回答客户端根据服务器发送信息进行回答如果应

答通过了
则认证成功即可继续处理。下面对这两种制作一个简单介绍。S:表示服务器返回

C:表示客户端发送。 





LOGIN 

它应该比较简单。口令-应答过程如下 



1 C: AUTH LOGIN 

2 S: 334 dXNlcm5hbWU6 

3 C: dXNlcm5hbWU6 

4 S: 334 cGFzc3dvcmQ6 

5 C: cGFzc3dvcmQ6 

6 S: 235 Authentication successful. 

1 为客户端向服务器发送认证指令。 

2 服务端返回base64编码串成功码为334。编码字符串解码后为“username:说明要求客户

端发送用户名。
 

3 客户端发送用base64编码的用户名此处为“username:”。 

4 服务端返回base64编码串成功码为334。编码字符串解码后为“password:说明要求客户

端发送用户口令。
 

5 客户端发送用base64编码的口令此处为“password:”。 

6 成功后服务端返回码为235表示认证成功可以发送邮件了。 



对于LOGIN方式认证其实就是将用户名与口令用base64进行编码根据服务器的要求分别发出

即可。
(就我看来由于base64是一种公共的编码标准也起不到太大的保护作用。) 

CRAM-MD5机制 

关于CRAM-MD5的机制可以参考[RFC 2195]规范这里不详细说明了。主要就是通过口令-回答机

由服务端发出一个信息串这个由随机数时间戳服务器地址构成并且用base64编码。

客户端收到后
发送一个由用户名加一个空格再加一个摘要构成的串并用base64编码。摘

要是通过MD5算法求出。这种机制要求服务端与客户端有相同的加密串。当客户端发送摘要后


务器对其合法性进行验证
成功后返回235。 

如何得知邮件服务器支持什么认证 

  在smtp的[RFC 821]在与邮件服务器连接成功后第一个命令一般是“HELO”。但是在支

持认证的邮件服务器中
第一个命令应改为“EHLO”[注2]。在命令成功后263的返回可能为 



EHLO hello 

250-smtp.263.net [注3] 

250-PIPELINING 

250-SIZE 10240000 

250-ETRN 

250-AUTH LOGIN 

250 8BITMIME 

  从而可以看到263支持LOGIN方式认证。当然如果你已经知道邮件服务器是什么方式也没

有必要自动进行判断
但是如果不知道就需要分析这个返回结果了。不过大部分的邮件服务器

都支持最简单的LOGIN方式。
 



  好了下面开始对以前所写的sendmail.class.php3进行修改。你没有不要紧本文在最后提

供了sendmail
.class.php3的打包文件可以下载。至于例子则自已根据本文进行编写。 



修改sendmail.class.php3 

  此处只说出修改的重点而不是全面的分析。 



  首先回顾一下sendmail.class.php3的思路让大家先心中有数。 



  sendmail.class.php3一共有四个函数分别为 



send_mail 类的构造函数用于信息的初始化 

send 邮件发送函数执行socket命令发送邮件 

do_command 命令执行函数执行一条smtp命令并将处理返回结果 

show_debug 显示调示信息函数 

  首先用户应先调用类的构造函数对必要的参数进行初始化。如smtp服务器地址($smtp)

迎信息
($welcome)及是否显示调示信息($debug)。同时还要初始化一些内部变量如最后执行

命令
($lastact)最后响应信息($lastmessage)及端口号($port=25) 



  然后用户生成邮件信息并调用send()函数发送邮件。在send()函数中根据smtp规范

一条命令接一条命令执行(详情参见前面的文章)。在执行命令时是通过调用do_command()来实

现的。如果do_command
()执行出错则程序立即返回否则继续向下执行。如果设置了显示调示

信息标志
则do_command()在命令发送和信息响应时会返回调示信息。 



  好了大家已经对它的运行有了一个了解下面就是如何修改了。 



  修改构造函数(send_mail) 

  由于以前的send_mail类不支持认证功能所以先要增加认证信息。增加了三个参数

$auth $authuser和$authpasswd。$auth是一个标志表示是否要使用认证功能。$authuser

和$authpasswd是smtp认证的用户名和口令
根据相应的邮件服务商的要求例如263是同pop3相

一致。大部分应该也是如此。这样
同时需要在类的内部变量表后面增加三个内部变量$auth

$user$passwd。 



  修改发送函数(send) 

  将发送命令HELO改为发送EHLO。同时要加入判断是否要进行认证处理 



//改为支持ESMTP EHLO命令 

if($this->auth) 

 

else 

$this->lastact="HELO "; 

  即如果需要认证处理则发送EHLO命令否则还发送HELO命令。 



  然后增加认证处理 



//2000.02.28 增加认证处理 

if($this->auth) 

 



//回传用户名用base64编码 

$this->lastact=base64_encode($this->user) . "

"
; 

if(!$this->do_command($this->lastact, "334")) 

 



//回传口令用base64编码 

$this->lastact=base64_encode($this->passwd) . "

"
; 

if(!$this->do_command($this->lastact, "235")) 

 

} 

  注意这里只实现了AUTH LOGIN机制CRAM-MD5没有实现。而且对服务器传回的信息没有判

默认为第一次要求用户名第二次要求口令。 



  修改命令执行函数(do_command) 

  原函数不能显示当响应串为多行的情况。修改为 



/* 2000.02.28 修改,将返回信息显示完全 
$this->lastmessage = fgets ( $this->fp, 512 ); 

$this->show_debug($this->lastmessage, "in"); 

*/
 

while(true) 

 

  这样类就改好了。 



测试send_mail类 

  下面是我编写的一个测试小程序用于发送一封信但是为了安全起见我将用户名及口令

没有用真实信息
如果大家想要测试请改成你自已的信息。程序如下(send.php) 



<? 

include("sendmail.class.php3"); 



$sendmail=new send_mail("smtp.263.net", true, "username", "password", "hello", 

true); 

$sendmail->send("toemail, "fromemail", "test", "This is a test!"); 

?> 

结论 

  对于263的测试很顺利也比较快。但是新浪网则不容易成功主要是超时而且发成功也收

不着
不知为何 



  注意由于发送smtp需要用户名及口令且大部分的smtp认证使用与pop3相同的用户名和口

令。所以如果大家使用这个方法
可能会把用户名和口令写入程序上传到服务器。但是这样做

是不安全的。加密也不一定好用
因为信息放在服务器上相应的解密信息也会放到服务器上。

我的建议是
再申请一个专门用来发信用的信箱这样别人知道了也不怕。 



  希望这个程序对你有用。sendmail.class.php3下载。 



相关的RFC 



RFC 1869 SMTP Service Extensions 

RFC 2195 IMAP/POP AUTHorize Extension(里面有关于CRAM-MD5的说明) 

RFC 2222 Simple Authentication and Security Layer 

RFC 2554 SMTP Service Extension for Authentication 



-------------------------------------------------------------------------------- 

[注1] 

CRAM=Challenge-Response Authentication Mechanism 口令-应答认证机制 

MD5是一种摘要算法主要用于RSAPGP中。 

[注2] 

关于EHLO的说明参见[RFC 1869] 

[注3] 

在邮件服务器应答串中如果应响码后面跟空格( )表示应答串只有一行如果为减号(-)

表示有多行且最后一行响应码后面为空格( ) 

本文所有权属于limodou。如要转载请保留此信息。 





注意sendmail.class.php3下载地址 

http://www.zphp.com/files/sendmail.cl
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前 By 尊渡假赌尊渡假赌尊渡假赌
仓库:如何复兴队友
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
4 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

如何在Microsoft Word中删除作者和上次修改的信息 如何在Microsoft Word中删除作者和上次修改的信息 Apr 15, 2023 am 11:43 AM

Microsoft Word文档在保存时包含一些元数据。这些详细信息用于在文档上识别,例如创建时间、作者是谁、修改日期等。它还具有其他信息,例如字符数,字数,段落数等等。如果您可能想要删除作者或上次修改的信息或任何其他信息,以便其他人不知道这些值,那么有一种方法。在本文中,让我们看看如何删除文档的作者和上次修改的信息。删除微软Word文档中的作者和最后修改的信息步骤 1 –转到

如何在Outlook中按发件人、主题、日期、类别、大小对电子邮件进行排序 如何在Outlook中按发件人、主题、日期、类别、大小对电子邮件进行排序 Feb 19, 2024 am 10:48 AM

Outlook提供了许多设置和功能,可帮助您更有效地管理工作。其中之一是排序选项,可让您根据需要对电子邮件进行分类。在这个教程中,我们将学习如何利用Outlook的排序功能,根据发件人、主题、日期、类别或大小等条件对电子邮件进行整理。这将让您更轻松地处理和查找重要信息,提高工作效率。MicrosoftOutlook是一个功能强大的应用程序,可以方便地集中管理您的电子邮件和日历安排。您可以轻松地发送、接收和组织电子邮件,而内置的日历功能也让您能够方便地跟踪您即将面临的活动和约会。如何在Outloo

当您在 iPhone 上使用'隐藏我的电子邮件”时会发生什么? 当您在 iPhone 上使用'隐藏我的电子邮件”时会发生什么? Feb 22, 2024 pm 09:19 PM

Apple提供了一个名为“隐藏邮件地址”的重视隐私的功能,允许用户在需要注册账户的应用程序或网站上隐藏其真实电子邮件地址。我们已经教您如何在iPhone上使用此功能,现在让我们一起看看在日常工作中使用它时可能发生的情况。什么是iPhone上的隐藏邮件地址?“隐藏邮件地址”功能的目的是为了保护您的电子邮件地址隐私。通过为应用程序和网站注册提供临时电子邮件地址的方式,您无需直接提供个人的真实电子邮件地址。这个功能允许您生成多个iCloud电子邮件地址,用于注册不同的服务,从而避免泄露真实的电子邮件地

WhatsApp技巧:发送高清照片和视频的方法 WhatsApp技巧:发送高清照片和视频的方法 Sep 10, 2023 am 10:13 AM

WhatsApp推出了一个新选项,允许用户通过消息传递平台以高分辨率发送照片和视频。继续阅读以了解它是如何完成的。WhatsApp发布了一个更新,允许iPhone和Android用户以高分辨率发送照片和视频,最终解决了该服务的低质量媒体共享限制。该选项称为“高清质量”,意味着用户可以以最小的压缩发送更清晰的照片和视频。例如,在iPhone上捕获的图像现在可以以3024x4032分辨率发送,而不是以前的最大920x1280分辨率,而视频可以以1280×718分辨率发送,而不是848×476分辨率。

1.1.1.1上网认证系统怎么登录 1.1.1.1上网认证系统怎么登录 Apr 20, 2023 am 10:44 AM

1.1.1.1上网认证系统登录方法:1、搜索校园网无线信号并连接;2、打开浏览器,在弹出的身份验证界面选择“自助服务”;3、输入用户名和初始密码进行登录;4、完善个人信息并设置为强密码即可。

抖音上如何发给别人文件?上发给别人文件怎么删除? 抖音上如何发给别人文件?上发给别人文件怎么删除? Mar 22, 2024 am 08:30 AM

在抖音上,用户不仅可以分享自己的生活点滴和才艺,还可以和其他用户互动交流。在这个过程中,有时候我们需要向其他用户发送文件,比如图片、视频等。那么,在抖音上如何发给别人文件呢?一、抖音上如何发给别人文件?1.打开抖音,进入你想要发送文件的聊天界面。2.点击聊天界面中的“+”号,选择“文件”。3.在文件选项中,你可以选择发送图片、视频、音频等文件。选择你想要发送的文件后,点击“发送”。4.等待对方接受你的文件,一旦对方接受,文件就会传输成功。二、抖音上发给别人文件怎么删除?1.打开抖音,进入你发送文

如何使用ThinkPHP6进行JWT认证? 如何使用ThinkPHP6进行JWT认证? Jun 12, 2023 pm 12:18 PM

JWT(JSONWebToken)是一种轻量级的认证和授权机制,它使用JSON对象作为安全令牌,可以在多个系统之间安全地传输用户身份信息。而ThinkPHP6是一种基于PHP语言的高效、灵活的MVC框架,它提供了许多有用的工具和功能,其中就包括JWT认证机制。在本文中,我们将介绍如何使用ThinkPHP6进行JWT认证,以保障Web应用程序的安全性和可靠

如何利用C++实现一个简单的电子邮件发送程序? 如何利用C++实现一个简单的电子邮件发送程序? Nov 02, 2023 pm 05:35 PM

如何利用C++实现一个简单的电子邮件发送程序?随着互联网的普及,电子邮件已经成为人们日常生活和工作中不可或缺的一部分。在C++编程中,我们可以利用SMTP(SimpleMailTransferProtocol)协议实现一个简单的电子邮件发送程序。本文将介绍如何使用C++编写一个基本的电子邮件发送程序。首先,我们需要准备一些工具和库来实现我们的程序。首先

See all articles