phpmailer和php5.6无法使用office365

时间:2016-01-18 06:19:02

标签: php email phpmailer rackspace

我有一个托管Rackspace的网站,并将我的网站技术从php5.4升级到php5.6。现在我无法再从该网站发送电子邮件了。最糟糕的是我甚至没有收到任何错误,日志也没有显示任何内容。我使用的是phpmailer 5.2.14。

这是我的邮件脚本

require 'phpmailer/PHPMailerAutoload.php';
if (isset($_POST['contactForm'])) {
        $email = $_POST['email'];
        $subject = $_POST['subject'];
        $message = $_POST['message'];
        $body = '
        <html>
            <body>
                <div style="float:left; width:100%; margin:0 0 25px 0; padding:20px; background:#222; text-align:center;">
                    <div style="display:inline-block; vertical-align:top;">
                        <a href="http://website.com"><img src="img/logoEmail.png" alt="waesf"></a>
                    </div>
                </div>
                <main style="float:left; width:100%; padding:20px;">
                    <p style="font-family:Arial; font-size:18px;">'.$message.'</p>
                </main>
            </body>
        </html>';
        $mail = new PHPMailer;

        $mail->SMTPDebug = 3;                                                         // Enable verbose debug output

        $mail->SMTPOptions = array(
            'ssl' => array(
                'verify_peer' => false,
                'verify_peer_name' => false,
                'allow_self_signed' => true
            )
        );
        $mail->isSMTP();                                                                // Set mailer to use SMTP
        $mail->Host = 'smtp.office365.com';                                             // Specify main and backup SMTP servers
        $mail->SMTPAuth = true;                                                         // Enable SMTP authentication
        $mail->Username = 'person@email.com';                                 // SMTP username
        $mail->Password = 'secret';                                                // SMTP password
        $mail->SMTPSecure = 'tls';                                                      // Enable TLS encryption, `ssl` also accepted
        $mail->Port = 587;                                                              // TCP port to connect to

        $mail->SetFrom('person@email.com', 'Ballpoint Machinist');
        $mail->AddAddress('person@email.com', "BPM");                         // Add a recipient
        $mail->addReplyTo('person@email.com', 'Information');
        // $mail->addCC('cc@example.com');
        // $mail->addBCC('bcc@example.com');

        // $mail->addAttachment('/var/tmp/file.tar.gz');                                // Add attachments
        // $mail->addAttachment('/tmp/image.jpg', 'new.jpg');                           // Optional name
        $mail->isHTML(true);                                                            // Set email format to HTML

        $mail->Subject = $subject;
        $mail->Body    = $body;
        $mail->AltBody = $body;

        if (!$mail->send()) {
            echo 'Message could not be sent.';
            echo 'Mailer Error: ' . $mail->ErrorInfo;
        } else {
            echo 'Message has been sent';
        }
    }

当脚本运行该站点然后挂起一段时间然后给出一个说服务器超时而没有别的。没有任何php错误代码,当我检查日志时,没有与我的邮件代码相关的错误。然而,当我将smtp设置更改为gmail然后我至少在页面上出现php错误时,这只发生在Office 365中。

我已经阅读了很多关于这个主题的帖子,但我不明白。我也经历了https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting并添加了SMTPOptions以排除ssl,但这没有帮助。

我很困惑,我没有得到任何错误。我有SMTPDebug = 3和error_reporting(E_ALL)。

使用Willy Pt建议编辑。当脚本运行服务器超时时仍然无效。

if (isset($_POST['contactForm'])) {
        $email = $_POST['email'];
        $subject = $_POST['subject'];
        $message = $_POST['message'];
        $body = '
        <html>
            <body>
                <div style="float:left; width:100%; margin:0 0 25px 0; padding:20px; background:#222; text-align:center;">
                    <div style="display:inline-block; vertical-align:top;">
                        <a href="http://website.com"><img src="img/logoEmail.png" alt="Ballpoint Machinist"></a>
                    </div>
                </div>
                <main style="float:left; width:100%; padding:20px;">
                    <p style="font-family:Arial; font-size:18px;">'.$message.'</p>
                </main>
            </body>
        </html>';
        $mail = new PHPMailer(true);

        // $mail->SMTPDebug = 4;                                                         // Enable verbose debug output

        try {

        $mail->SMTPOptions = array(
            'ssl' => array(
                'verify_peer' => false,
                'verify_peer_name' => false,
                'allow_self_signed' => true
            )
        );
        $mail->isSMTP();                                                                // Set mailer to use SMTP
        $mail->Host = 'smtp.office365.com';                                             // Specify main and backup SMTP servers
        $mail->SMTPAuth = true;                                                         // Enable SMTP authentication
        $mail->Username = 'person@person.com';                                 // SMTP username
        $mail->Password = 'test';                                                // SMTP password
        $mail->SMTPSecure = 'tls';                                                      // Enable TLS encryption, `ssl` also accepted
        $mail->Port = 587;                                                              // TCP port to connect to

        $mail->SetFrom('person@person.com', 'Ballpoint Machinist');
        $mail->AddAddress('person@person.com', "BPM");                         // Add a recipient
        $mail->addReplyTo('person@person.com', 'Information');
        // $mail->addCC('cc@example.com');
        // $mail->addBCC('bcc@example.com');

        // $mail->addAttachment('/var/tmp/file.tar.gz');                                // Add attachments
        // $mail->addAttachment('/tmp/image.jpg', 'new.jpg');                           // Optional name
        $mail->isHTML(true);                                                            // Set email format to HTML

        $mail->Subject = $subject;
        $mail->Body    = $body;
        $mail->AltBody = $body;
        $mail->send();
        echo "Message Sent OK\n";
        /*if (!$mail->send()) {
            echo 'Message could not be sent.';
            echo 'Mailer Error: ' . $mail->ErrorInfo;
        } else {
            echo 'Message has been sent';
        }*/


        } catch (phpmailerException $e) {
            echo $e->errorMessage(); //Pretty error messages from PHPMailer
        } catch (Exception $e) {
          echo $e->getMessage(); //Boring error messages from anything else!
        }
    }
} 

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:0)

不知道这是否算作答案,但我能够使用gmail。完全相同的代码只使用gmail凭据和smtp主机而不是office365。我必须设置gmail以允许不太安全的应用程序。

答案 1 :(得分:0)

问题在于PHP5.6和自签名证书验证。 使用PHP5.6,默认情况下启用证书验证,证书不能自签名。

正确的解决方法是用一个好的证书替换无效,配置错误或自签名的证书。

或者,将其配置为使用非自签名证书:

$mail->SMTPOptions = array(
'ssl' => array(
    'verify_peer' => false,
    'verify_peer_name' => false,
    'allow_self_signed' => true
    )
);

您也可以在php.ini中全局更改这些设置,但这是一个非常糟糕的主意; PHP 5.6做了这个改变的原因非常充分。

有时候这种行为并不那么明显;有时加密失败可能表现为客户端在尝试执行STARTTLS后立即发出QUIT。如果您发现这种情况,则应检查证书或验证设置的状态。