12

我正在使用 PHPmailer。它在 $mail->SMTPDebug = true 时起作用;但是当我删除那条线时,它会默默地失败。我说静默失败,因为它没有给出任何错误,但电子邮件似乎没有送达。

        $mail = new PHPMailer;

        $mail->SMTPDebug = true;
        $mail->SMTPAuth = true;
        $mail->CharSet = 'utf-8';
        $mail->SMTPSecure = 'ssl';
        $mail->Host = 'smtp.gmail.com';
        $mail->Port = '465';
        $mail->Username = 'xxxxx@gmail.com';
        $mail->Password = 'xxxxx';
        $mail->Mailer = 'smtp';
        $mail->AddReplyTo('support@xxxxx.com', 'xxxxx Support');
        $mail->From = 'xxxxx@gmail.com';
        $mail->FromName = 'xxxxx Applications';
        $mail->Sender = 'xxxxx Applications';
        $mail->Priority = 3;

        //To us
        $mail->AddAddress('xxxxx@xxxxx.com', 'xxxxx xxxxx');
        //To Applicant
        $mail->AddAddress($email, $first_name.''.$last_name);
        $mail->IsHTML(true);

        $last_4_digits = substr($card_num, -4);
        //build email contents

        $mail->Subject = 'Application From '.$first_name.' '.$last_name;
        $mail->Body    = $body_html;
        $mail->AltBody = $body_text;

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

3 回答 3

22

通过设置

        $mail->SMTPDebug = false;

而不是完全省略该行,它每次都有效。

于 2013-09-18T10:44:13.060 回答
2

我认为您使用的是过时版本的 phpmailer,请使用 composer 安装。检查 PHP 邮件程序的版本是 6.4+

以下是如何使用 composer 安装最新版本的示例。

composer require phpmailer/phpmailer

当您查看官方存储库代码时 - 第 402 行

https://github.com/PHPMailer/PHPMailer/blob/master/src/PHPMailer.php

您会看到 $SMTPDebug 设置为 0,因此这不是它静默失败的原因。

public $SMTPDebug = 0;

下面提供了使用 phpmailer 发送电子邮件的示例指南。这个例子对我有用,没有使用未指定的 SMTPDEBUG。此外,PHPMailer(true) 启用了异常,这很有用,因此它不会静默失败。

    //Load Composer's autoloader
    require 'vendor/autoload.php';
    
    //Instantiation and passing `true` enables exceptions
    $mail = new PHPMailer(true);
    
    try {
       
 //Server settings


        $mail->isSMTP();                                            //Send using SMTP
        $mail->Host       = 'smtp.example.com';                     //Set the SMTP server to send through
        $mail->SMTPAuth   = true;                                   //Enable SMTP authentication
        $mail->Username   = 'user@example.com';                     //SMTP username
        $mail->Password   = 'secret';                               //SMTP password
        $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;         //Enable TLS encryption; `PHPMailer::ENCRYPTION_SMTPS` encouraged
        $mail->Port       = 587;                                    //TCP port to connect to, use 465 for `PHPMailer::ENCRYPTION_SMTPS` above
    
        //Recipients
        $mail->setFrom('from@example.com', 'Mailer');
        $mail->addAddress('joe@example.net', 'Joe User');     //Add a recipient
        $mail->addAddress('ellen@example.com');               //Name is optional
        $mail->addReplyTo('info@example.com', 'Information');
        $mail->addCC('cc@example.com');
        $mail->addBCC('bcc@example.com');
    
        //Attachments
        $mail->addAttachment('/var/tmp/file.tar.gz');         //Add attachments
        $mail->addAttachment('/tmp/image.jpg', 'new.jpg');    //Optional name
    
        //Content
        $mail->isHTML(true);                                  //Set email format to HTML
        $mail->Subject = 'Here is the subject';
        $mail->Body    = 'This is the HTML message body <b>in bold!</b>';
        $mail->AltBody = 'This is the body in plain text for non-HTML mail clients';
    
        $mail->send();
        echo 'Message has been sent';
    } catch (Exception $e) {
        echo "Message could not be sent. Mailer Error: {$mail->ErrorInfo}";
    }
于 2021-04-26T10:52:50.247 回答
0

要提供有关问题的更多详细信息:

省略 SMTPDebug 信息时邮件不发送的原因是什么?

由于未指定使用的 PHPMailer 版本,我尝试使用问题时的最新版本,即2013 年 9 月 12 日发布的v5.2.7,但我也尝试了最旧的非开发版本5.2.2(在 packagist 上可用)以及介于两者之间的所有内容(v5.2.4、v5.2.5 和 v5.2.6)。

我无法复制该问题,因此它很可能不是由省略SMTPDebugPHPMailer 中的参数引起的,除非其他依赖项、操作系统或 PHP 版本在问题中起作用,但没有详细信息,无法确定。

在这些旧版本中,SMTPDebug参数的使用方式如下

/**
 * SMTP class debug output mode.
 * Options: 0 = off, 1 = commands, 2 = commands and data
 * @type int
 * @see SMTP::$do_debug
 */
public $SMTPDebug = 0;

...

protected function edebug($str)
{
    if (!$this->SMTPDebug) {
        return;
    }
...

用于edebug简单调试日志记录的位置:

$this->edebug($e->getMessage() . "\n");

因此,由于省略SMTPDebug.

如果赏金放置者仍有问题,请尝试@mahen3d 的建议或提出新问题,提供reprex

于 2021-04-29T22:31:30.473 回答