为啥 swiftmailer 不采用环境变量?

Posted

技术标签:

【中文标题】为啥 swiftmailer 不采用环境变量?【英文标题】:Why won't swiftmailer take the env vars?为什么 swiftmailer 不采用环境变量? 【发布时间】:2019-06-19 09:39:44 【问题描述】:

我正在尝试将 swiftmailer 配置为使用 gmail 从我的 symfony4 应用程序、本地环境(Wamp、win10)发送电子邮件。

当我在 config/packages/swiftmailer.yaml 文件中添加我的所有参数时,配置运行良好,但一旦我尝试使用 .env 文件变量,它就不起作用并且我收到此错误:

14:01:11 DEBUG     [php] Warning: stream_socket_client(): SSL operation failed with code 1. OpenSSL Error messages:
error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed
[
  "exception" => Symfony\Component\Debug\Exception\SilencedErrorContext 
    +count: 1
    -severity: E_WARNING
    trace: 
      C:\wamp\www\crm-granger\vendor\swiftmailer\swiftmailer\lib\classes\Swift\Transport\StreamBuffer.php:267  …
      C:\wamp\www\crm-granger\vendor\swiftmailer\swiftmailer\lib\classes\Swift\Transport\StreamBuffer.php:58  …
    
  
]
14:01:11 DEBUG     [php] Warning: stream_socket_client(): Failed to enable crypto
14:01:11 DEBUG     [php] Warning: stream_socket_client(): unable to connect to ssl://smtp.gmail.com:465 (Unknown error)
14:01:11 ERROR     [app] Exception occurred while flushing email queue: Connection could not be established with host smtp.gmail.com [ #0]

作品:

config/packages/swiftmailer.yaml

swiftmailer:
    transport:        smtp
    username:         myemail@gmail.com
    password:         mypassword
    host:             smtp.gmail.com
    port:             465
    encryption:       ssl
    auth-mode:        login
    spool:  type: 'memory' 
    stream_options:
        ssl:
            allow_self_signed: true
            verify_peer: false
            verify_peer_name: false 

不起作用:

.env

MAILER_TRANSPORT=smtp
MAILER_HOST=smtp.gmail.com
MAILER_USERNAME=myemail@gmail.com
MAILER_PASSWORD=mypassword
MAILER_PORT=465
MAILER_ENCRYPTION=ssl

config/packages/swiftmailer.yaml

swiftmailer:
    transport:        '%env(MAILER_TRANSPORT)%'
    username:         '%env(MAILER_USERNAME)%'
    password:         '%env(MAILER_PASSWORD)%'
    host:             '%env(MAILER_HOST)%'
    port:             '%env(MAILER_PORT)%'
    encryption:       '%env(MAILER_ENCRYPTION)%'
    auth-mode:        login
    spool:  type: 'memory' 
    stream_options:
        ssl:
            allow_self_signed: true
            verify_peer: false
            verify_peer_name: false 

当我这样做时,变量会出现并且设置得很好:

php bin/console about
bin/console debug:config swiftmailer

给我这个:

Current configuration for extension with alias "swiftmailer"
============================================================

swiftmailer:
    default_mailer: default
    mailers:
        default:
            transport: '%env(MAILER_TRANSPORT)%'
            username: '%env(MAILER_USERNAME)%'
            password: '%env(MAILER_PASSWORD)%'
            host: '%env(MAILER_HOST)%'
            port: '%env(MAILER_PORT)%'
            encryption: '%env(MAILER_ENCRYPTION)%'
            auth_mode: login
            spool:
                type: memory
                path: 'C:\wamp\www\my-project\var\cache\dev/swiftmailer/spool'
                id: null
            stream_options:
                ssl:
                    allow_self_signed: true
                    verify_peer: false
                    verify_peer_name: false
            delivery_addresses:
                - myemail@gmail.com
            url: null
            command: '/usr/sbin/sendmail -bs'
            timeout: 30
            source_ip: null
            local_domain: null
            logging: true
            delivery_whitelist:   

我做错了什么?

【问题讨论】:

您的swiftmailer.yaml 文件中可能缺少spool: type: memory (那个明显不起作用的文件) auth-mode 不见了? 不,那些参数都设置好了,我只是没有重写... 嗯,很奇怪——我一直这样做,而且效果很好。 bin/console debug:config swiftmailer的结果是什么??? 当您使用 MAILER_URL 约定时,电子邮件是否有效? 【参考方案1】:

您的 yaml 文件将覆盖 .env 文件。 所以保持 Yaml 配置。它更加详细和合乎逻辑。

【讨论】:

【参考方案2】:

没有愚蠢的配置解析器和使用环境时

        stream_options:
            ssl:
                allow_self_signed: true
                verify_peer: false
                verify_peer_name: false

还有更多被忽略...

【讨论】:

以上是关于为啥 swiftmailer 不采用环境变量?的主要内容,如果未能解决你的问题,请参考以下文章

为啥要设置环境变量,环境变量有啥用

mysql的安装为啥没有配置环境变量?

为啥 maven 不替换 maven-release-plugin 发布版本的环境变量?

jmeter为啥要配置环境变量

windows 为啥设置了环境变量没生效

JDK为啥进行环境变量配置