我有一个Symfony 4.1项目,我希望能够在开发环境中发送邮件,但是当我执行命令php bin/console swiftmailer:email:send
时出现此错误:
在NewEmailCommand.php第76行:邮件程序“默认”不存在。
我认为这是我的配置存在问题,因为我的印象是,它在services.yaml中找不到默认邮件程序的密钥。
packages / dev / swiftmailer.yaml:
swiftmailer:
mailers:
no_reply:
delivery_address: test@yopmail.com
packages / swiftmailer.yaml:
swiftmailer:
default_mailer: no_reply
mailers:
no_reply:
url: '%env(MAILER_URL)%'
spool: { type: memory }
BaseController.php:
<?php
declare(strict_types = 1);
namespace App\Controller;
use Swift_Mailer;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
abstract class BaseController extends AbstractController
{
/**
* @var Swift_Mailer
*/
protected $swiftMailer;
public function __construct(Swift_Mailer $swiftMailer)
{
$this->swiftMailer = $swiftMailer;
}
}
我所有的控制器都来自BaseController.php
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Bundle\SwiftmailerBundle\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Style\SymfonyStyle;
/**
* A console command for creating and sending simple emails.
*
* @author Gusakov Nikita <dev@nkt.me>
*/
class NewEmailCommand extends AbstractSwiftMailerCommand
{
protected static $defaultName = 'swiftmailer:email:send';
/** @var SymfonyStyle */
private $io;
/**
* {@inheritdoc}
*/
protected function configure()
{
$this
->setName(static::$defaultName) // BC with 2.7
->setDescription('Send simple email message')
->addOption('from', null, InputOption::VALUE_REQUIRED, 'The from address of the message')
->addOption('to', null, InputOption::VALUE_REQUIRED, 'The to address of the message')
->addOption('subject', null, InputOption::VALUE_REQUIRED, 'The subject of the message')
->addOption('body', null, InputOption::VALUE_REQUIRED, 'The body of the message')
->addOption('mailer', null, InputOption::VALUE_REQUIRED, 'The mailer name', 'default')
->addOption('content-type', null, InputOption::VALUE_REQUIRED, 'The body content type of the message', 'text/html')
->addOption('charset', null, InputOption::VALUE_REQUIRED, 'The body charset of the message', 'UTF8')
->addOption('body-source', null, InputOption::VALUE_REQUIRED, 'The source where body come from [stdin|file]', 'stdin')
->setHelp(
<<<EOF
The <info>%command.name%</info> command creates and sends a simple email message.
<info>php %command.full_name% --mailer=custom_mailer --content-type=text/xml</info>
You can get body of message from a file:
<info>php %command.full_name% --body-source=file --body=/path/to/file</info>
EOF
);
}
/**
* {@inheritdoc}
*/
protected function initialize(InputInterface $input, OutputInterface $output)
{
$this->io = new SymfonyStyle($input, $output);
$this->io->title('SwiftMailer\'s Interactive Email Sender');
}
/**
* {@inheritdoc}
*/
protected function execute(InputInterface $input, OutputInterface $output)
{
$mailerServiceName = sprintf('swiftmailer.mailer.%s', $input->getOption('mailer'));
if (!$this->getContainer()->has($mailerServiceName)) {
throw new \InvalidArgumentException(sprintf('The mailer "%s" does not exist.', $input->getOption('mailer')));
}
switch ($input->getOption('body-source')) {
case 'file':
$filename = $input->getOption('body');
$content = file_get_contents($filename);
if (false === $content) {
throw new \Exception(sprintf('Could not get contents from "%s".', $filename));
}
$input->setOption('body', $content);
break;
case 'stdin':
break;
default:
throw new \InvalidArgumentException('Body-input option should be "stdin" or "file".');
}
$message = $this->createMessage($input);
$mailer = $this->getContainer()->get($mailerServiceName);
$sentMessages = $mailer->send($message);
$this->io->success(sprintf('%s emails were successfully sent.', $sentMessages));
}
/**
* {@inheritdoc}
*/
protected function interact(InputInterface $input, OutputInterface $output)
{
foreach ($input->getOptions() as $option => $value) {
if (null === $value) {
$input->setOption($option, $this->io->ask(sprintf('%s', ucfirst($option))));
}
}
}
/**
* {@inheritdoc}
*/
public function isEnabled()
{
return $this->getContainer()->has('mailer');
}
/**
* Creates new message from input options.
*
* @param InputInterface $input An InputInterface instance
*
* @return \Swift_Message New message
*/
private function createMessage(InputInterface $input)
{
$message = new \Swift_Message(
$input->getOption('subject'),
$input->getOption('body'),
$input->getOption('content-type'),
$input->getOption('charset')
);
$message->setFrom($input->getOption('from'));
$message->setTo($input->getOption('to'));
return $message;
}
}
第76行:
throw new \InvalidArgumentException(sprintf('The mailer "%s" does not exist.', $input->getOption('mailer')));
的输出
php bin /控制台debug:container
您知道我的问题可能来自哪里吗?
答案 0 :(得分:0)
检查php bin/console debug:container
列出的服务列表,没有名为swiftmailer.mailer.default
的服务,可以使用swiftmailer.mailer
或swiftmailer.mailer.no_reply
。
答案 1 :(得分:0)
我通过
解决了这个错误swiftmailer:
default_mailer: default
mailers:
default:
url: '%env(MAILER_URL)%'
spool: { type: memory }