我正在尝试在高级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' => '[email protected]',
'password' => 'xxssxxxx',
'port' => '465',
'encryption' => 'ssl'
]
我还将控制器中使用的支持邮件设置为上面显示的主本地配置中的相同gmail地址。我已经尝试在gmail帐户中为应用程序切换到安全性较低的配置,但它不起作用,我不是特别喜欢更改它。我使用ssl加密时出现以下错误
无法与主机建立连接... [#0]
如果我没有指定加密,我会收到超时错误。
我根据我的phpinfo文件启用了OpenSSL支持,但我无法使其工作。 TLS不起作用,因为如果我更改配置(端口:'587'和加密='tls')我得到以下错误
stream_socket_enable_crypto():SSL操作失败,代码为1. OpenSSL错误消息:错误:14090086:SSL例程:SSL3_GET_SERVER_CERTIFICATE:证书验证失败
关于如何解决这个问题的任何想法?这是一个不固定的问题吗?我应该使用其他邮寄分机吗?
选项可以这样设置:
'mailer' => [
'class' => 'yii\swiftmailer\Mailer',
'viewPath' => '@common/mail',
'useFileTransport' => false,
'transport' => [
'class' => 'Swift_SmtpTransport',
'host' => gethostbyname('smtp.gmail.com'),
'username' => '[email protected]',
'password' => 'xxssxxxx',
'port' => '465',
'encryption' => 'ssl',
'streamOptions' => [
'ssl' => [
'allow_self_signed' => true,
'verify_peer' => false,
'verify_peer_name' => false,
],
]
]
编者注:禁用SSL验证具有安全隐患。如果不验证SSL / HTTPS连接的真实性,恶意攻击者可以冒充受信任的端点(例如GitHub或其他一些远程Git主机),并且您将容易受到Man-in-the-Middle Attack的攻击。在将此作为解决方案之前,请确保完全了解安全问题。
尝试使用gmail smtp IP
'transport' => [
'class' => 'Swift_SmtpTransport',
'host' => '64.233.171.108',
'username' => '[email protected]',
'password' => 'XXXXXXX',
'port' => '587',
'encryption' => 'tls',
],
某些生产服务器无法通过DNS服务器解决FQDN
对于gmail:加密必须设置为tls
,端口为587
,主机为smtp.gmail.com
(检查你的gethostbyname('smtp.gmail.com'),获取正确的值)请参阅下面的示例:
'transport' => [
'class' => 'Swift_SmtpTransport',
'host' => 'smtp.gmail.com',
'username' => '[email protected]',
'password' => 'yourPassword',
'port' => '587',
'encryption' => 'tls',
],
请检查 :
这是我的配置。电子邮件成功发送。
'components'=>[
'mailer' => [
'class' => 'yii\swiftmailer\Mailer',
'viewPath' => '@app/mail',
'useFileTransport' => false,
'transport' => [
'class'=>'Swift_SmtpTransport',
'host'=>'smtp.gmail.com', //sample
'username'=>'[email protected]', //sample email
'password'=>'~!@#$%%^&&', // sample password
'port'=>'465', // gmail ssl use port 465,
'encryption'=>'ssl',
],
],
],
我有这个问题我的疏忽是因为我连接tls作为我的加密,而远程服务器只支持较旧的ssl加密。
我所做的只是将我的加密参数值从“tls”更改为“ssl”,一切正常。
我希望这可以帮助别人。
添加streamOptions解决了我的问题!
'streamOptions' => [
'ssl' => [
'allow_self_signed' => true,
'verify_peer' => false,
'verify_peer_name' => false,
],
]