快精灵印艺坊 您身边的文印专家
广州名片 深圳名片 会员卡 贵宾卡 印刷 设计教程
产品展示 在线订购 会员中心 产品模板 设计指南 在线编辑
 首页 名片设计   CorelDRAW   Illustrator   AuotoCAD   Painter   其他软件   Photoshop   Fireworks   Flash  

 » 彩色名片
 » PVC卡
 » 彩色磁性卡
 » 彩页/画册
 » 个性印务
 » 彩色不干胶
 » 明信片
   » 明信片
   » 彩色书签
   » 门挂
 » 其他产品与服务
   » 创业锦囊
   » 办公用品
     » 信封、信纸
     » 便签纸、斜面纸砖
     » 无碳复印纸
   » 海报
   » 大篇幅印刷
     » KT板
     » 海报
     » 横幅

使用php通过smtp发送邮件新手指南

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

“使用php发送mail”最近已经成为继“register_globals”以后本版第二个新手陷阱,今天特地写这篇文章为新手解惑,希望可以为迷茫的人指明方向。
让我们先从以下这个例子开始说起:
引用:
[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文档,偷懒,直接用现成的。

首先是使用telnet来连接本地的25端口,轻微认识点网络的人都知道smtp协议使用25端口,这也就是说,现在在连接本地的smtp服务器。
引用:
Trying 127.0.0.1...
Connected to localhost.
Escape character is \\'^]\\'.
220 server.domain.com.br ESMTP Postfix (2.1.0)

这些东西是系统输出信息,说明已经连接上了,而且这个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。
引用:
DATA
354 End data with <CR><LF>.<CR><LF>
teste
.

这一段是输入邮件正文,输入“DATA”以后系统提示使用“<回车>.<回车>”来结束输入,正文内容是“teste”。
最后使用“QUIT”退出。

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

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

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

以上的代码异常的简朴,配合注释应该不难看懂,关于PEAR和PEAR::Mail的更多信息,可以自己去翻阅PEAR Manual得到进一步的信息。

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

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

返回类别: 教程
上一教程: 在Windows NT 4.0下安装ActivePerl
下一教程: Linux 下的 Apache+JServ+ojsp+SSL+PHP(IMAP+LDAP+MYSQL) 的安装(转四)

您可以阅读与"使用php通过smtp发送邮件新手指南"相关的教程:
· PHP在线邮件发送类,通过SMTP来发送
· 用PHP发送MIME邮件(二)
· 用PHP实现用From发送电子邮件
· 用PHP发送MIME邮件(三)
· 一个简朴的自动发送邮件系统(二)
    微笑服务 优质保证 索取样品