邮件返回 false

19

我目前在工作中使用一个自定义的库。直到最近,该库一直运行完美。现在它似乎从今天开始返回 false。

这个库本质上是围绕函数 mail 的包装器。它构建了“边界”部分和其他所有内容。

由于该类非常大,我不会在这里贴出代码...但我想知道,在理论上,为什么 mail 会返回 false 呢?

  • SMTP 在 PHP.ini 中已设置
  • 发送者在头部中设置
  • 发送者的格式为:sender<sender@email.com>
  • 一切都正确发送(正文+头部+主题)
  • 假设 mail() 在网站上能够正常工作,但在此特定页面上却不能。我知道这肯定是由我引起的,但如果能有一个起点开始寻找就好了。
  • 哦,对了,这个库是没有文档的。

[编辑] 刚刚发现一个更小的函数,但仍然无效,我将把它打印出来:

function send_html($from, $email, $subject = "AUCUN", $message, $cc = "", $bcc ="", $priotity = "3") {
    $headers = "";
    $headers .= "MIME-Version: 1.0\r\n"; 
    $headers .= "Content-type: text/html; charset=iso-8859-1\r\n";

    if (strpos($from, "ourwebsite.com") != false || strpos($from, "rencontresportive.com") != "") {
        $headers .= "From: Ourwebsite.com <" . $from . ">\r\n";
    } else {
        $headers .= "From: " . $from . " <" . $from . ">\r\n";
    }

    $headers .= "X-Sender: <" . $from . ">\r\n";
    $headers .= "X-Priority: " . $priotity . "\r\n";
    $headers .= "X-Mailer: PHP\r\n";
    $headers .= "Return-Path: <admin@ourwebsite.com>\r\n";

    if ($cc != "") {
        $headers .= "cc:" . $cc . "\r\n";
    }
    if ($bcc != "") {
        $headers .= "bcc:" . $bcc . "\r\n";
    }
        if (mail($email, $subject, $message, $headers)) {
        return true;
    } else {
        return false;
    }
}

我使用以下方式调用它:

send_html(contact@ourwebsite.com, me@me.com, utf8_decode("the subject"), "<h1>test</h1>");
8个回答

19
我刚刚遇到了同样的问题。 在进行了PHP升级之后,邮件功能总是返回false。
我使用了这个小片段来进行检查:
<?php
error_reporting(E_ALL|E_STRICT);
ini_set('display_errors', 1);
echo 'I am : ' . `whoami`;
$result = mail('myaddress@mydomain.com','Testing 1 2 3','This is a test.');
echo '<hr>Result was: ' . ( $result === FALSE ? 'FALSE' : 'TRUE') . $result;
echo '<hr>';
echo phpinfo();

解决方案是在我的php.ini中设置'sendmail_from'和'sendmail_path'的值。 在我的情况下,正确的值是:
sendmail_from = "no-reply@mydomain.net"
sendmail_path = "/usr/sbin/sendmail -t -i"

(我正在使用 CentOS 5.3 和 Zend Server CE。)
你可以使用 ini_set() 来设置 'sendmail_from' 的值,但是 'sendmail_path' 变量必须在你的 php.ini 或 http.conf 中进行设置。

6

我有类似的问题,邮件函数始终返回false,即使电子邮件成功接收。

我在PHP配置文件php.ini中发现, 我已经设置了

; For Win32 only.
;sendmail_from = me@example.com

; For Unix only.
sendmail_path = "/usr/sbin/sendmail -t -i -f "care@mydomain.com"

我已将其更改为以下内容。
; For Win32 only.
;sendmail_from = me@example.com

; For Unix only.
sendmail_path = /usr/sbin/sendmail -t -i -f care@mydomain.com

根据此内容,sendmail_from 适用于 win32 系统,在 *unix 操作系统中,我们需要按照 sendmail_path 变量中所示设置值。
祝好, Minesh

4
尝试设置

ini_set('sendmail_from', $from);

如果您能展示给我们代码,那么我们更容易看出哪里出了问题。

4
如果这个类只是对函数邮件(mail)的包装器(wrapper),我建议尝试将调用邮件函数时使用的参数打印到文件中。

2

一个好的起点是检查错误日志。

对于apache和Ubuntu(例如),错误日志位于/var/log/apache2/error.log

这可以给你一个关于具体失败原因的线索。


2

有可能你正在尝试发送邮件的地址被处理它的服务器拒绝了。

涉及太多变量,无法确定具体原因。


0

你是否已经测试过 mail() 函数的工作情况?我建议你检查一下库是否只是将 mail() 函数的失败传递上来。

如果你已经测试了这个假设,我建议你回顾一下库中的返回语句,并尝试找出可能导致错误值的原因。即使在未记录的代码中,通常也有可能做到这一点。


邮件本身返回了false。我确保验证了邮件的返回值。 - Erick

0
对我来说,它既不发送也不返回false!这是我的代码;
<?php
function send_email($para, $assunto, $msg){
    $to      = $para;
    $subject = $assunto;

    $message = '<html><body>';
    $message .= str_replace("\\r\\n","<br/>",$msg);
    $message .= '</body></html>';

    $headers = 'From: email@realemail.com' . "PHP_EOL";
    $headers .= 'Reply-To: email@realemail.com' . "PHP_EOL";
    $headers .= 'X-Mailer: PHP/' . phpversion() . "PHP_EOL";
    $headers .= 'Content-type: text/html; charset=iso-8859-1' . "PHP_EOL";
    $headers .= 'MIME-Version: 1.0' . "PHP_EOL";

    return mail($to, $subject, $message, $headers);
}

$to_email = 'email@gmail.com';
$subject = 'TITLE';
$message = 'message';

if (send_email($to_email, $subject, $message)){
  echo "SUCCESS: <br>";
}
else { echo "FAIL :/ <br>";}
echo "$message"; //output a message
echo "<br>";
?>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接