PHP Mail()无法在远程服务器上运行

时间:2012-09-22 21:04:19

标签: php exchange-server

我正在开发一个应用程序,并且已经在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

3 个答案:

答案 0 :(得分: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。你可以尝试一下。我真的很讨厌使用myown的php mail函数,我总是使用PHP邮件程序类。

很抱歉,如果我无法解答您的真实问题,则无法发送电子邮件。我希望你

答案 1 :(得分:0)

检查您的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

答案 2 :(得分:0)

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