如何在Symfony Mailer中配置多个SMTP邮件发送服务器
Symfony Mailer多SMTP服务器配置方案
Symfony 5.2及以上版本原生支持多邮件传输配置,无需自定义扩展,配置方法如下:
1. 修改mailer配置文件
编辑config/packages/mailer.yaml,使用transports字段定义多个SMTP传输:
framework: mailer: # 定义多个传输实例,键名可自定义 transports: default: '%env(MAILER_DSN1)%' second: '%env(MAILER_DSN2)%' # 指定全局默认使用的传输 default_transport: default
2. 配置环境变量
在.env文件中添加对应两个SMTP的DSN配置:
# 第一个SMTP服务器配置 MAILER_DSN1=smtp://用户名1:密码1@smtp1.example.com:587 # 第二个SMTP服务器配置 MAILER_DSN2=smtp://用户名2:密码2@smtp2.example.com:587
3. 不同SMTP的调用方式
使用默认传输
和原有单DSN用法完全一致,直接注入MailerInterface发送即可,自动使用default_transport指定的传输:
use Symfony\Component\Mailer\MailerInterface; use Symfony\Component\Mime\Email; public function sendDefaultEmail(MailerInterface $mailer) { $email = (new Email()) ->from('sender@example.com') ->to('user@example.com') ->subject('默认传输测试') ->text('测试内容'); $mailer->send($email); }
使用指定传输
有两种常用调用方式:
- 方式1:给邮件添加
X-Transport头指定传输名
use Symfony\Component\Mailer\MailerInterface; use Symfony\Component\Mime\Email; public function sendSecondEmail(MailerInterface $mailer) { $email = (new Email()) ->from('sender@example.com') ->to('user@example.com') ->subject('第二传输测试') ->text('测试内容'); // 指定使用second传输 $email->getHeaders()->addTextHeader('X-Transport', 'second'); $mailer->send($email); }
- 方式2:通过传输定位器直接获取指定传输实例
use Symfony\Component\Mailer\Transport\TransportLocatorInterface; use Symfony\Component\Mime\Email; public function sendSecondEmail(TransportLocatorInterface $transportLocator) { // 直接获取second传输实例 $secondTransport = $transportLocator->get('second'); $email = (new Email()) ->from('sender@example.com') ->to('user@example.com') ->subject('第二传输测试') ->text('测试内容'); $secondTransport->send($email); }
低版本兼容(Symfony <5.2)
如果使用的Symfony版本低于5.2没有原生多传输支持,可以自定义两个Mailer服务实现,在config/services.yaml中添加配置:
services: # 第一个SMTP对应的Mailer服务 app.mailer.default: class: Symfony\Component\Mailer\Mailer arguments: $transport: '@Symfony\Component\Mailer\Transport\TransportInterface $defaultTransport' # 第二个SMTP对应的Mailer服务 app.mailer.second: class: Symfony\Component\Mailer\Mailer arguments: $transport: '@Symfony\Component\Mailer\Transport\TransportInterface $secondTransport'
在需要使用的地方注入对应别名的服务即可。
内容的提问来源于stack exchange,提问作者Andrii Sukhoi
相关产品推荐
相关产品推荐

