PHP mail()函数中是否有错误?

时间:2011-06-03 12:14:24

标签: php email

我希望有人能够帮助我,因为我对导致问题的原因感到茫然。 我们的网站有一个联系我们表格,包括姓名,电子邮件,孩子姓名,孩子ID和&amp ;;消息。

当表单提交时,服务器端php代码验证表单字段,&如果一切都好,使用内置的php mail()函数发送2封电子邮件。

电子邮件1将转到托管Exchange服务器上的收件箱,其中包含表单字段中的值。

电子邮件2发送给提交表单的人说谢谢 - 我们会尽快给您回复。

对于电子邮件1,From,Reply-To,& Return-Path标头设置为在表单中输入的电子邮件,& mail()函数中的To param是托管Exchange服务器的收件箱的电子邮件地址。

对于电子邮件2,From,Reply-To,& Return-Path标头设置为托管Exchange服务器上收件箱的电子邮件地址,& mail()函数中的To param是在表单中输入的电子邮件地址。

该网站的主机有MX,PTR,SPF和&正确设置TXT记录以允许将电子邮件发送到&从托管Exchange服务器的收件箱的电子邮件地址。 该网站的主机使用QMail作为实际发送电子邮件的SMTP服务,&在所有测试中,QMail在发送电子邮件1和1时都获得了成功。 2. mail()函数没有发出错误。

本地测试使用IE8,Chrome和& FF3.6.17。在显示此问题的测试之间,代码没有改变。

在所有测试案例中,电子邮件2(返回提交表单的人)发送得很好。 另一方面,电子邮件1只是间歇性地工作。一般模式是第一次将联系表单与表单中的每个不同的电子邮件地址一起使用,电子邮件发送正常,&标题&是正确的。

第二次将联系表单与表单中以前使用过的电子邮件地址一起使用时,To param设置为表单中的电子邮件地址,标题全部为空白,&尽管To电子邮件地址不正确,但电子邮件

未收到。 该网站的主持人的支持人员可能已经发现了另一个潜在的症状,即在清除cookie之后,所有的电子邮件2都通过了确定。但是,该页面不使用与表单相关的任何cookie。 最后,我再次尝试了一段时间(30分钟?),电子邮件2没有通过,然后另一次尝试工作,之后电子邮件2再次搞砸了。

这些行上是否存在php的mail()函数的已知错误?是否可以使用mail()的最大频率? 我不知道为什么代码有时会起作用,&有时不会。该网站的主持人员也处于亏损状态。 试图谷歌这个问题似乎出现了人们说要使用不同模块的论坛(Swift Mailer,PHPMailer,Pear Mail等),但由于网站是实时的,我担心重建自动电子邮件代码

引入超出上述错误的错误。

...编辑6jun11 ......

抱歉,不知道我可以编辑我的帖子......

这是最相关的代码:

function UserToSiteEmail( $name, $fromEmail, $message, $kidID, $kidName )
{
    $subject = "Face of Kinder - contact us";
    $headers = GetEmailHeaders($fromEmail);
    $imageFilename = constant("URL_ROOT")."/kidimages/".$kid->ImageFilename;
    $profileUrl = constant("URL_ROOT")."/profile.php?k=".$kid->KidID;
    $body = file_get_contents("EmailTemplates/ContactUs.html");
    $body = str_replace("#FromName#",$name,$body);
    $body = str_replace("#FromEmail#",$fromEmail,$body);
    $body = str_replace("#KidName#",$kidName,$body);
    $body = str_replace("#KidID#",$kidID,$body);
    $body = str_replace("#Message#",$message,$body);
    $body = str_replace("#SiteRoot#",constant("URL_ROOT"),$body);
    return mail(constant("FROM_EMAIL"),$subject,$body,$headers);
}

function GetEmailHeaders( $fromEmail )
{
    $headers = "From: Face of Kinder <" . $fromEmail . ">" . PHP_EOL;
    $headers .= "Reply-To: " . $fromEmail . PHP_EOL;
    $headers .= "Return-Path: " . $fromEmail . PHP_EOL;
    $headers .= 'MIME-Version: 1.0' . PHP_EOL;
    $headers .= 'Content-type: text/html; charset=iso-8859-1' . PHP_EOL;

    return $headers;
}

UserToSiteEmail()函数使用联系我们表单中的数据,其中$ fromEmail参数是在表单中输入的电子邮件。从Rackspace在QMail日志中可以找到的内容是,当提交联系我们表单中第二次使用相同电子邮件时,表单中的电子邮件最终在“收件人”字段中,而不是在标题中,&amp;电子邮件收件箱的地址没有显示在任何地方(甚至没有标题 - 即,它没有交换)。这是即使相同的代码正确地将表单的电子邮件放入标题,&amp;第一次提交表单(每个浏览器)的“收件人”字段中的电子邮件收件箱地址。

如果需要,我可以添加表单的HTML端,但就其过程而言,在将表单提交回自身之后,在验证&amp;通过电子邮件发送,php重定向到感谢页面。我不确定GET&amp;在感谢页面之后POST变量将保持不变,因为返回页面的唯一方法是再次单击联系表单的链接。要查看当前流程(没有问题 - 因为它似乎只在使用电子邮件收件箱的域时出现),这里是指向页脚中链接的链接的链接:http://www.faceofkinder.com/home.php

我认为QMail日志表明失败也有帮助......

342812-web2 qmail-queue-handlers[1147]: Handlers Filter before-queue for qmail started ...
342812-web2 qmail-queue-handlers[1147]: from=
342812-web2 qmail-queue-handlers[1147]: to=orionculver@b-street.co.uk
342812-web2 qmail-queue-handlers[1147]: hook_dir = '/var/qmail//handlers/before-queue'
342812-web2 qmail-queue-handlers[1147]: recipient[3] = 'orionculver@b-street.co.uk'
342812-web2 qmail-queue-handlers[1147]: handlers dir = '/var/qmail//handlers/before-queue/recipient/orionculver@b-street.co.uk'
342812-web2 qmail-queue-handlers[1147]: starter: submitter[1148] exited normally
342812-web2 qmail: 1307092428.798059 bounce msg 18353656 qp 1147
342812-web2 qmail: 1307092428.798116 end msg 18353656
342812-web2 qmail: 1307092428.798338 new msg 18353663
342812-web2 qmail: 1307092428.798366 info msg 18353663: bytes 4902 from <> qp 1148 uid 2522
342812-web2 qmail: 1307092428.800937 starting delivery 2481: msg 18353663 to remote orionculver@b-street.co.uk
342812-web2 qmail: 1307092428.801071 status: local 0/10 remote 2/20
342812-web2 qmail-remote-handlers[1149]: Handlers Filter before-remote for qmail started ...
342812-web2 qmail-remote-handlers[1149]: from=
342812-web2 qmail-remote-handlers[1149]: to=orionculver@b-street.co.uk
342812-web2 qmail: 1307092430.526801 delivery 2481: success: 98.129.184.131_accepted_message./Remote_host_said:_250_OK_BD/F0-16184-DC5A8ED4/
342812-web2 qmail: 1307092430.526909 status: local 0/10 remote 1/20
342812-web2 qmail: 1307092430.526938 end msg 18353663
342812-web2 qmail: 1307092430.576988 delivery 2480: success: 98.129.184.131_accepted_message./Remote_host_said:_250_2.0.0_Ok:_queued_as_6D/F0-16184-DC5A8ED4/
  • O8

2 个答案:

答案 0 :(得分:4)

根据您的描述,我怀疑问题可能出在标题的行尾。

从手册:

  

additional_headers(可选)

     

......多个   额外的标题应该用   a CRLF(\ r \ n)。

     

...   注意:如果未收到消息,   尝试仅使用LF(\ n)。有些穷人   优质的Unix邮件传输代理   由CRLF自动替换LF   (如果CRLF是,则导致CR加倍   用过的)。这应该是最后的手段,   因为它不符合»RFC 2822。

我不确定您将其定义为PHP_EOL,但您可以单独尝试CRLF或LF。

答案 1 :(得分:0)

听起来您没有在提交之间清除部分$_GET$_POST条目。

您可以复制/粘贴有问题的代码进行验证吗?

相关问题