中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档 | 网通镜像
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > Web开发 > PHP > PHP综合
使用php通过smtp发送邮件新手指南
作者:未知 时间:2005-09-13 19:41 出处:ChinaUnix.net 责编:chinaitpower
              摘要:使用php通过smtp发送邮件新手指南

由于php没有提供现成的smtp函数,却提供了一个功能不甚灵活的mail()函数,这个函数需要服务器配置上的支持,并且不支持smtp验证,在很多场合无法正常的工作,因此不建议使用。本文的目的在于为新手指明方向,并没有涉及那些高级的内容,一来本身水平有限,二来也担心不能准确的讲述相关的概念,进而对各位造成误导,还请自行深入学习。本文撰写日期是2004年7月2日,阅读时请注意时效性。

“使用php发送mail”最近已经成为继“register_globals”以后本版第二个新手陷阱,今天特地写这篇文章为新手解惑,希望可以为迷茫的人指明方向。
让我们先从以下这个例子开始说起:
[quote:c9547ed7fa][root@server~/]# telnet localhost 25 
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 server.domain.com.br ESMTP Postfix (2.1.0)
MAIL FROM: teste@dominio.com.br
250 Ok
RCPT TO: teste@dominio.com.br
250 Ok
DATA
354 End data with <CR><LF>.<CR><LF>
teste
.
250 Ok: queued as 7B41F4665A
QUIT
221 Bye
Connection closed by foreign host.
注:以上来自netkiller的postfix文档,偷懒,直接用现成的。[/quote:c9547ed7fa]
首先是使用telnet来连接本地的25端口,稍微熟悉点网络的人都知道smtp协议使用25端口,这也就是说,现在在连接本地的smtp服务器。
[quote:c9547ed7fa]Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 server.domain.com.br ESMTP Postfix (2.1.0)[/quote:c9547ed7fa]
这些东西是系统输出信息,说明已经连接上了,而且这个smtp服务器是postfix做的。

“MAIL FROM: teste@dominio.com.br”这个命令指明了发件地址是teste@dominio.com.br,“250 Ok”说明这条命令被服务器接受并正确执行,这类似http协议的200、404、500等状态代码。接下来的“RCPT TO: teste@dominio.com.br”指明了收件地址是teste@dominio.com.br。
[quote:c9547ed7fa]DATA
354 End data with <CR><LF>.<CR><LF>
teste
.[/quote:c9547ed7fa]
这一段是输入邮件正文,输入“DATA”以后系统提示使用“<回车>.<回车>”来结束输入,正文内容是“teste”。
最后使用“QUIT”退出。

以上就是最简单的一次发送mail的过程,从这个例子我们可以看出,发送mail其实是很简单的事情,实质上也就是建立一个对smtp服务器的连接,然后发送一些简单的命令给它,一封内容简单的邮件就发送出去了,至于更加复杂内容的邮件或者操作,其实也就是在此基础上稍加扩展而已。

把这个过程用php来实现,其实就是利用php的Socket functions、Network Functions等等操作socket的函数来和smtp服务器建立一个连接,然后发送文本的命令给服务器,如果你亲自去看看那些写好的利用smtp协议发送邮件的类或者函数,相信可以印证我的说法。

由于已经存在很多现成的封装得很好的类或者函数替我们完成底层的socket级操作,我们只需要直接拿来用就好,而我也不会费时费神的在本文里去讨论底层的代码,有精神去研究的话,自己找代码来研究吧。现在继续跟我走,我们来点实际的代码来说明如何使用php发送邮件,采用的类是PEAR::Mail。
[code:1:c9547ed7fa]<?php
require_once 'Mail.php';

$conf['mail'] = array(
        'host'     => 'xx.xx.xx.xx',                //smtp服务器地址,可以用ip地址或者域名
        'auth'     => true,                         //true表示smtp服务器需要验证,false代码不需要
        'username' => 'tester',                     //用户名
        'password' => 'retset'                      //密码
);

/***
* 使用$headers数组,可以定义邮件头的内容,比如使用$headers['Reply-To']可以定义回复地址
* 通过这种方式,可以很方便的定制待发送邮件的邮件头
***/
$headers['From']    = 'tester@domain.com';              //发信地址
$headers['To']      = 'tester@domain.com';              //收信地址
$headers['Subject'] = 'test mail send by php';          //邮件标题
$mail_object = &Mail::factory('smtp', $conf['mail']);   

$body = <<< MSG                                         //邮件正文
hello world!!!
MSG;

$mail_res = $mail_object->send($headers['To'], $headers, $body);        //发送

if( Mail::isError($mail_res) ){                         //检测错误
    die($mail_res->getMessage());
}
?>[/code:1:c9547ed7fa]
以上的代码非常的简单,配合注释应该不难看懂,关于PEAR和PEAR::Mail的更多信息,可以自己去翻阅PEAR Manual得到进一步的信息。

现在你依葫芦画瓢已经可以开始工作了,不过如果你还想做得更好、做得更多的话,我在这里提供一些更多的指南。

1、SMTP协议
熟悉并了解SMTP协议的内容,这样你可以进行更多的高级操作,甚至自己写一个满足自己特别需求的发邮件程序。以上的代码虽然简单,但是肯定还是有很多人不了解注释里提到的邮件头是什么东西,它到底对发出的邮件有什么样的影响。
比如“发送html邮件为什么对方看到的是乱码”等等问题都可能和邮件头相关,如果对smtp协议比较了解的话,可以很快的知道问题所在。
2、MIME规范
如果想要发送html邮件甚至多媒体邮件,一定是需要对MIME有一定了解的,有了这方面的知识你就可以发送内容更加精彩的邮件。
3、PEAR
PEAR并非唯一的发送邮件的工具,但是PEAR包含了Mail、Mail_Mime等等已经封装好了的类,可以让我们的开发事半功倍,并且除了Mail方面的东西以外,它还提供了很多其他方面的现成的工具,非常值得花时间学一学。

由于php没有提供现成的smtp函数,却提供了一个功能不甚灵活的mail()函数,这个函数需要服务器配置上的支持,并且不支持smtp验证,在很多场合无法正常的工作,因此不建议使用。本文的目的在于为新手指明方向,并没有涉及那些高级的内容,一来本身水平有限,二来也担心不能准确的讲述相关的概念,进而对各位造成误导,还请自行深入学习。本文撰写日期是2004年7月2日,阅读时请注意时效性。

 apj 回复于:2004-07-02 08:47:01
win2k的smtp能用来发邮件吗?
mail.php里面写的什么?

 tonera 回复于:2004-07-02 08:57:58
[quote:472d4ff6be="apj"]win2k的smtp能用来发邮件吗?
mail.php里面写的什么?[/quote:472d4ff6be]

SMTP就是发邮件的协议。
mail.php可以想象是发邮件的动作的一个类。要想知道它是怎么动的,可以看看源码。

总之:不管怎么变,它都离不开RFC821规范,原理就是建立一个到邮件服务器的socket连接->向服务端口发送相关命令,与服务器交互->OK。
建议看看RFC821规范,对邮件发送命令及响应有详细描述。

 geel 回复于:2004-07-02 10:55:56
the Simple Mail Transfer Protocol

 deadcat 回复于:2004-07-06 21:14:40
现在没条件测试,请问mail()函数是怎么回事呢?
我以前发邮件都简单的用mail函数来实现,也可以阿

 ukalpa 回复于:2004-07-12 09:31:18
[quote:bba7e576c6="geel"]the Simple Mail Transfer Protocol[/quote:bba7e576c6]

喜欢你的签名图

 深空 回复于:2004-07-19 08:22:17
问题怎么搞出一个Smtp服务器?郁闷死,在Windows下装的Apache
还有,要是服务器不支持呢?哪里弄Smtp服务器?
smtp函数指的是什么功能的函数?

请指点,谢谢

 魔力葱油饼 回复于:2004-07-20 16:20:23
SMTP可以下载一个逍遥邮试试,在win2000,iis下配的php,修改php.ini(在winnt目录下)中[mail function]; For Win32 only.
SMTP = 邮件服务器名称或者ip ; for Win32 only
smtp_port = 25
sendmail_from= 自己的邮件地址 ; for Win32 only

; For Win32 only.
;sendmail_from = 邮件地址

然后用mail("收件人地址","主题","正文","From:发件人\r\nReply-to:发件人的地址");即可 

 :em02:

 tonera 回复于:2004-07-22 12:14:26
WIN2000有自带的smtp服务。在“添加|删除程序”里找。

 bbjt 回复于:2004-08-19 20:38:21
为何需要通过smtp服务呢?mail()函数直接不能发送信件么?

 htldm 回复于:2004-08-21 07:22:12
又学一招

 zjzct 回复于:2005-05-13 23:52:24
mail()只有在邮件服务器不需要认证的时候才好用。

 云飞月 回复于:2005-05-14 01:30:24
得好好看看

关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有