PHP Mailer突然不再工作了

时间:2014-06-03 16:39:46

标签: php mailer

作为在线订阅页面的一部分,我有一个PHP邮件程序,它将用户刚刚输入的详细信息发送到2个指定的电子邮件地址。据我记忆,这个功能一直很好,但是从一个星期开始就不行了。

用户在浏览器中收到以下错误消息:

  

无法添加收件人:yyy@yyy.nl [SMTP:响应代码无效   从服务器收到(代码:550,响应:R1:HELO应该是FQDN   或地址文字(参见RFC 2821   4.1.1.1))] _________________________________________ MIME-Version:1.0 Content-Type:text / html; charset = ISO-8859-1 Content-Transfer-Encoding:   quoted-printable来自:xxx@xxx.nl致:yyy@yyy.nl,zzz @ zzz.com日期:   星期二,2014年6月3日18:18:41 +0200主题:联系formulier Onderstaan​​d   bericht是星期二,2014年6月3日om 06:18 PM verstuurd via = het   lidworden-contactformulier van de ledensite。 Graag actie ondernemen!   订阅:Belangstellend lidmaa = tschap姓:

     

姓名:

     

Dateofbirth:

     

Placeofbirth:

     

电子邮件:

     

Adres:

     

邮政编码:

     

城市:

     

电话:

     

Mobiletelephone:

     

警告:无法修改标头信息 - 已发送的标头   (输出从/xxxxxxxxxxxxx/sendmail.php:39开始)   在第50行的/ xxxxxxxxxx.public_html / mailer.php

这是mailer.php

中的代码
<?PHP
include("sendmail.php");
    $from = “xxx@xxx.nl";
    $to = “yyy@yyy.nl, zzz@zzz.com";
    $subject = "Contact formulier"; 
    $reply_to = "";

    $date = date ("l, F jS, Y"); 
    $time = date ("h:i A"); 

if ($_SERVER['REQUEST_METHOD'] == "POST") {
    $data = $_POST;
} else {
    $data = $_GET;
}

$msg .= "<html>
    <body>
        Message<p>
    <table>\r\n";

foreach ($data as $key => $value) {
    if( strtolower($key) != "submit" ) {    // Ignore submit button
        $msg .= "<tr><td valign='top'>" . ucfirst ($key) . "</td><td>:</td><td>". nl2br($value) . "</td></tr>\n";
        if( $key == "Email" ) {
        $reply_to = $value;
            }
        }
    }

$msg .= "</table>
    </body>
    </html>";

$result = sendmail($from, $to, $reply_to, $subject, $msg, "");

if( $result ) {
    $location="/?page=response_success&menu=lerenvliegen";
} else {
    $location="/?page=response_failure&menu=lerenvliegen";
}
header ("Location:$location"); 
?>

来自sendmail.php的代码:

<?php
function sendmail($from, $to, $reply_to, $subject, $mailhtml) {
set_include_path("/usr/local/lib/php" . PATH_SEPARATOR . ini_get(”include_path”));

require_once 'Mail.php';
require_once 'Mail/mime.php';
$host = "localhost";  
$username = "";     
$password = ""; 
$mime = new Mail_mime();
$mime->setHTMLBody($mailhtml);  

if( $reply_to != "") {
    $extraheaders = array('From' => $from, 'To' => $to, 'Date' => date( 'r' ), 'Subject' => $subject, 'Reply-To' => $reply_to, 'Return-Path' => $reply_to);
} else {
    $extraheaders = array('From' => $from, 'To' => $to, 'Date' => date( 'r' ), 'Subject' => $subject);
}
$recipients['To']  = $to;

$smtp = Mail::factory('smtp',
    array ('host' => $host,
    'auth' => false,
    'username' => $username,
    'password' => $password));

$body = $mime->get();  
$headers = $mime->headers($extraheaders);
$result = $smtp->send($recipients, $headers, $body);

IF (PEAR::isError($result)):
    echo $result->getMessage() . "_________________________________________" . $mime->getMessage();
    return false;
ENDIF;

return true;
}

我在代码中遗漏了一些错误吗?

1 个答案:

答案 0 :(得分:1)

  

警告:无法修改标头信息 - 已发送的标头   (输出从/xxxxxxxxxxxxx/sendmail.php:39开始)   在第50行的/ xxxxxxxxxx.public_html / mailer.php

似乎第39行标题中sendmail.php左右的某个位置已经从mailer.php在第50行附近发送的标题之前输出。

或者可能是您的服务器上发生了某些更改,导致sendmail.php中的错误导致它在第39行输出错误。这意味着标头输出在技术上已经启动。因此,在第50行的mailer.php中发送的附加标头会阻塞。

编辑:添加了sendmail.php的代码后,我注意到了这个错误检查:

IF (PEAR::isError($result)):
    echo $result->getMessage() . "_________________________________________" . $mime->getMessage();
    return false;
ENDIF;

但是看看你的错误,这似乎就是这个的结果:

  

无法添加收件人:yyy@yyy.nl [SMTP:响应代码无效   从服务器收到(代码:550,响应:R1:HELO应该是FQDN   或地址文字(参见RFC 2821   4.1.1.1))]的 _____________________________________

对我来说,就像您遇到SMTP连接问题一样。逻辑是:

  1. 邮件程序因SMTP错误而失败。
  2. sendmail.php中的代码旨在将此错误直接输出到屏幕。这是第一次发送标题。
  3. 然后mailer.php中的代码失败,因为标题已由sendmail.php发送。
  4. 这意味着您的配置可能会破坏SMTP连接。在mailer.php中查看此代码:

    $host = "localhost";  
    $username = "";     
    $password = ""; 
    

    这就在它下面:

    $smtp = Mail::factory('smtp',
        array ('host' => $host,
        'auth' => false,
        'username' => $username,
        'password' => $password));
    

    在某些时候,您似乎曾经无法使用用户名或密码通过SMTP连接到localhost。现在它突然停止了这种方式。由于Mail::factory似乎是PEAR Mail package的一部分,我建议您尝试将其更改为sendmail,看看它是否适用于您的localhost

    $smtp = Mail::factory('sendmail',
        array ('sendmail_path' => '/usr/bin/sendmail',
        'sendmail_args' => '-i'));
    

    调整配置以匹配PEAR Mail package手动sendmail规范:

      

    $ params [“sendmail_path”] - sendmail程序的位置   文件系统。默认为/ usr / bin / sendmail。

         

    $ params [“sendmail_args”] - 传递给的附加参数   发邮件。默认值为-i。

    如果不是/usr/bin/sendmail位于服务器上的位置,您可能需要将sendmail更改为其他路径。也许它会在/usr/local/bin/sendmail?但是暂时尝试使用/usr/bin/sendmail