📅  最后修改于: 2023-12-03 15:05:26.049000             🧑  作者: Mango
当使用 Swift Mailer 发送邮件的时候,有时候会遇到 530 必须先发出 STARTTLS 命令
的错误。这个错误表示启用了 SMTP SSL/TLS 加密,但没有使用 STARTTLS 命令来建立加密通道。
SMTP 协议中有两种方式可以建立 SSL/TLS 加密通道:STARTTLS
和 SMTPS
。STARTTLS
是一种协商式的加密方式,客户端和服务器在建立连接后,协商建立一个安全通道。而 SMTPS
是一种直接通过 SSL/TLS 加密的方式建立连接。
Swift Mailer 默认使用 STARTTLS
加密方式,如果服务器不支持此方式建立加密会话,就会报错 530 必须先发出 STARTTLS 命令
。
如果服务器支持 STARTTLS
方式建立加密通道,可以在发送邮件之前手动建立加密通道,代码如下:
//建立 SMTP 连接
$transport = new Swift_SmtpTransport($host, $port, $security);
$transport->setUsername($username);
$transport->setPassword($password);
// 手动开启加密
$transport->starttls();
// 建立 Swift Mailer 实例
$mailer = new Swift_Mailer($transport);
// 发送邮件
// ...
如果服务器不支持 STARTTLS
方式建立加密通道,可以尝试用 SMTPS
方式发送邮件。修改 $security
参数即可:
//建立 SMTP 连接
$transport = new Swift_SmtpTransport($host, $port, 'ssl');
$transport->setUsername($username);
$transport->setPassword($password);
// 建立 Swift Mailer 实例
$mailer = new Swift_Mailer($transport);
// 发送邮件
// ...
记得在使用 SMTPS
方式连接时,端口号应该是 SMTPS 协议的默认端口号 465。
Swift Mailer 530 必须先发出 STARTTLS 命令 - PHP,是因为使用了 SSL/TLS 加密而没有使用 STARTTLS 命令建立加密通道。解决方案是:
STARTTLS
方式建立加密通道,使用 $transport->starttls()
手动建立加密通道;STARTTLS
方式建立加密通道,使用 SMTPS
方式发送邮件,修改 $security
参数为 ssl
,端口号为 465。最后,建议仔细阅读邮件服务器提供商的文档,了解服务器支持哪些加密方式,以便正确配置 Swift Mailer。