Php “如何禁用”;验证“对等”;使用Symfony Mailer组件?
我正在配置一个带有自签名证书的邮件服务器(postfix),而这个自签名证书似乎是Symfony Mailer组件的一个问题 在Swiftmailer上,使用一些配置,例如:Php “如何禁用”;验证“对等”;使用Symfony Mailer组件?,php,symfony,symfony4,symfony-mailer,Php,Symfony,Symfony4,Symfony Mailer,我正在配置一个带有自签名证书的邮件服务器(postfix),而这个自签名证书似乎是Symfony Mailer组件的一个问题 在Swiftmailer上,使用一些配置,例如: transport: stream_options: ssl: allow_self_signed: true 或 可能会修复它,但我无法在mailer上找到这样做的方法(如果可能的话,我希望使用YAML配置文件) 此选项将在已合并到主控中的文件被标记并释放时启用 因此,您
transport:
stream_options:
ssl:
allow_self_signed: true
或
可能会修复它,但我无法在mailer上找到这样做的方法(如果可能的话,我希望使用YAML配置文件) 此选项将在已合并到主控中的文件被标记并释放时启用 因此,您似乎必须等待下一个Symfony发行版(该版本已合并到5.1分支中,因此看起来它在4.x分支中根本不可用),然后您可以通过向Mailer DSN配置中添加
verify_peer
来完成此操作
您可以定期配置Mailer(通常在.env
文件之一上设置值就足够了)
在不久的将来,您将能够做到这一点:
MAILER_DSN=smtp://user:pass@localhost?verify_peer=false
但是现在(从4.4.4和5.0.4开始),您无法使用Symfony Mailer以本机方式完成此操作。不幸的是,请验证@yivi正确说明的Symfony 4.4中没有对等功能 我尝试将composer中的symfony/mailer更新为dev master,但symfony flex约束不允许这样做,因为: 将“symfony/symfony”中列出的包限制为“4.4.*” 因此,我最终覆盖了
mailer.transport\u factory.smtp
:
mailer.transport_factory.smtp:
class: App\Mailer\EsmtpTransportFactory
tags:
- { name: 'mailer.transport_factory', priority: "-100" }
使用包含此功能的自定义ESMTPTTransportFactory:
<?php
namespace App\Mailer;
use Symfony\Component\Mailer\Transport\AbstractTransportFactory;
use Symfony\Component\Mailer\Transport\Dsn;
use Symfony\Component\Mailer\Transport\Smtp\EsmtpTransport;
use Symfony\Component\Mailer\Transport\TransportInterface;
final class EsmtpTransportFactory extends AbstractTransportFactory
{
public function create(Dsn $dsn): TransportInterface
{
$tls = 'smtps' === $dsn->getScheme() ? true : null;
$port = $dsn->getPort(0);
$host = $dsn->getHost();
$transport = new EsmtpTransport($host, $port, $tls, $this->dispatcher, $this->logger);
if (!$dsn->getOption('verify_peer', true)) {
/** @var SocketStream $stream */
$stream = $transport->getStream();
$streamOptions = $stream->getStreamOptions();
$streamOptions['ssl']['verify_peer'] = false;
$streamOptions['ssl']['verify_peer_name'] = false;
$stream->setStreamOptions($streamOptions);
}
if ($user = $dsn->getUser()) {
$transport->setUsername($user);
}
if ($password = $dsn->getPassword()) {
$transport->setPassword($password);
}
return $transport;
}
protected function getSupportedSchemes(): array
{
return ['smtp', 'smtps'];
}
}
我想如果将此功能移植到4.4会更好,但只要我使用此解决方法。您可以使用:
MAILER_DSN="smtp://user:pass@localhost?encryption=ssl&stream_options[ssl][verify_peer]=false&stream_options[ssl][verify_peer_name]=false&stream_options[ssl][allow_self_signed]=true"
最简单的解决方案是显式指定端口:
MAILER_DSN=smtp://127.0.0.1:25
看起来很完美!但它似乎还没有被贴上标签,是吗?我目前在4.4上,没有可用的更新,我没有这个…你是对的,它似乎没有被合并。它存在于上,但不存在于上。我将修改答案以反映这一点。我确信4.4.5应该尽快发布。你的意思是这个问题将在4.4.5中解决,而不是在4.4.4中解决?因为我有同样的问题,我使用的是最后一个lTS(4.4.4)@hous-Yup,正如答案和评论中所解释的;4.4.4尚未包括此功能。因为它已经合并到master,下一个版本应该包括它。@yivi,是的,我会的;)但是你知道4.4.5什么时候发布吗?因为我要用4.4.4做一个项目,在迁移到5.2之前,我不喜欢使用SwiftMailerThanks来解决这个工作环境,我没有投票反对或关闭您的其他问题。。。我真的很讨厌人们那样做。。。
MAILER_DSN="smtp://user:pass@localhost?encryption=ssl&stream_options[ssl][verify_peer]=false&stream_options[ssl][verify_peer_name]=false&stream_options[ssl][allow_self_signed]=true"
MAILER_DSN=smtp://127.0.0.1:25