Smtp 在phpmailer中为凭据使用$\u ENV时发生smpt错误

Smtp 在phpmailer中为凭据使用$\u ENV时发生smpt错误,smtp,environment-variables,phpmailer,Smtp,Environment Variables,Phpmailer,使用硬编码用户名/电子邮件/密码时,我可以通过phpmailer发送消息。但是,当我使用$_ENV隐藏凭据时,会出现如下所示的smtp错误: 2020-09-08 15:50:51 SERVER -> CLIENT: 220 dd45234.kasserver.com ESMTP 2020-09-08 15:50:51 CLIENT -> SERVER: EHLO browsegenres-f3.loc 2020-09-08 15:50:51 SERVER -

使用硬编码用户名/电子邮件/密码时,我可以通过phpmailer发送消息。但是,当我使用$_ENV隐藏凭据时,会出现如下所示的smtp错误:

    2020-09-08 15:50:51 SERVER -> CLIENT: 220 dd45234.kasserver.com ESMTP
    2020-09-08 15:50:51 CLIENT -> SERVER: EHLO browsegenres-f3.loc
    2020-09-08 15:50:51 SERVER -> CLIENT: 250-dd45234.kasserver.com250-PIPELINING250-SIZE 102400000250-VRFY250-ETRN250-STARTTLS250-AUTH PLAIN LOGIN250-AUTH=PLAIN LOGIN250-ENHANCEDSTATUSCODES250-8BITMIME250 DSN
    2020-09-08 15:50:51 CLIENT -> SERVER: STARTTLS
    2020-09-08 15:50:51 SERVER -> CLIENT: 220 2.0.0 Ready to start TLS
    2020-09-08 15:50:51 CLIENT -> SERVER: EHLO xxxxxxxxxxxxxxxxxxxx.loc
    2020-09-08 15:50:51 SERVER -> CLIENT: 250-xxxxxxxx.[SERVER].com250-PIPELINING250-SIZE 102400000250-VRFY250-ETRN250-AUTH PLAIN LOGIN250-AUTH=PLAIN LOGIN250-ENHANCEDSTATUSCODES250-8BITMIME250 DSN
    2020-09-08 15:50:51 CLIENT -> SERVER: AUTH LOGIN
    2020-09-08 15:50:51 SERVER -> CLIENT: 334 VXNlcm5hbWU6
    2020-09-08 15:50:51 CLIENT -> SERVER: [credentials hidden]
    2020-09-08 15:50:53 SERVER -> CLIENT: 535 5.7.8 Error: authentication failed: VXNlcm5hbWU6
    2020-09-08 15:50:53 SMTP ERROR: Username command failed: 535 5.7.8 Error: authentication failed: VXNlcm5hbWU6
    SMTP Error: Could not authenticate.
    2020-09-08 15:50:53 CLIENT -> SERVER: QUIT
    2020-09-08 15:50:53 SERVER -> CLIENT: 221 2.0.0 Bye
    SMTP Error: Could not authenticate.
    Message could not be sent. Mailer Error: SMTP Error: Could not authenticate.
我不想硬编码凭证。你知道如何消除这个错误吗

代码如下:

//启动phpMailer $mail=新的PHPMailer(true)

//请参阅配置文件
$mailSenderName=$_ENV['MAILER_CONTACT_USERNAME'];
$masterPassword=$\u ENV['MAILER\u CONTACT\u PASSWORD'];
$masterEmail=$_ENV['MAILER_CONTACT_EMAIL'];
$recipient=$_ENV['MAILER_CONTACT_recipient'];
试一试{
//服务器设置
$mail->SMTPDebug=SMTP::调试服务器;
$mail->isSMTP();
$mail->Host='xxxxxxx.[SERVER].com';
$mail->SMTPAuth=true;
$mail->Username=$masterEmail;
$mail->Password=$masterPassword;
$mail->SMTPSecure=PHPMailer::ENCRYPTION\u STARTTLS;
$mail->Port=25;
//接受者
$mail->setFrom('aaa@bbbbbbbbbbb.com","aabbcc",;
$mail->addAddress('mmmmmmmmm@bbbbbbbbbbb.com');
//内容
$mail->isHTML(true);
$mail->Subject='收到的邮件(联系人页面)';
$emailbody=
'有一条新消息来自:
'。 “====================================================
”。 $senderName。“
”。
$senderEmail.'一次调试一件事。当你知道自己在问题出现之前就知道自己有问题时,查看电子邮件中的错误是没有意义的。PHPMailer会使用你给它的任何东西,所以你需要确保你给它的东西是正确的

在这种情况下,您可以通过将代码缩减为:

var_dump($_ENV);
一旦您知道您正在正确设置
$\u ENV
的内容(无论是从真实的ENV变量、脚本、php.ini配置等),您就可以开始使用电子邮件代码中的值了。

在安装dotenv(vlucas)后,我只是没有将其正确地包含在我的ContactController中。这就是为什么var\u dump($\u ENV)总是导致NULL。我将我的设置与另一个路由(NewsletteController)进行了比较。区别在于,在此路由中,我查询数据库,在模型构造函数(设置了db连接)中,我正确地“使用”了dotenv类,这就是$\u ENV充满数据的原因。我只是没有看到它

因此,在ContactController中,我设置:

    use \Dotenv;
在初始化phpmailer之后,我添加了:

            $mail = new PHPMailer(true);
            
            $dotenv = Dotenv\Dotenv::createImmutable($_SERVER['DOCUMENT_ROOT']);
            $dotenv->load();
模型类的差异(数据库连接):


好的,谢谢。var_转储第一个___u转储($\u ENV['MAILER\u CONTACT\u USERNAME');exit()结果为NULL;为什么为NULL?我在另一个文件中使用相同的方法,但效果很好,因为您用于将数据获取到env中的任何机制都不起作用。您如何设置这些值?env文件不会自动读取。您需要一些东西来读取它们。框架通常会为您这样做。基本上是这样的您需要修复的是这些指令的读取,而不是期望它们工作的脚本。这些指令只是说明超全局函数的求值顺序,与放入它们的顺序无关。是的,如果E不在那里,您将无法在$\u ENV中获得任何内容,但它仍然不会影响数据如何进入其中。我会选择Dotenv。很高兴您你能帮我把答案记下来吗?
            $mail = new PHPMailer(true);
            
            $dotenv = Dotenv\Dotenv::createImmutable($_SERVER['DOCUMENT_ROOT']);
            $dotenv->load();
            namespace Models;

            use \Dotenv;

            abstract class Model
            {
                protected $db;

                public function __construct()
                {
                    $dotenv = Dotenv\Dotenv::createImmutable($_SERVER['DOCUMENT_ROOT']);
                    $dotenv->load();

                    $this->db = new \DB\SQL(
                        'mysql:host='. $_ENV['DB_HOST'] .';port='.$_ENV['DB_PORT'].';dbname='.$_ENV['DB_NAME'],
                        $_ENV['DB_USERNAME'],
                        $_ENV['DB_PASSWORD']
                    );
                }
            }