首页 > 解决方案 > 从控制台发送的电子邮件中的链接未正确呈现

问题描述

我有以下代码发送我的电子邮件:

/**
 * @param array $to
 * @param string $subject
 * @param array $vars
 * @param string $template
 * @param array $from
 */
public function sendEmail(array $to, $subject, array $vars, $template = 'default', array $from = ['dev@example.com' => 'Online'])
{
    $transport = 'default';
    if (Configure::read('debug')) {
        $transport = 'dev';
    }
    $mailer = new Email($transport);
    if ($this->isCommandLineInterface()) {
        $mailer->setDomain('http://local.peepznew.com');
    }
    $this->addRecipients($mailer, $to);
    $mailer->setFrom($from);
    $mailer->setSubject($subject);
    $mailer->setTemplate($template);
    if (isset($vars['preheaderText']) === false) {
        $vars['preheaderText'] = '';
    }
    $vars['subject'] = $subject;
    $mailer->setViewVars($vars);
    $mailer->setEmailFormat('both');
    $mailer->send();
}

从 Web 界面和命令行调用此代码。在努力让完整的 url 显示在从命令行发送的消息中之后,我阅读了文档并遇到了这个

在此处输入图像描述

这就是我进行 setDomain 调用的原因。我再次运行我的代码,它仍然没有完整的 URL。所以我在 web 界面和 cli 中创建了完全相同的函数,如下所示:

$this->sendEmail(
    ['my.email@example.com'],
    'Test Email',
    [
        'title' => 'We need to select another peep',
        'showFooterLinks' => true,
    ]
);
die;

默认模板看起来像这样(它实际上只有这一行):

echo $this->Html->link('test link', ['controller' => 'jobs', 'action' => 'select_staff', 1, '_full' => true]);

来自网络界面的电子邮件,使用上面的代码,发送完美。完整的 URL 和一切。但是从 cli 中,它只是发送/jobs/select_staff/1.

为什么会这样,我该如何解决?

标签: cakephpcommand-line-interfacecakephp-3.x

解决方案


仔细阅读文档,他们说setDomain()在生成消息 ID 时正在使用域设置,即在电子邮件标头中使用它。

生成链接是完全不同的事情,并受App.fullBaseUrl配置选项的影响,默认情况下,该选项派生自env('HTTP_HOST')您的应用程序config/bootstrap.php,除非已经在config/app.php.

也可以在config/bootstrap_cli.php文件中为 CLI 环境单独配置基本 URL,应该已经有一个注释片段,如下所示:

// Set the fullBaseUrl to allow URLs to be generated in shell tasks.
// This is useful when sending email from shells.
//Configure::write('App.fullBaseUrl', php_uname('n'));

也可以看看


推荐阅读