📜  swift mailer 530 必须先发出 STARTTLS 命令. - PHP (1)

📅  最后修改于: 2023-12-03 15:05:26.049000             🧑  作者: Mango

Swift Mailer 530 必须先发出 STARTTLS 命令 - PHP
简介

当使用 Swift Mailer 发送邮件的时候,有时候会遇到 530 必须先发出 STARTTLS 命令 的错误。这个错误表示启用了 SMTP SSL/TLS 加密,但没有使用 STARTTLS 命令来建立加密通道。

原因

SMTP 协议中有两种方式可以建立 SSL/TLS 加密通道:STARTTLSSMTPSSTARTTLS 是一种协商式的加密方式,客户端和服务器在建立连接后,协商建立一个安全通道。而 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 命令建立加密通道。解决方案是:

  1. 如果服务器支持 STARTTLS 方式建立加密通道,使用 $transport->starttls() 手动建立加密通道;
  2. 如果服务器不支持 STARTTLS 方式建立加密通道,使用 SMTPS 方式发送邮件,修改 $security 参数为 ssl,端口号为 465。

最后,建议仔细阅读邮件服务器提供商的文档,了解服务器支持哪些加密方式,以便正确配置 Swift Mailer。