SMTP ERROR: MAIL FROM command failed: 530 5.7.0 Must issue a STARTTLS command first when using PHPMailer
SMTP ERROR: MAIL FROM command failed: 530 5.7.0 Must issue a STARTTLS command first when using PHPMailer
我正在尝试使用 PHPMailer 从我的 gmail 帐户发送电子邮件。但是当 运行 我本地主机上的 php-script 时,我收到以下错误:
SERVER -> CLIENT: 530 5.7.0 必须先发出 STARTTLS 命令。 m12sm23971137wrp.61 - gsmtp.
这是我的代码:
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;
require 'PHPMailer/src/Exception.php';
require 'PHPMailer/src/PHPMailer.php';
require 'PHPMailer/src/SMTP.php';
$mail = new PHPMailer();
$mail->isSMTP();
$mail->SMTPAuth = false;
$mail->SMTPAutoTLS = false;
$mail->SMTPSecure = false;
$mail->SMTPDebug = SMTP::DEBUG_CONNECTION;
$mail->Debugoutput = "html";
$mail->Host = gethostbyname('smtp.gmail.com');
$mail->Port = '587';
$mail->isHTML();
$mail->Username='myemail@gmail.com';
$mail->Passwort='gmail app-password';
$mail->SetFrom('myemail@gmail.com');
$mail->Subject = 'Hello';
$mail->Body='Test';
$mail->addAddress('otheremail@gmail.com');
if($mail->send()){
echo "sent";
} else {
echo "not sent".$mail->ErrorInfo;
}
我已经尝试了很多,但没有任何效果。希望有人能在这里提供帮助:)
公平地说,您的脚本完全按照您的要求执行,但 gmail 不喜欢那样!
你的问题源于这一行:
$mail->Host = gethostbyname('smtp.gmail.com');
这会将 Host
设置为一个 IP 地址,过去有人建议将其作为使用 IPv6(gmail 不喜欢)的解决方法,因为它总是 returns一个 IPv4 地址。
但是,它会导致另一个问题:不再有主机名来验证证书,并且 TLS 连接失败。所以这会导致您尝试关闭 TLS:
$mail->SMTPAutoTLS = false;
$mail->SMTPSecure = false;
没有 TLS 意味着您无法进行身份验证,因此您将其关闭:
$mail->SMTPAuth = false;
但是 gmail(非常明智地)不允许您在未经身份验证的情况下发送,所以您被卡住了。
然后解决方案是撤消所有这些,恢复为 the gmail example 中提供的代码。
试试这个属性:
properties.put("mail.smtp.starttls.enable","true");
properties.setProperty("mail.transport.protocol", "smtp");
properties.setProperty("mail.host", "smtp.gmail.com");
properties.put("mail.smtp.host","smtp.gmail.com");
properties.put("mail.smtp.auth", "true");
properties.put("mail.smtp.port", "465");
// properties.put("mail.debug", "true"); //this turn debug mode on to see errors!
properties.put("mail.smtp.socketFactory.port", "465");
properties.put("mail.smtp.socketFactory.class","javax.net.ssl.SSLSocketFactory");
properties.put("mail.smtp.socketFactory.fallback", "false");
我正在尝试使用 PHPMailer 从我的 gmail 帐户发送电子邮件。但是当 运行 我本地主机上的 php-script 时,我收到以下错误:
SERVER -> CLIENT: 530 5.7.0 必须先发出 STARTTLS 命令。 m12sm23971137wrp.61 - gsmtp.
这是我的代码:
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;
require 'PHPMailer/src/Exception.php';
require 'PHPMailer/src/PHPMailer.php';
require 'PHPMailer/src/SMTP.php';
$mail = new PHPMailer();
$mail->isSMTP();
$mail->SMTPAuth = false;
$mail->SMTPAutoTLS = false;
$mail->SMTPSecure = false;
$mail->SMTPDebug = SMTP::DEBUG_CONNECTION;
$mail->Debugoutput = "html";
$mail->Host = gethostbyname('smtp.gmail.com');
$mail->Port = '587';
$mail->isHTML();
$mail->Username='myemail@gmail.com';
$mail->Passwort='gmail app-password';
$mail->SetFrom('myemail@gmail.com');
$mail->Subject = 'Hello';
$mail->Body='Test';
$mail->addAddress('otheremail@gmail.com');
if($mail->send()){
echo "sent";
} else {
echo "not sent".$mail->ErrorInfo;
}
我已经尝试了很多,但没有任何效果。希望有人能在这里提供帮助:)
公平地说,您的脚本完全按照您的要求执行,但 gmail 不喜欢那样!
你的问题源于这一行:
$mail->Host = gethostbyname('smtp.gmail.com');
这会将 Host
设置为一个 IP 地址,过去有人建议将其作为使用 IPv6(gmail 不喜欢)的解决方法,因为它总是 returns一个 IPv4 地址。
但是,它会导致另一个问题:不再有主机名来验证证书,并且 TLS 连接失败。所以这会导致您尝试关闭 TLS:
$mail->SMTPAutoTLS = false;
$mail->SMTPSecure = false;
没有 TLS 意味着您无法进行身份验证,因此您将其关闭:
$mail->SMTPAuth = false;
但是 gmail(非常明智地)不允许您在未经身份验证的情况下发送,所以您被卡住了。
然后解决方案是撤消所有这些,恢复为 the gmail example 中提供的代码。
试试这个属性:
properties.put("mail.smtp.starttls.enable","true");
properties.setProperty("mail.transport.protocol", "smtp");
properties.setProperty("mail.host", "smtp.gmail.com");
properties.put("mail.smtp.host","smtp.gmail.com");
properties.put("mail.smtp.auth", "true");
properties.put("mail.smtp.port", "465");
// properties.put("mail.debug", "true"); //this turn debug mode on to see errors!
properties.put("mail.smtp.socketFactory.port", "465");
properties.put("mail.smtp.socketFactory.class","javax.net.ssl.SSLSocketFactory");
properties.put("mail.smtp.socketFactory.fallback", "false");