【问题标题】:PHP Mail() not working on remote serverPHP Mail() 在远程服务器上不起作用
【发布时间】:2012-09-22 21:04:19
【问题描述】:

我正在开发一个应用程序,并且一直在测试 PHP 中的 mail() 函数。以下在我的本地机器上工作得很好,可以向我自己发送电子邮件,但是一旦我尝试将它从测试环境发送到我的本地机器,它就会默默地失败。

我仍会收到“已发送邮件”消息,但未发送任何消息。我在 php.ini 文件中打开了邮件日志记录,但刷新页面后似乎也没有填充。

同样,.php 文件和 php.ini 文件在两种环境中是相同的。测试环境开放了25端口,我们使用的是Microsoft Exchange服务器。

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

php.ini 文件的 SMTP 区域:

[mail function]
; For Win32 only.
; http://php.net/smtp
SMTP = exhange.server.org
; http://php.net/smtp-port
smtp_port = 25

; For Win32 only.
; http://php.net/sendmail-from
sendmail_from = user@example.com

【问题讨论】:

  • Windows? Linux?你检查邮件服务器的邮件队列和日志文件了吗?
  • @pencil 两台机器都在 Windows 上。交换服务器日志没有显示来自服务器的电子邮件的任何移动,这很奇怪。
  • 两台机器都有本地 Microsoft Exchange 服务器? php.ini 是什么样的?
  • 不要使用mail。使用PHP Mailer - 它更好、更简单,并且可以很容易地用于通过mail 无法做到的smtp(甚至是远程)发送。并且mail 可以被禁用。

标签: php exchange-server


【解决方案1】:

首先,即使邮件失败,也会回显“邮件已发送”。将显示。 php 函数 mail() 将在成功时返回 true,在失败时返回 false。把它放在一个if中,你可以检查邮件是否已经发送:

if(mail($to,$subject,$message,$headers)) echo "Mail Sent.";

应该正在检查电子邮件是否已发送。

关于你的问题,它不起作用,我不太确定,我可能错了,但根据我的经验,有些服务器希望每个标题行后面都有 \r\n。

$headers = "From:" . $from . "\r\n";

但正如已经说过的,我可能是错的,并且与此处的示例有关,使用一个标题行时没有必要 - http://php.net/manual/en/function.mail.php

我在测试邮件功能时,并没有在邮件功能中放入任何头信息,只是$to$subject$message。你可以试一试。我真的很讨厌自己使用 php mail 功能,我总是使用 PHP mailer 类。

抱歉,如果我无法回答您的真正问题,即无法发送电子邮件。我希望你

【讨论】:

    【解决方案2】:

    在您的 PHP 发行版中检查 PEAR 和 Mail.php。在 cmd 行上,“php -i”来查找您的资源。我相信 PEAR 和 Mail.php 对于 5.2 以上的发行版来说是相当普遍的。我在 Mac 和 Linux 服务器上,更喜欢 PEAR 邮件而不是 PHP 邮件功能。 Windows 应该是类似的。这是使用 PEAR Mail 发送多封电子邮件的示例。

     /** PEAR::MAIL
     * PEAR::Mail only opens one mail socket for multiple emails sent
     */
     require_once('/opt/local/lib/php/Mail.php');
    
     $body = $_POST['message'];
      //using sendmail on backend
     $params['sendmail_path'] = '/usr/sbin/sendmail';
    
     //using factory method
     $mail_object =& Mail::factory('sendmail',$params);
    
     //loop through selected users to send
     for ($i=0;$i<count($recipients);$i++){
     if (!empty($recipients[$i]['email'])&&($recipients[$i]['alt_email'])){
     //concatinate email and alt_email
     $address = $recipients[$i]['email'].",".$recipients[$i]['alt_email'];
     }
     else {
     //only one user address
     $address = $recipients[$i]['email'];    
     }
    
    //send the mail instance    
    $mail_object->send($address,$headers,$body); 
    if (PEAR::isError($mail_object)) {print($mail_object->getMessage());}
    } //close the for loop
    

    【讨论】:

    • 快速说明,Mail::factory() 通过引用“&”分配给 obj var $mail_object,您可以检查并确保您的 PHP 版本 (>5.3) 支持通过引用传递。
    【解决方案3】:

    有时您的托管服务提供商会阻止传出 SMTP 身份验证。请与您的托管服务提供商确认。

    【讨论】:

      猜你喜欢
      • 2013-01-29
      • 2016-05-14
      • 2014-09-15
      • 2017-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-03
      • 2015-10-15
      相关资源
      最近更新 更多