注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

浮游生物的博客

以扯蛋的态度面对操蛋的人生

 
 
 

日志

 
 

php发送电子邮件与常见错误  

2010-08-30 15:09:16|  分类: PHP |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

PHP mail() 函数

PHP mail() 函数用于从脚本中发送电子邮件。

语法

mail(to,subject,message,headers,parameters)
参数 描述
to 必需。规定 email 接收者。
subject 必需。规定 email 的主题。注释:该参数不能包含任何新行字符。
message 必需。定义要发送的消息。应使用 LF (\n) 来分隔各行。
headers

可选。规定附加的标题,比如 From、Cc 以及 Bcc。

应当使用 CRLF (\r\n) 分隔附加的标题。

parameters 可选。对邮件发送程序规定额外的参数。

 

PHP 简易 E-Mail

通过 PHP 发送电子邮件的最简单的方式是发送一封文本 email。

在下面的例子中,我们首先声明变量($to, $subject, $message, $from, $headers),然后我们在 mail() 函数中使用这些变量来发送了一封 e-mail:

<?php    $to = "someone@example.com";  $subject = "Test mail";  $message = "Hello! This is a simple email message.";  $from = "someonelse@example.com";  $headers = "From: $from";  mail($to,$subject,$message,$headers);  echo "Mail Sent.";    ?>

PHP Mail Form

通过 PHP,您能够在自己的站点制作一个反馈表单。下面的例子向指定的 e-mail 地址发送了一条文本消息:

<html>  <body>    <?php  if (isset($_REQUEST['email']))  //if "email" is filled out, send email    {    //send email    $email = $_REQUEST['email'] ;     $subject = $_REQUEST['subject'] ;    $message = $_REQUEST['message'] ;    mail( "someone@example.com", "Subject: $subject",    $message, "From: $email" );    echo "Thank you for using our mail form";    }  else  //if "email" is not filled out, display the form    {    echo "<form method='post' action='mailform.php'>    Email: <input name='email' type='text' /><br />    Subject: <input name='subject' type='text' /><br />    Message:<br />    <textarea name='message' rows='15' cols='40'>    </textarea><br />    <input type='submit' />    </form>";    }  ?>    </body>  </html>

例子解释:

  1. 首先,检查是否填写了邮件输入框
  2. 如果未填写(比如在页面被首次访问时),输出 HTML 表单
  3. 如果已填写(在表单被填写后),从表单发送邮件
  4. 当点击提交按钮后,重新载入页面,显示邮件发送成功的消息

 

在上面中的 PHP e-mail 脚本中,存在着一个漏洞。

PHP E-mail 注入

首先,请看上一节中的 PHP 代码:

<html>  <body>    <?php  if (isset($_REQUEST['email']))  //if "email" is filled out, send email    {    //send email    $email = $_REQUEST['email'] ;     $subject = $_REQUEST['subject'] ;    $message = $_REQUEST['message'] ;    mail("someone@example.com", "Subject: $subject",    $message, "From: $email" );    echo "Thank you for using our mail form";    }  else  //if "email" is not filled out, display the form    {    echo "<form method='post' action='mailform.php'>    Email: <input name='email' type='text' /><br />    Subject: <input name='subject' type='text' /><br />    Message:<br />    <textarea name='message' rows='15' cols='40'>    </textarea><br />    <input type='submit' />    </form>";    }  ?>    </body>  </html>

以上代码存在的问题是,未经授权的用户可通过输入表单在邮件头部插入数据。

假如用户在表单中的输入框内加入这些文本,会出现什么情况呢?

someone@example.com%0ACc:person2@example.com  %0ABcc:person3@example.com,person3@example.com,  anotherperson4@example.com,person5@example.com  %0ABTo:person6@example.com

与往常一样,mail() 函数把上面的文本放入邮件头部,那么现在头部有了额外的 Cc:, Bcc: 以及 To: 字段。当用户点击提交按钮时,这封 e-mail 会被发送到上面所有的地址!

PHP 防止 E-mail 注入

防止 e-mail 注入的最好方法是对输入进行验证。

下面的代码与上一节类似,不过我们已经增加了检测表单中 email 字段的输入验证程序:

<html>  <body>  <?php  function spamcheck($field)    {    //filter_var() sanitizes the e-mail     //address using FILTER_SANITIZE_EMAIL    $field=filter_var($field, FILTER_SANITIZE_EMAIL);        //filter_var() validates the e-mail    //address using FILTER_VALIDATE_EMAIL    if(filter_var($field, FILTER_VALIDATE_EMAIL))      {      return TRUE;      }    else      {      return FALSE;      }    }    if (isset($_REQUEST['email']))    {//if "email" is filled out, proceed      //check if the email address is invalid    $mailcheck = spamcheck($_REQUEST['email']);    if ($mailcheck==FALSE)      {      echo "Invalid input";      }    else      {//send email      $email = $_REQUEST['email'] ;       $subject = $_REQUEST['subject'] ;      $message = $_REQUEST['message'] ;      mail("someone@example.com", "Subject: $subject",      $message, "From: $email" );      echo "Thank you for using our mail form";      }    }  else    {//if "email" is not filled out, display the form    echo "<form method='post' action='mailform.php'>    Email: <input name='email' type='text' /><br />    Subject: <input name='subject' type='text' /><br />    Message:<br />    <textarea name='message' rows='15' cols='40'>    </textarea><br />    <input type='submit' />    </form>";    }  ?>    </body>  </html>

在上面的代码中,我们使用了 PHP 过滤器来对输入进行验证:

  • FILTER_SANITIZE_EMAIL 从字符串中删除电子邮件的非法字符
  • FILTER_VALIDATE_EMAIL 验证电子邮件地址

 

容易出现的错误:

1、Warning: mail(): Failed to connect to mailserver at "localhost" port 25, verify your "SMTP" and "smtp_port" setting in php.ini or use ini_set() in

这主要是SMTP设置错误,首先,我们要先添加SMTP功能,象WINDOWS2008之类的系统都自带,在服务器管理器中添加功能即可。然后,在php.ini管理配置文件里,有几个条目需要被设置以便mail()函数能够正常运行.在改变它们以前,搞清楚它们都是做什么用的.你可以使用phpinfo()函数通过创建一个文件来显示系统当前的配置情况,这个文件包括:

<? 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

 

这是我电脑上的PHP.INI配置

SMTP = localhost

sendmail_from = me@example.com

sendmail_path = "C:/APMServ5.2.6/sendmail/sendmail.exe -t -i"


在做了这些配置上的改动以后,重启Web服务程序然后使用phpinfo()函数来验证这些修改.在这些工作完成以后,你就可以用PHP来发送电子邮件了.

 

2、SMTP server response: 550 5.7.1 Unable to relay for

上面工作完成后,你在发用MAIL函数发邮件还可能遇到这个错误,解决方法如下:

打开IIS下的SMTP,在SMTP虚拟服务器上点击右键,在弹出的属性窗口里进行如下设置:
点击访问选项卡,再点击中继,在弹出的窗口出点击添加,然后选单台计算机,添加IP地址为 127.0.0.1。然后一路确定返回。(不进行此项设置,可能会出现:SMTP server response: 550 5.7.1 Unable to relay for xxxxx@xxxx.com。。。的错误)

  评论这张
 
阅读(2376)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018