首页 > 解决方案 > CakePHP Mailer “未知的电子邮件配置”错误

问题描述

从 CakePHP 3 升级到 4 后,Mailer 出现问题。这是我的配置的相关部分:

<?php

return [
    'EmailTransport' => [
        'default' => [
            'className' => 'Mail',
            'host' => 'localhost',
            'port' => 25,
            'timeout' => 30,
            'username' => 'user',
            'password' => 'password',
            'client' => null,
            'tls' => null,
            'url' => env('EMAIL_TRANSPORT_DEFAULT_URL', null),
        ],
        'cronjob' => [
            'className' => 'Mail',
        ],
        'accounts' => [
            'className' => 'Mail',
        ],
    ],

    'Email' => [
        'default' => [
            'transport' => 'default',
            'from' => 'you@localhost',
        ],
        'cronjob' => [
            'transport' => 'cronjob',
            'from' => 'cronjob@foobar.com',
        ],
        'accounts' => [
            'transport' => 'accounts',
            'from' => 'accounts@foobar.com',
        ],
    ],
];

这是导致错误的代码段:

    private function sendActivationEmail(User $user)
    {
        $url = Router::url([
            'prefix' => 'Admin',
            'plugin' => 'UserManager',
            'controller' => 'Users',
            'action' => 'activate',
            $user->username,
            $user->activation_key,
        ], true);

        debug(Configure::read('EmailTransport'));
        debug(Configure::read('Email'));

        $mailer = new Mailer('accounts');
        $mailer->setFrom(['accounts@foobar.com' => 'Foobar Website Manager'])
            ->setTo($user->email, $user->fullName)
            ->setSubject('Please activate your account')
            ->setEmailFormat('html')
            ->setViewVars(compact('url', 'user'))
            ->viewBuilder()
                ->setTemplate('UserManager.register');

        return $mailer->deliver();
    }

错误是Unknown email configuration "accounts".,抛出 错误

这两个debug函数的输出如下:

/vendor/plugins/usermanager/src/Model/Table/UsersTable.php (line 72)
[
    'default' => [
        'className' => 'Mail'
    ],
    'cronjob' => [
        'className' => 'Mail'
    ],
    'accounts' => [
        'className' => 'Mail'
    ]
]

/vendor/plugins/usermanager/src/Model/Table/UsersTable.php (line 73)
[
    'default' => [
        'transport' => 'default',
        'from' => 'something@foobar.com'
    ],
    'cronjob' => [
        'transport' => 'cronjob',
        'from' => 'cronjob@foobar.com'
    ],
    'accounts' => [
        'transport' => 'accounts',
        'from' => 'accounts@foobar.com'
    ]
]

因此,邮件配置中似乎accounts存在密钥,那么为什么会出现此错误?

标签: phpcakephpphp-7cakephp-4.x

解决方案


确保您在bootstrap.php此过程中相应地升级了您的产品,特别是关于如何EmailTransportEmail正在使用的,如果我没记错的话,这是在 CakePHP 3.7 和 4.1 中引入的:

TransportFactory::setConfig(Configure::consume('EmailTransport'));
Mailer::setConfig(Configure::consume('Email'));

https://github.com/cakephp/app/blob/4.2.2/config/bootstrap.php#L163-L164


推荐阅读