ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

如何用 PHPMailer 完成 POP-before-SMTP 认证并发送一封邮件

如何用 PHPMailer 完成 POP-before-SMTP 认证并发送一封邮件 如何用 PHPMailer 完成 POP-before-SMTP 认证并发送一封邮件【免费下载链接】PHPMailerThe classic email sending library for PHP项目地址: https://gitcode.com/GitHub_Trending/ph/PHPMailer如果你的邮件服务器还是使用 POP-before-SMTP 这类老式认证方案直接走 SMTP 发信会被拒绝这套机制要求先用 POP3 登录一次之后 SMTP 服务器才允许你的 IP 在一段时间内文档说法是通常 5–15 分钟免认证提交邮件。PHPMailer 内置了一个专门服务于这个流程的 POP3 客户端。本文要完成的任务就一条链路先调用POP3::popBeforeSmtp()完成 POP3 认证再用PHPMailer实例以不开启 SMTP 认证的方式发送一封邮件。前提是邮件服务器支持 POP-before-SMTP示例代码中也明确写了 Only applies if your host supports POP-before-SMTP。准备条件用 Composer 安装 PHPMailer这是 README 推荐的安装方式composer require phpmailer/phpmailerREADME 说明vendor/目录和vendor/autoload.php由 Composer 生成不属于 PHPMailer 仓库本身。PHPMailer 兼容 PHP 5.5 及以上含 PHP 8.2。如果不走 Composer 手动安装POP-before-SMTP 场景需要额外加载 src/POP3.phpREADME 的 Minimal installation 一节列出了这一点完整 Composer 安装已包含该文件。示例中的pop3.example.com、mail.example.com等域名是 IANA 按 RFC 2606 保留的演示域名见 examples/README.md不能直接使用下文代码块中的这些值都需要替换成你的真实服务器与账号。第一步完成 POP3 认证POP3::popBeforeSmtp()是一个静态封装内部按 连接 → 登录 → 断开 的顺序执行对应 src/POP3.php 中authorise()的注释 A connect, login, disconnect sequence返回值是布尔型?php use PHPMailer\PHPMailer\POP3; require vendor/autoload.php; // 六个参数主机、端口、超时、用户名、密码、调试级别 $pop POP3::popBeforeSmtp(pop3.example.com, 110, 30, username, password, 1); var_dump($pop);各参数的取值规则来自POP3类的源码定义$port不传或传false时默认使用常量DEFAULT_PORT即 110$timeout不传时默认DEFAULT_TIMEOUT即 30 秒$debug_level对应三个常量POP3::DEBUG_OFF0无输出、POP3::DEBUG_SERVER1输出服务器消息及连接/服务器错误、POP3::DEBUG_CLIENT2输出客户端与服务端双向消息。判断标准返回true表示 POP3 登录成功服务器对连接和USER/PASS均返回OK返回false表示连接失败或登录失败。认证失败时建议直接中止不要继续发信——PHPMailer 自己的单元测试 test/POP3/PopBeforeSmtpTest.php 就是断言错误密码必须返回false、正确凭证必须返回true的。启用debug_level 1时脚本会打印Server - Client:开头的服务器响应行可用于确认失败发生在连接阶段还是登录阶段。第二步通过无认证 SMTP 发送邮件认证通过后在允许时间窗内用PHPMailer发送。完整脚本参照仓库示例 examples/pop_before_smtp.phps 整理去掉了附件与 HTML 正文部分?php use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\Exception; use PHPMailer\PHPMailer\POP3; use PHPMailer\PHPMailer\SMTP; require vendor/autoload.php; // 先完成 POP3 认证失败则终止避免走到 SMTP 后被拒 $pop POP3::popBeforeSmtp(pop3.example.com, 110, 30, username, password, 1); if (false $pop) { exit(1); } // 创建实例传 true 启用异常处理 $mail new PHPMailer(true); try { $mail-isSMTP(); // SMTP 调试DEBUG_OFF 关闭DEBUG_CLIENT 客户端消息DEBUG_SERVER 客户端服务器消息 $mail-SMTPDebug SMTP::DEBUG_SERVER; // SMTP 服务器主机名 $mail-Host mail.example.com; // SMTP 端口示例用 25示例注释说明常见值为 25、465 或 587 $mail-Port 25; // POP-before-SMTP 场景下 SMTP 端不做认证 $mail-SMTPAuth false; // 发件人、收件人 $mail-setFrom(fromexample.com, First Last); $mail-addAddress(whotoexample.com, John Doe); $mail-Subject PHPMailer POP-before-SMTP test; $mail-Body This is a plain-text message body; // send() 出错会抛出异常成功则继续执行 $mail-send(); echo Message sent!; } catch (Exception $e) { echo $e-errorMessage(); }替换说明pop3.example.com/mail.example.com换成你的 POP3 与 SMTP 主机110、30、25按实际服务器调整POP3 默认 110SMTP 常见 25/465/587username/password换成 POP3 账号fromexample.com、whotoexample.com换成真实地址。验证方式send()成功且未抛异常时输出Message sent!SMTP 会话因SMTPDebug SMTP::DEBUG_SERVER会打印出来便于确认连接、HELO、提交等阶段的实际报文。发送失败时走catch分支errorMessage()返回 PHPMailer 的格式化错误信息。可选没有真实 POP3 服务器时本地验证认证环节仓库自带一个假 POP3 服务器 test/fakepopserver.sh它不真正提供邮件只支持完成认证所需的命令。按脚本头部注释它接受任意用户名只在密码为test时返回正面响应。启动入口是 test/runfakepopserver.sh在仓库test/目录下执行cd test bash runfakepopserver.sh 1100执行前须知副作用该脚本依赖 netcatnc命令且单元测试在非 Windows 系统上运行test/POP3/PopBeforeSmtpTest.php 在 Windows 下会跳过脚本会在当前目录创建并清理一个fifo文件假服务器会把会话日志写到/tmp/fakepop.log命令会阻塞当前终端nc -l一直监听验证完成后用 CtrlC 停止。服务在 1100 端口监听后另开一个终端验证三个结果与单元测试testPopBeforeSmtpGood/testPopBeforeSmtpBad/testPopBeforeSmtpUnreachable的断言一致?php use PHPMailer\PHPMailer\POP3; require vendor/autoload.php; // 密码正确test预期返回 true var_dump(POP3::popBeforeSmtp(localhost, 1100, 10, user, test)); // 密码错误预期返回 false var_dump(POP3::popBeforeSmtp(localhost, 1100, 10, user, xxx)); // 端口上没有服务器预期返回 false var_dump(POP3::popBeforeSmtp(localhost, 1102, 10, user, xxx));这条分支只用来验证 POP3 认证这一步的行为SMTP 发信部分仍需真实或你自建的SMTP 服务器。限制与注意事项POP3类明确不支持 APOP认证且是刻意做得轻量、只实现认证所需功能的类如果你需要完整的 POP3 客户端源码注释建议改用其他 PHP POP3 类见 src/POP3.php 头部注释。这是很老的技术README 与示例都强调只有在邮件主机支持 POP-before-SMTP 时才适用现代服务器通常应直接使用 SMTP 认证LOGIN/PLAIN/CRAM-MD5/XOAUTH2。认证后的发送窗口有限通常 5–15 分钟。如果要批量发送POP3类注释的建议是开头只做一次popBeforeSmtp()然后循环发完所有邮件前提是整体耗时不超过服务器上的验证期——因为频繁开关 POP3 连接本身很慢。仓库示例以.phps扩展名提供是为了避免被 Web 服务器直接执行examples/README.md 的安全提示同样适用于自己写的脚本不要把真实密码写死在会对外暴露的示例文件里也不要把这类代码部署成可被他人触发的垃圾邮件网关。验证到popBeforeSmtp()返回true、脚本输出Message sent!即说明 POP-before-SMTP 认证与发信链路在你这套老服务器上走通了若窗口过期后发信被拒重新执行一次认证步骤即可。【免费下载链接】PHPMailerThe classic email sending library for PHP项目地址: https://gitcode.com/GitHub_Trending/ph/PHPMailer创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表