我从以下几点开始:
composer require phpmailer/phpmailer
随后放置一次 require
require_once "../vendor/autoload.php";
Then
$mail = new PHPMailer;
这就是 PHP 有一个致命错误的地方:
致命错误:未找到“PHPMailer”类
以下是我的代码:
使用 PHPMailer\PHPMailer\PHPMailer;
使用 PHPMailer\PHPMailer\Exception;
# require php mailer
require_once "../vendor/autoload.php";
//PHPMailer Object
$mail = new PHPMailer;
$mail->isSMTP();
$mail->SMTPDebug = 3;
$mail->SMTPAuth = true;
// $mail->SMTPSecure = "ssl";
$mail->SMTPSecure = "tls";
$mail->Host = "smtp-relay.gmail.com";
$mail->Port = "587";
$mail->Username = "some gmail address";
$mail->Password = "some password";
$mail->SetFrom("[email protected] /cdn-cgi/l/email-protection");
$mail->Subject = $subject;
$mail->Body = $htmlMessage;
$mail->AddAddress($recpEmails);
$mail->Send();
$htmlMessage
是一个包含纯文本和带有 mime_boundary 的 html 的变量,但它永远不会到达那里,因为它找不到 PHPMailer。
这就是我试图解决该问题的方法:
我在与vendor相同的目录中创建了另一个名为PHPMailer的目录,这个新目录包含phpmailer / phpmailer / src的内容,但它仍然找不到PHPMailer类。
我是否还需要 PHPMailer.php 文件?我认为这就是自动加载应该做的事情?
提前致谢
UPDATE
在评论中的 @Phil 指出我缺少 use 命名空间之后,我更新了代码,这导致了一个新的错误:
致命错误:未捕获异常“PHPMailer\PHPMailer\Exception”,消息“SMTP connect() 失败”
我读到了$mail->SMTPDebug = 3;
给出了更多细节,其中揭示了以下内容:
2019-02-11 01:51:57 连接:打开 ssl://smtp-relay.gmail.com:587,timeout=300,options=array()
2019-02-11 01:51:58 连接失败。错误 #2:stream_socket_client():SSL 操作失败,代码为 1。OpenSSL 错误消息:错误:140770FC:SSL 例程:SSL23_GET_SERVER_HELLO:未知协议 [v2018/assets/api/vendor/phpmailer/phpmailer/src/SMTP.php 第 327 行]
2019-02-11 01:51:58 连接失败。错误 #2:stream_socket_client():无法启用加密 [v2018/assets/api/vendor/phpmailer/phpmailer/src/SMTP.php 第 327 行]
2019-02-11 01:51:58 连接失败。错误#2:stream_socket_client():无法连接到 ssl://smtp-relay.gmail.com:587(未知错误)[v2018/assets/api/vendor/phpmailer/phpmailer/src/SMTP.php 第 327 行]
2019-02-11 01:51:58 SMTP 错误:无法连接到服务器:(0)
SMTP 连接()失败。https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting
然后我读到另一篇文章 https://stackoverflow.com/questions/46785313/uncaught-exception-php-mailer-exception-with-message-smtp-connect-failed更改以下设置,这使我可以看到它正在连接,但它不接受我的凭据:
$mail->SMTPSecure = "tls";
2019-02-11 02:00:26 服务器 -> 客户端:535-5.7.8 用户名和密码不被接受。了解更多请访问535 5.7.8https://support.google.com/mail/?p=BadCredentials https://support.google.com/mail/?p=BadCredentialsf2sm562482otb.6 - gsmtp
2019-02-11 02:00:26 SMTP 错误:密码命令失败:535-5.7.8 不接受用户名和密码。了解更多请访问535 5.7.8https://support.google.com/mail/?p=BadCredentials https://support.google.com/mail/?p=BadCredentialsf2sm562482otb.6 - gsmtp
我现在不知道该怎么办,因为我知道这些是我的 Gmail 帐户的凭据。我必须有 Gmail 企业帐户或类似帐户吗?
还有一则更新
我使用了错误的密码。输入正确的密码后,我开始收到以下消息:
2019-02-11 14:33:44 服务器 -> 客户端:550-5.7.0 邮件中继被拒绝 [172.117.2.44]。 550-5.7.0 域之一的中继凭据无效:(从 HELO 和 MAIL FROM 获取)。550-5.7.0 电子邮件是从未在 550-5.7.0 中注册的域或 IP 地址发送的您的 G Suite 帐户。请登录您的 G Suite 帐户并 550-5.7.0 验证您的发送设备 IP 地址是否已在 550-5.7.0 G Suite SMTP 中继设置中注册。更多信息请访问550 5.7.0https://support.google.com/a/answer/6140680#maildenied https://support.google.com/a/answer/6140680#maildeniedh192sm1484247qke.14 - gsmtp
结果我必须有一个 G-Suite 帐户才能使用 smtp-relay.gmail.com。我只有一个普通的 Gmail 帐户。当我更改为 smtp.gmail.com 时,我又回到了错误的凭据错误。我将等待我的 G-Suite 帐户得到验证,然后更新结果。