php中mail()函数和SMTP工作原理及实际
发表于2019-05-24 12:36|
次阅读|
来源网络整理|
作者session
摘要:php中mail()函数和SMTP工作原理及实际
php中mail()函数和SMTP工作原理及实际
一个发送E-MAIL的脚本兴许是你可以在Web 站点上找到的最一般的脚本之一了,只管它很简略,一个邮件脚本有时会令程序员十分丧气.PHP中有一个叫做mail()的函数,它只有要知道接纳方的地址 和函件主体就可能发送邮件,然而要让mail()按你的意思运转你还需求处理一些辣手的成绩.
要使mail()可以运转,你必须有一 个SMTP服务器以便PHP可以衔接下来.不管这个服务器对邮件程序如许重要,大少数人对它如何运行没有一星半点的概念.在本教程中,咱们将提醒SMTP 的秘密并处理一些利用PHP发送邮件的常见成绩.而本文中的另一些主题将包括循环遍历一个地址列表的方法以及同时以文本和HTML格式向接纳者发送一个邮 件的方法.
SMTP 是简略邮件传输协定(Simple Mail TransferProtocol)的缩写,而一个SMTP服务器是一台运转这种协定并收回邮件的计算机.运转这种协定实践上指的是运转诸如 Sendmail和Qmail的程序--假设你利用的是一台非Windows计算机的话.在Windows平台上,作为Windows NT ServicePack一局部或是内建于Windows 2000内部的SMTP服务程序就是典型的这种程序.
我并不是说SMTP软件包 就只要那些,然而它们是最一般的.假设你的Web站点利用了互联网服务提供者的主机软件包(Internet ServiceProvider's virtual hostingpackage)的一局部,那么SMTP服务程序就应该已经在这台计算机上装置了.假设你是一台位于ISP或是室内的计算机的系统治理员, 那么你很有能够已经在这台计算机上装置了某种SMTP软件,用来解决从Web服务器发送邮件的过程.
然而,假设你是一个集体用户并只要一 个开发用的Web服务程序运转在你的集体电脑上,你能够没有在本人的机器上运转SMTP软件.下面是一个十分简略然而准确的拇指定律:假设你是一个 Windows用户而从没有看见SMTP服务器这样的字眼,那么你就没有运转这个程序.假设你的确没有,那么你有两种抉择:装置,配置,和维护一个 SMTP服务程序(假设你不知道那是怎样一回事的话就不引荐你利用这种方法)或是利用一个现存的SMTP服务器.
"假设一个服务器如今没 有运转的话,我又怎样利用它呢?"你能够要问.假设你的计算机是经过拨号衔接(或是DSL或电缆)连到互联网的话,你可能利用你ISP的外发邮件服务器. 例如,假设你开发用的 计算机是一个Windows98的系统并利用56kbpsmodem经过EarthLink衔接到互联网,那么你就可能利用 mail.earthlink.net作为你的SMTP服务器.不论你对你的外发邮件服务器利用什么样的邮件客户端(Eudora, Outlook, NetscapeMail等等),它们都将和你的PHP代码利用你的SMTP服务器的过程一样.技巧就是使PHP知道一点点理想.
在php.ini治理配置文件里,有几个条目需求被设置以便mail()函数可以失常运转.在扭转它们以前,搞清楚它们都是做什么用的.你可能利用phpinfo()函数经过创建一个文件来显示系统以后的配置情况,这个文件包括:
保存这个文件,将它放置到你的Web服务程序的文件根目录,然后经过你的阅读器访问它.你应该可能看到一个被柔美的格式化了的信息,显示你的配置情况.你要查看的条目如下:
SMTP
sendmail_from
sendmail_path
假设你没有利用windows,那么sendmail_path指令就是你惟一要担心的货色.假设你正在利用Windows,你就需求看看最后两个指令.
假设你利用的是Linux或是一个Unix变种,sendmail_path看起来应该象这样:
sendmail_path = /usr/sbin/sendmail
或许假设你利用Qmail:
sendmail_path = /var/qmail/bin/sendmail
在这条指令里,你还可能设置配置参数来指明队列缓冲选项或是显示的设置Return-Path头,如下所示:
sendmail_path = /usr/sbin/sendmail -t-fyou@yourdomain.com
作 为一个非Windows用户,这就是你要做的所有了.假设你利用的是Windows,你有更多的事件要做.你还需求看一看SMTP和 sendmail_from的值.不要被sendmail_from指令名字中的sendmail弄迷糊了.只管你没有在Windows上利用名叫 Sendmail的程序,但那只是指令的名字.不要被它吓到了.
在你的phpinfo()显示的后果里,看看SMTP和sendmail_from的缺省值--它们要么是空白,要么蕴含了胡说八道乱的值.你应该把它们改成无心义的值.
假设你信念在这台电脑上运转一个SMTP服务程序,你在php.ini文件中的条目就应该如下:
SMTP = localhost
然而,假设你要利用你ISP(在这个例子中是EarthLink)的外发邮件服务器,那么php.ini中的邮件看起来应该如下:
SMTP = mail.earthlink.net
你也可能利用IP地址而不是域名,由于计算机不区分这两种条目.
第二条配置指令是sendmail_from,它应该被设置成From头中的电子邮件地址.它可能在脚本里被修正然而通常作为缺省值利用.下面就是这个配置指令的示例youraddress@yourdomain.com指的是你本人的邮件地址.
sendmail_from =youraddress@yourdomain.com
在做了这些配置上的改动当前,重启Web服务程序然后利用phpinfo()函数来验证这些修正.在这些工作实现当前,你就可能用PHP来发送电子邮件了.
mail()函数是十分简略的:只要五个参数,而其中的两个是可选的.这些参数是:
接纳方地址
主题
函件内容
其它文件信息头(可选)
SMTP服务程序的其它配置选项(可选)
附加的头参数控制了诸如CC, BCC, Reply-To之类的邮件性能,或许其它遵照SMTP协定的性能.在这个例子中,我只利用From 和 Reply-To信息头.
假设你想给我发邮件但你利用的是一个非Windows系统, 程序代码就应该如下:
$to= "julie@thickbook.com";
$subject = "ZDNet Developer article";
$msg = "I completely understand SMTP servers now!";
$headers = "From:me@mycompany.comnReply-To:someoneelse@mycompany.com";
$config = "-fwebmaster@mycompany.com";
mail("$to", "$subject", "$msg", "$headers", "$config");
echo "finished!";
?>
假设你利用的是一个基于Windows的SMTP服务,那么你有能够不需求利用第五个参数,而且在附加的头信息参数中(也就是第四个参数),你需求将它们来到写--利用rn而不是n.所以,异样的一个邮件经过基于Windows的SMTP服务发送的代码如下:
$to = "julie@thickbook.com";
$subject = "ZDNet Developer article";
$msg = "I completely understand SMTP servers now!";
$headers = "From:me@mycompany.comrnReply-To:someoneelse@mycompany.com";
mail("$to", "$subject", "$msg", "$headers");
echo "finished!";
?>
脚本中的echo语句使你的Web阅读器在脚本运转实现的时分向你显示一条信息.假设不写echo语句,你就会失去一个"空文件"的对话框,由于没有任何输出可以发送到阅读器端.
只需可以衔接到指定的SMTP服务器mail()函数就会前往真值.然而这并不象征着邮件胜利的到达了接纳方那里.mail()函数不会期待或报告SMTP服务器发来的胜利/谬误代码.
mail() 函数有能够前往假值,然后给你警告"无奈衔接,在第x行"或是"未知的谬误,在第x行."假设这两条信息中的任何一条出现了,你就应该反省php.ini 中的SMTP值.惹起这些消息有两种能够:SMTP服务器瘫痪了,或许PHP无奈衔接到它.无论是这两种情况中的哪一种,你的邮件都无奈被发送进来.
这个脚本对这些参数利用硬编码的值.利用一个简略的HTML表单,你就可能在这些参数中插入一些值并领有一个良好的反馈表单.
注:更多精彩文章请关注三联编程教程栏目。