Posterior a buscar en varios repositorios y páginas webs de internet al terminar hallamos la resolución que te enseñamos más adelante.
Solución:
Swiftmailer ahora se ha actualizado para incluir una opción para esto. Ahora se puede resolver usando el setStreamOptions
método de su Swift_SmtpTransport
instancia en lugar de editar la clase swift.
$transport = Swift_SmtpTransport::newInstance('smtp.server.com', 123, 'tls')
->setUsername('username')
->setPassword('password')
->setStreamOptions(array('ssl' => array('allow_self_signed' => true, 'verify_peer' => false)));
Tengo el mismo problema al usar Swiftmailer en Laravel.
Parece que no hay opción para esto en Swiftmailer. La solución limpia sería agregar su propia CA raíz a su servidor y firmar su certificado de servidor de correo con esta CA. El certificado sería válido después de esto. Ver por ejemplo este tutorial.
De todos modos, un truco rápido y sucio que no deberías usar sería editar swiftmailerswiftmailerlibclassesSwiftTransportStreamBuffer.php
. En _establishSocketConnection()
línea 253 reemplazar:
$options = array();
con algo como esto:
$options = array('ssl' => array('allow_self_signed' => true, 'verify_peer' => false));
Esto cambiará las opciones ssl de stream_context_create() (unas pocas líneas debajo $options
):
$this->_stream = @stream_socket_client($host.':'.$this->_params['port'], $errno,
$errstr, $timeout, STREAM_CLIENT_CONNECT, stream_context_create($options));
No necesitas editar /vendor
archivos Puede especificar opciones (no documentadas) en su config/mail.php
expediente:
'stream' => [
'ssl' => [
'allow_self_signed' => true,
'verify_peer' => false,
'verify_peer_name' => false,
],
],
Puedes comprobarlo tú mismo en vendor/laravel/framework/src/Illuminate/Mail/TransportManager.php
en línea ~50:
...
if (isset($config['stream']))
$transport->setStreamOptions($config['stream']);
...