来自Advanced Yii 2.0的Swiftmailer不能与gmail一起使用

Bet*_*hez 5 swiftmailer yii2

我正在尝试在高级yii 2.0模板中配置swiftmailer.我经历了很多帖子,我知道gmail存在一些问题.我在开发中的配置环境如下:

'mailer' => [
        'class' => 'yii\swiftmailer\Mailer',
        'viewPath' => '@common/mail',
        'useFileTransport' => false,
        'transport' => [
            'class' => 'Swift_SmtpTransport',
            'host' => gethostbyname('smtp.gmail.com'),
            'username' => 'xxx@gmail.com',
            'password' => 'xxssxxxx',
            'port' => '465',
            'encryption' => 'ssl'
        ]
Run Code Online (Sandbox Code Playgroud)

我还将控制器中使用的支持邮件设置为上面显示的主本地配置中的相同gmail地址.我已经尝试在gmail帐户中为应用程序切换到不太安全的配置,但它不起作用,我不是特别喜欢更改它.我使用ssl加密时出现以下错误

无法与主机建立连接... [#0]

如果我没有指定加密,我会收到超时错误.

我根据我的phpinfo文件启用了OpenSSL支持,但我无法使其工作.TLS不起作用,因为如果我更改配置(端口:'587'和加密='tls')我得到以下错误

stream_socket_enable_crypto():SSL操作失败,代码为1. OpenSSL错误消息:错误:14090086:SSL例程:SSL3_GET_SERVER_CERTIFICATE:证书验证失败

关于如何解决这个问题的任何想法?这是一个不固定的问题吗?我应该使用其他邮寄分机吗?

小智 16

选项可以这样设置:

'mailer' => [
    'class' => 'yii\swiftmailer\Mailer',
    'viewPath' => '@common/mail',
    'useFileTransport' => false,
    'transport' => [
        'class' => 'Swift_SmtpTransport',
        'host' => gethostbyname('smtp.gmail.com'),
        'username' => 'xxx@gmail.com',
        'password' => 'xxssxxxx',
        'port' => '465',
        'encryption' => 'ssl',
        'streamOptions' => [ 
            'ssl' => [ 
                'allow_self_signed' => true,
                'verify_peer' => false,
                'verify_peer_name' => false,
            ],
        ]
    ]
Run Code Online (Sandbox Code Playgroud)

编者注:禁用SSL验证具有安全隐患.如果不验证SSL/HTTPS连接的真实性,恶意攻击者可以冒充受信任的端点(例如GitHub或其他一些远程Git主机),并且您将容易受到中间人攻击.在将此作为解决方案之前,请确保完全了解安全问题.


sca*_*dge 1

对于 gmail:加密必须设置为 tls,端口为587,主机为 smtp.gmail.com(检查您的gethostbyname('smtp.gmail.com')是否正确,获取正确的值)请参阅下面的示例:

 'transport' => [
            'class' => 'Swift_SmtpTransport',
            'host' => 'smtp.gmail.com',
            'username' => 'yourUsername@gmail.com',
            'password' => 'yourPassword',
            'port' => '587',
            'encryption' => 'tls',
        ],
Run Code Online (Sandbox Code Playgroud)