我正在尝试设置一个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 = "[email protected]";
$mail->Password = "mypassword";
$mail->SetFrom('[email protected]','Me');
$mail->AddAddress("[email protected]");
$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访问页面时,页面将加载几分钟,然后出现以下错误:



该服务器为 Windows Server 2008 R2 Standard,运行 IIS 7.5 PHP版本5.5.8 。我可以访问所有其他页面,而没有问题,但是尝试调用$mail->Send()似乎超时了。我知道这一点是因为我注释了每一行,然后慢慢添加回去,而$mail->Send()是导致此行为的行。

我的Google能力令我失望,因为我根本不知道如何进行这项工作。有什么想法可能有问题吗?

更新

我打开了服务器日志,然后尝试再次加载该页面,但是没有新的错误添加到日志中。但是,从今天开始,我注意到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所示,出现此错误:



我的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日志->系统中看到了一个新条目:



    该行是:

    最佳答案

    看起来您正在处理很多问题,这是一个 list :您在ssl,实际的邮件软件和凭据方面遇到了问题。从一个主要问题变成了3个问题,我想您可能没有正确输入凭据,或者未设置打开的ssl,并且在使用邮件软件时也遇到了问题。

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

    550错误代码,这意味着接收系统由于邮箱不可用而无法将您的电子邮件传递给收件人。

    还有许多其他解决方案可以解决您的问题。为什么不尝试使用更简单的方法,而不是使用autoload 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   = "[email protected]";  // GMAIL username
        $mail->Password   = "yourpassword";            // GMAIL password
    
        $mail->SetFrom('[email protected]', 'First Last');
    
        $mail->AddReplyTo("[email protected]","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 = "[email protected]";
        $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.确保PHP安装中包含OpenSSL模块DLL文件:

    C:\user> 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。请遵循以下选项和步骤,这可能是您的问题。

    关于php - PHPMailer加载一会儿,然后给出500-内部服务器错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26579546/

    10-15 04:26