Laravel 5.1调用Amazon SES发邮件遇TLS 1.2强制要求报错排查
问题解决方案
以下是针对Laravel 5.1 + PHP 5.6.40环境下,调用Mail::send()时被Amazon SES拒绝(提示需TLS1.2+)的排查及解决步骤:
1. 强制Swift Mailer使用TLS 1.2
Laravel 5.1默认未明确指定TLS版本,需在邮件配置中添加流上下文参数,强制Swift Mailer使用TLS1.2。修改config/mail.php中的smtp配置项:
'smtp' => [ 'driver' => 'smtp', 'host' => env('MAIL_HOST', 'email-smtp.us-east-1.amazonaws.com'), 'port' => env('MAIL_PORT', 587), 'from' => ['address' => env('MAIL_FROM_ADDRESS'), 'name' => env('MAIL_FROM_NAME')], 'encryption' => env('MAIL_ENCRYPTION', 'tls'), 'username' => env('MAIL_USERNAME'), 'password' => env('MAIL_PASSWORD'), 'sendmail' => '/usr/sbin/sendmail -bs', // 新增以下流配置 'stream' => [ 'ssl' => [ 'crypto_method' => STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT, ], ], ],
该配置会强制Swift Mailer在建立SSL连接时仅使用TLS1.2,避免尝试更低版本的协议。
2. 检查PHP OpenSSL配置
确认PHP的OpenSSL扩展已启用TLS1.2:
- 执行
php -i | grep openssl查看配置 - 确保输出中
Protocols包含TLSv1.2 - 若
openssl.cafile或openssl.capath未配置,需指定有效CA证书路径(可使用系统默认CA证书,比如Ubuntu下的/etc/ssl/certs/ca-certificates.crt)
3. 直接用Swift Mailer测试连接
绕过Laravel门面,编写独立测试脚本验证TLS1.2连接是否正常:
require_once 'vendor/autoload.php'; // 替换为你的SES凭证和端点 $transport = Swift_SmtpTransport::newInstance('email-smtp.us-east-1.amazonaws.com', 587, 'tls') ->setUsername(env('MAIL_USERNAME')) ->setPassword(env('MAIL_PASSWORD')) ->setStreamOptions([ 'ssl' => [ 'crypto_method' => STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT, ] ]); $mailer = Swift_Mailer::newInstance($transport); $message = Swift_Message::newInstance('TLS 1.2 Test') ->setFrom(['your@domain.com' => 'Your Name']) ->setTo(['test@domain.com']) ->setBody('Testing TLS 1.2 connection to SES'); try { $sent = $mailer->send($message); echo "Success! Sent $sent messages."; } catch (Exception $e) { echo "Error: " . $e->getMessage(); }
运行脚本后,若能正常发送,说明问题出在Laravel配置层面;若仍报错,需检查服务器SSL环境是否存在隐性限制。
4. 次要检查项
- 确认EC2安全组和NACL已允许出站访问SES端口(587或465)
- 验证
MAIL_HOST是否为对应AWS区域的SES SMTP端点(比如us-west-2为email-smtp.us-west-2.amazonaws.com)
内容的提问来源于stack exchange,提问作者Elio Chamy
相关产品推荐
相关产品推荐

