2019 无法调用未创建 PHPMailer 版本 6.0.7 实例的新 PHPMailer

Posted

技术标签:

【中文标题】2019 无法调用未创建 PHPMailer 版本 6.0.7 实例的新 PHPMailer【英文标题】:2019 Failed to call to new PHPMailer that does not create an instance of PHPMailer Version 6.0.7 【发布时间】:2019-10-25 22:05:39 【问题描述】:

调用新的 phpMailer 失败并且没有创建 PHPMailer 的实例。 $mail->SMTPDebug 的设置创建了一个 stdClass 实例,然后在其上调用不存在的方法(isSMTP)失败。所以这一切都归结为实例创建失败。 PHPMailer 6.0.7 版实时托管服务

我试过 $mail = new stdClass(); 或 $mail = NULL;这是症状修复,但不是原因,导致我的页面每次加载时都会发送一封电子邮件。

 <?php 
    use PHPMailer\PHPMailer\PHPMailer;
    use PHPMailer\PHPMailer\Exception;
    require 'PHPMailer/Exception.php';
    require 'PHPMailer/PHPMailer.php';
    require 'PHPMailer/SMTP.php';


    if(isset($_POST[‘submit’]))

    $mail = new PHPMailer(true);

    $mail->SMTPDebug = 2; // 0 = off (for production use) - 1 = client messages - 2 = client and server messages
    $mail->isSMTP(); 

    $mail->Host = 'mail.email.org'; 
    $mail->SMTPSecure = 'ssl'; <-- Recommend by the hosting service 
    $mail->Port = 465; <-- Recommend by the hosting service <--Hosting Service Docs verify this
    $mail->SMTPAuth = true;
    $mail->Username = 'Mail@email.org';
    $mail->Password = 'Using the correct Password'; 


    $to = 'Mail@email.org'; <-- sending this to myself
    $from = 'Mail@email.org'; <--sending to myself


    $first_name = ((isset($_POST['FirstName']))&&(!is_null($_POST['FirstName'])))? $_POST['FirstName']:'';
    $last_name = ((isset($_POST['LastName']))&&(!is_null($_POST['LastName'])))? $_POST['LastName']:'';
    $email = ((isset($_POST['Email']))&&(!is_null($_POST['Email'])))? $_POST['Email']:'';
    $age = ((isset($_POST['Age']))&&(!is_null($_POST['Age'])))? $_POST['Age']:'';
    $student = ((isset($_POST['Student']))&&(!is_null($_POST['Student'])))? $_POST['Student']:'';
    $agree18 = ((isset($_POST['Agree18']))&&(!is_null($_POST['Agree18'])))? $_POST['Agree18']:'';


   /* Set the mail sender. */
    $mail->setFrom( $to , 'Research');

   /* Add a recipient. */
    $mail->addAddress( $_POST['Email'] , 'Research');
   /* Set the subject. */
    $mail->Subject = 'Learn More about Research Requested';

    $mail->ishtml(TRUE);
    $mail->Body = '<html> "First Name:" . $first_name . " Last Name:" . $last_name .  " Email:". $email . " Age:" . $age . " Student:" . $student . " Agree18:" . $agree18 . ""
</html>';


    $mail->AltBody = ' "First Name:" . $first_name . " Last Name:" . $last_name .  " Email:". $email . " Age:" . $age . " Student:" . $student . " Agree18:" . $agree18 . ""
';  

    if($mail->send())

      $msg="Your email msg has been send";


    else

       $msg="mail msg has not been send"; 
       echo 'Mailer Error: ' . $mail->ErrorInfo;
     
    ?>

希望找到失败原因的解决方案。

删除了我所有的代码,执行了同步声明并得到了这个:

object(PHPMailer\PHPMailer\PHPMailer)#1 (74) ["Priority"]=> NULL ["CharSet"]=> string(10) "iso-8859-1" ["ContentType"]=> string(10) "text/plain" ["Encoding"]=> string(4) "8bit" ["ErrorInfo"]=> string(0) "" ["From"]=> string(14) "root@ localhost" ["FromName"]=> string(9) "Root User" ["Sender"]=> string(0) "" ["Subject"]=> string(0) "" ["Body"]=>字符串(0)“”[“AltBody”]=>字符串(0)“”[“Ical”]=>字符串(0)“” ["MIMEBody":protected]=> string(0) "" ["MIMEHeader":protected]=> string(0) "" ["mailHeader":protected]=> string(0) "" ["WordWrap"] => int(0) ["Mailer"]=> string(4) "mail" ["Sendmail"]=> string(18) "/usr/sbin/sendmail" ["UseSendmailOptions"]=> bool(true) ["ConfirmReadingTo"]=> string(0) "" ["Hostname"]=> string(0) "" ["MessageID"]=> string(0) "" ["MessageDate"]=> string(0) "" ["主机"]=> 字符串(9) "本地主机" ["端口"]=> int(25) "Helo"]=> string(0) "" ["SMTPSecure"]=> string(0) "" ["SMTPAutoTLS"]=> bool(true) ["SMTPAuth"]=> bool(false) ["SMTPOptions "]=> array(0) ["Username"]=> string(0) "" ["Password"]=> string(0) "" ["AuthType"]=> string(0) "" [ "oauth":protected]=> NULL ["Timeout"]=> int(300) ["dsn"]=> string(0) "" ["SMTPDebug"]=> int(0) ["Debugoutput"]= > string(4) "html" ["SMTPKeepAlive"]=> bool(false) ["SingleTo"]=> bool(false) ["SingleToArray":protected]=> array(0) ["do_verp"]=> bool(false) ["AllowEmpty"]=> bool(false) ["DKIM_selector"]=> string(0) "" ["DKIM_identity"]=> string(0) "" ["DKIM_passphrase"]=> string(0) "" ["DKIM_domain"]=> string(0) "" ["DKIM_copyHeaderFields"]=> bool(true) ["DKIM_extraHeaders"]=> 数组(0) ["DKIM_private"]=> 字符串(0) "" ["DKIM_private_string"]=> 字符串(0) "" ["action_function"]=> 字符串(0) “” "XMailer"]=> 字符串(0) "" ["smtp":protected]=> NULL ["to":protected]=> 数组(0) ["cc":protected]=> 数组(0) ["bcc":protected]=> array(0) ["ReplyTo":protected]=> array(0) ["all_recipients":protected]=> array(0) ["RecipientsQueue ":protected]=> array(0) ["ReplyToQueue":protected]=> array(0) ["attachment":protected]=> array(0) ["CustomHeader":protected]= > 数组(0) "lastMessageID":protected]=> string(0) "" ["message_type":protected]=> string(0) "" ["boundary":protected]=> array(0) ["language":protected ]=> array(0) ["error_count":protected]=> int(0) ["sign_cert_file":protected]=> string(0) "" ["sign_key_file":protected]=> string(0) "" ["sign_extracerts_file":protected]=> string(0) "" ["sign_key_pass":protected]=> string(0) "" ["exceptions":protected]=> bool(false) ["uniqueid":受保护]=> 字符串(0) ""

【问题讨论】:

【参考方案1】:

您忘记了 isset($_POST[...]) 条件后的括号。

if(isset($_POST['submit'])) 
    //                      ^^
    $mail = new PHPMailer(true);

    $mail->SMTPDebug = 2; // 0 = off (for production use) - 1 = client messages - 2 = client and server messages
    $mail->isSMTP(); 
    ...

// of course, don'f forget to add a closing one too here.

【讨论】:

问题是当我添加 时,它没有向我发送任何电子邮件。如果我删除它并添加 $mail = new stdClass();或 $mail = NULL; , 它给我发电子邮件。如果我两者都做,它不会给我发电子邮件。已经重新下载了 PHPMailer 文件,没有任何变化。 @TD00:括号在里面是正确的。因此,请检查您的表单中是否有任何带有name=submit 的输入/按钮。如果是这样,您在密钥周围使用了错误的引号。它必须是$_POST['submit'] 而不是$_POST[‘submit’](我的回答中有很好的引用)。 这两件事都出现在the original question discussion。 @Synchro:真的不要检查聊天,只使用此处发布的信息和代码。【参考方案2】:

这是 your previous question 的副本,但标题不同。

当您的代码不起作用时,将其缩减为最小示例,以便排除歧义的机会,并启用详细、可见的错误报告:

use PHPMailer\PHPMailer\PHPMailer;
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
require 'PHPMailer/PHPMailer.php';
$mail = new PHPMailer;
var_dump($mail);

如果这不起作用,更复杂的脚本也不会起作用。如果此操作失败,我怀疑您的 PHP 安装存在严重问题,至少我希望看到一些警告记录。

【讨论】:

没有 SMTP 文件致命错误:未捕获的错误:在 /PHPMailer/PHPMailer.php:1759 中找不到类 'PHPMailer\PHPMailer\SMTP' 堆栈跟踪:#0 /PHPMailer/PHPMailer.php(1884) : PHPMailer\PHPMailer\PHPMailer->getSMTPInstance() #1 /PHPMailer/PHPMailer.php(1797): PHPMailer\PHPMailer\PHPMailer->smtpConnect(Array) #2 l/PHPMailer/PHPMailer.php(1539): PHPMailer\PHPMailer PHPMailer->smtpSend('Date: Tue, 11 J...', ' "First N...') #3 /PHPMailer/PHPMailer.php(1375): PHPMailer\PHPMailer\PHPMailer->postSend( ) #4 (69): PHPMailer\PHPMailer\PHPMailer->send() #5 main 在 PHPMailer/PHPMailer.php 第 1759 行抛出 相对于您的其他脚本,这实际上是一个积极的信号!尝试为它添加 SMTP use 语句和 require 我需要添加一个使用 PHPMailer\PHPMailer\SMTP; 吗?因为我没有在组织代码中。 我添加了 use SMTP 行,它似乎有效。我不知道这是必需的,但我所有的错误都消失了,它建立了连接并发送了。我不确定这是否是修复?我会玩弄它并确认。 严格来说,您不需要 SMTP 类的 use 语句,因为它从未在您的代码中直接引用。不过,您将需要require。很高兴它对你有效;如果此答案帮助您解决了问题,请将此答案标记为此类(单击复选标记)。【参考方案3】:

已修复 感谢 Synchro --> 并感谢 Panthers 的输入

添加使用 PHPMailer\PHPMailer\SMTP;

对于 PHPMailer 6.0.7 的工作示例,请查找 Synchro 的 这是您之前问题的重复,但标题不同。

【讨论】:

以上是关于2019 无法调用未创建 PHPMailer 版本 6.0.7 实例的新 PHPMailer的主要内容,如果未能解决你的问题,请参考以下文章

如何在xampp上使用phpmailer发送邮件

phpmailer无法发送电子邮件

为啥 PHPMailer 无法连接到我的 SMTP 服务器

无法通过 gmail 从新创建的电子邮件中使用 phpMailer 发送 SMTP 邮件 [重复]

PHPMailer邮件未发送=>许多错误[重复]

PHPMailer 电子邮件发送成功但未收到 (EC2)