PHPMailer加载一段时间,然后给出500 - 内部服务器错误

时间:2014-10-27 00:22:32

标签: php iis-7.5 phpmailer windows-server-2008-r2

我正在尝试设置一个php页面来自动发送验证邮件。我想使用gmail smtp服务器,我看过的任何地方都建议使用PHPMailer。我安装它并使用以下示例代码:

ini_set('display_errors', 1);
error_reporting(E_ALL);
require_once ("incl\PHPMailer\PHPMailerAutoload.php");

$mail = new PHPMailer();
$mail->IsSMTP();
$mail->SMTPAuth = true;
$mail->SMTPSecure = "tls";
$mail->Host = "smtp.gmail.com";
$mail->Port = 587;
$mail->Username = "myemail@gmail.com";
$mail->Password = "mypassword";
$mail->SetFrom('myemail@gmail.com','Me');
$mail->AddAddress("ToAddress@gmail.com");
$mail->Subject = "Verify your email";
$mail->Body = "Thank you for signing up.  Please verify your email using the link below:";
$mail->IsHTML (true);

if($mail->Send()){
    echo "Success";
}else{
    echo "Error";
}

尝试通过Firefox访问该页面时,页面将加载几分钟,然后出现此错误:

  

500 - 内部服务器错误。
  您正在查找的资源存在问题,无法显示。

服务器 Windows Server 2008 R2标准版运行 IIS 7.5 PHP版本5.5.8 。我可以毫无问题地访问所有其他页面,但尝试调用$mail->Send()似乎是超时或其他东西。我知道这一点,因为我评论了每一行,然后慢慢地添加了一些内容,$mail->Send()是导致行为的行。

我的谷歌能力让我失望,因为我根本无法弄清楚如何使这项工作。关于可能出错的任何想法?

更新

我打开服务器日志然后再次尝试加载页面,但没有新的错误添加到日志中。但是,我注意到今天System32\LogFiles\httperr1.log

中存在以下错误
2014-10-27 06:29:21 1.161.23.122 3148 212.83.145.123 80 HTTP/1.0 CONNECT mx2.mail2000.com.tw:25 400 - URL -  
2014-10-27 10:10:12 95.183.244.244 33553 212.83.145.123 80 HTTP/1.1 GET / 400 - Hostname -
2014-10-27 11:25:25 207.38.185.197 51157 212.83.145.123 80 HTTP/1.1 GET /tmUnblock.cgi 400 - Hostname -
2014-10-27 12:46:21 1.168.221.158 7952 212.83.145.123 80 - - - - - Timer_ConnectionIdle -

更新2

我很肯定我的gmail帐户详细信息是正确的,并已测试使用服务器上的Thunderbird从中发送。尝试在没有安全方法的情况下发送时,如this comment中所述,我收到此错误:

  

MAIL FROM命令失败,550,5.7.3请求的操作中止;用户未经过身份验证

我的PHP Mailer版本是5.2.9,我现在也尝试了以下内容:

  • 在文件路径中使用\\而不是\
    • 没有变化
  • 包括class.phpmailer.php代替PHPMailerAutoload.php
    • Fatal error: Class 'SMTP' not found in C:\inetpub\wwwroot\incl\PHPMailer\class.phpmailer.php on line 1195
  • 在端口465上使用ssl
    • SMTP connect() failed
  • 使用$mail->SMTPAuth = false;通过端口25发送Hotmail地址
    • MAIL FROM command failed,550,5.7.3 Requested action aborted; user not authenticated

更新3

重新加载问题页面后,我检查了事件查看器,并在Windows日志中看到了一个新条目 - >系统:

  

PHP错误:语法错误,第101行的C:\ PHP \ php.ini中的意外BOOL_TRUE

该行是:

  

php_flag display_errors on

8 个答案:

答案 0 :(得分:2)

您似乎正在处理大量问题,这是一份清单:您遇到了ssl,实际邮件软件和凭据等问题。它从一个主要问题变成了3个问题,我猜你没有正确输入你的凭据,或者你没有设置你的开放ssl并且你也遇到了问题邮件软件。

535 535 5.7.3身份验证失败表示身份验证失败,请检查您的凭据用户名和密码。

550错误代码,这意味着接收系统无法将您的电子邮件发送给收件人,因为邮箱不可用。

还有很多其他解决方案可以解决您的问题。为什么不尝试更简单的东西,而不是使用自动加载 PHPMailerAutoload.php 。创建一个新文件并将代码放在下面,创建一个消息体(test_message.html)并从浏览器调用它以使用gmail凭据测试gmail smtp。这是PHPMailer关于如何将它与gmail smtp一起使用的片段,如果你把所有内容都填写正确就不应该出错。

<?php
    require_once('../class.phpmailer.php');
    //include("class.smtp.php"); // optional, gets called from within class.phpmailer.php if not already loaded

    $mail             = new PHPMailer();

    $body             = file_get_contents('test_message.html');
    $body             = eregi_replace("[\]",'',$body);

    $mail->IsSMTP(); // telling the class to use SMTP
    $mail->Host       = "mail.yourdomain.com"; // SMTP server
    $mail->SMTPDebug  = 2;                     // enables SMTP debug information (for testing)
                                               // 1 = errors and messages
                                               // 2 = messages only
    $mail->SMTPAuth   = true;                  // enable SMTP authentication
    $mail->SMTPSecure = "tls";                 // sets the prefix to the servier
    $mail->Host       = "smtp.gmail.com";      // sets GMAIL as the SMTP server
    $mail->Port       = 587;                   // set the SMTP port for the GMAIL server
    $mail->Username   = "yourusername@gmail.com";  // GMAIL username
    $mail->Password   = "yourpassword";            // GMAIL password

    $mail->SetFrom('name@yourdomain.com', 'First Last');

    $mail->AddReplyTo("name@yourdomain.com","First Last");

    $mail->Subject    = "PHPMailer Test Subject via smtp (Gmail), basic";

    $mail->AltBody    = "To view the message, please use an HTML compatible email viewer!"; // optional, comment out and test

    $mail->MsgHTML($body);

    $address = "whoto@otherdomain.com";
    $mail->AddAddress($address, "John Doe");

    $mail->AddAttachment("images/phpmailer.gif");      // attachment
    $mail->AddAttachment("images/phpmailer_mini.gif"); // attachment

    if(!$mail->Send()) {
      echo "Mailer Error: " . $mail->ErrorInfo;
    } else {
      echo "Message sent!";
    }
    ?>

如果您收到用户身份验证错误,则表示您的凭据未输入 正确。如果这不是问题,如果您没有使用正确的端口,则会收到ssl错误。

如果包含软件问题,您应该尝试更好的方法。

我今天上午辩论,如果我应该 PHPMailer ,最后使用 Swiftmailer ,它在我用PHPComposer安装后立即工作。

我的内部邮件服务器非常挑剔,并且在硬件和软件级别上有大量的防火墙设置和规则,我很惊讶它没有给我任何问题;在587端口发送的电子邮件没有任何问题。

require_once 'vendor/swiftmailer/swiftmailer/lib/swift_required.php';
$transport = Swift_SmtpTransport::newInstance('mail.hellog***.com', 587)
  ->setUsername('apache@hellog***.com')
  ->setPassword('apa******')
  ;

这就是你需要的gmail:

$transporter = Swift_SmtpTransport::newInstance('smtp.gmail.com', 465, 'ssl')
  ->setUsername($this->username)
  ->setPassword($this->password);

$this->mailer = Swift_Mailer::newInstance($transporter);

如果你不喜欢什么,你可以试试phpgmailer: https://github.com/GregDracoulis/LectureBank/tree/master/phpgmailer

这是一个如何使用它的示例: http://www.vulgarisoverip.com/2006/10/13/update-send-email-with-php-and-gmail-hosted-for-your-domain/

这个类专门用于gmail使用。

如果您的所有问题和问题都与openSSL有关,请执行以下步骤:

<强> 1。确保OpenSSL模块DLL文件包含在PHP安装中:

C:\ user&gt; dir \ local \ php \ ext \ php_openssl.dll

C:\ local \ php \ ext

目录

php_openssl.dll

<强> 2。创建PHP配置文件\local\php\php.ini,如果它不存在:

C:\user>copy \local\php\php.ini-production \local\php\php.ini

    1 file(s) copied.

第3。通过使用文本编辑器编辑配置文件来启用OpenSSL模块。您需要在两个配置行上删除注释商(;):

...

; Directory in which the loadable extensions (modules) reside.
; http://php.net/extension-dir
; extension_dir = "./"
; On windows:
extension_dir = "ext"

...
extension=php_openssl.dll

...

就是这样。您应该在Windows IIS WebServer上设置openSSL。请遵循以下选项和步骤,这可能是您的问题。

答案 1 :(得分:1)

这个问题是斜杠(\)

修改

require_once ("incl\\PHPMailer\\PHPMailerAutoload.php");

答案 2 :(得分:1)

我试过你的代码,我只更改了这一行:

require_once ("incl\PHPMailer\PHPMailerAutoload.php");

这一个:

require_once ("incl\PHPMailer\class.phpmailer.php");

它成功了。
您还应该关注PHPMailer版本和PHP版本 您是否尝试过发送没有安全方法的电子邮件? 您确定您的Google凭据有效吗?

<强>已更新
从服务器的命令行,此命令的输出是什么以及响应所花费的时间

telnet smtp.gmail.com 587

答案 3 :(得分:1)

我想知道您是否遇到了this question遇到的同一问题。谷歌对使用Gmail作为自己的个人SMTP服务器的人们不屑一顾。

http://www.labnol.org/internet/email/gmail-daily-limit-sending-bulk-email/2191/

  

Google还限制了您可以在一天内通过Gmail帐户发送的电子邮件数量。如果您超出每日配额,Google可能会暂时停用您的Gmail帐户而不会发出任何警告,您可能需要等待最多24小时才能重新获得对Gmail邮箱的访问权限。

我可以看到类似可能产生500错误的错误。

答案 4 :(得分:1)

从评论到问题,很明显这个问题与 OpenSSL 有关。

您提到您已取消注释extension=php_openssl.dll,但phpinfo()确实显示未加载。

一些想法:

  • 在取消注释php.ini中的openssl php模块后,您是否重新启动了网络服务器?

    这是非常明显的一个,但仍值得一提。 php.ini在启动时加载,而不进行服务重启只是一个常见的错误。

  • 检查Loaded Configuration File

    phpinfo()的值

    如果这个位置与您编辑的php.ini不同,那么也很清楚为什么它没有被加载。来自phpinfo()的以下行可能值得检查。

    • 配置文件(php.ini)路径
    • 已加载的配置文件
    • 扫描此目录以获取其他.ini文件

还有其他一些事情可以做,比如卸载和重新安装OpenSSL,但最好先检查这些更明显的事情。

进一步的想法:

  • 检查错误日志

    对于php,可以(再次)在phpinfo()中找到路径。在您尝试重新加载页面后立即查找error_log的值并检查最新条目。

    另外,您可能想检查IIS的日志文件。如果您不知道IIS管理器中的路径,请在左窗格中选择计算机,然后在中间窗格中,转到&#34; logging&#34;在IIS区域。通常,这些内容会指向C:\inetpub\logs\LogFilesC:\Windows\System32\LogFiles,其子文件夹为W3SVC[x],其中[x]为网站ID。 (如果您只有一个页面,则只需1,否则请检查IIS管理器中的顶级网站文件夹,查看右侧窗格中的站点列表,它是应用程序ID)

答案 5 :(得分:1)

设置和配置IIS

首先转到服务器上的ServerManager。通常这是您将运行php网站的服务器。转到功能摘要部分中的添加功能。在添加功能向导中检查SMTP服务,然后单击安装。现在等待安装完成。在管理工具下打开IIS6(或IIS7)管理器 - &gt; Internet Information Services 6.0在“开始”菜单中,SMTP的配置使用IIS6中的管理控制台。在[SMTP虚拟服务器]下,单击鼠标右键,然后从上下文菜单中选择属性。转到“访问”选项卡,然后单击“中继”按钮。通过单击“添加”按钮在列表中添加新条目,然后在单个计算机输入字段中输入127.0.0.1(或您的Web服务器的IP)。点击确定两次以应用新设置。

配置Php

要让Php发送电子邮件,您需要进行一些配置。基本上有两种选择。 如果您只打算在单个项目中使用SMTP服务器并且不希望它干扰其他项目,您可以通过在发送电子邮件之前的任何地方添加以下行来在您的php代码中设置配置:

ini_set('SMTP','localhost' ); 
ini_set('sendmail_from', 'administrator@YourWebsite.com');

另一种方法是,要全局使用这些设置,请将下一行添加到php.ini文件中。

[mail function]
SMTP = localhost
sendmail_from = me@example.com

确保在进行这些更改后重新启动服务器,以确保它们已加载。

这里提供了关于如何设置IIS和php的http://geekswithblogs.net/tkokke/archive/2009/05/31/sending-email-from-php-on-windows-using-iis.aspx的解决方案,并提供了这个问题的答案500 error when trying to use the MAIL function

答案 6 :(得分:0)

尝试使用端口465进行SSL加密:

$mail->SMTPSecure = "ssl";
$mail->Host = "smtp.gmail.com";
$mail->Port = 465;

答案 7 :(得分:0)

  

警告:require_once(mailer / PHPMailerAutoload.php):无法打开   stream:....中没有这样的文件或目录。

这是我将文件路由的方式

在: require_once "mailer/PHPMailerAutoload.php";

在: require_once "../mailer/PHPMailerAutoload.php";

...通常使用css将img链接为背景的过程相同。