作为在线订阅页面的一部分,我有一个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 Onderstaand 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;
}
我在代码中遗漏了一些错误吗?
答案 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连接问题一样。逻辑是:
sendmail.php
中的代码旨在将此错误直接输出到屏幕。这是第一次发送标题。mailer.php
中的代码失败,因为标题已由sendmail.php
发送。这意味着您的配置可能会破坏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
。