PHP联系表单带认证SMTP函数使用及Hotmail收信问题求助
解决PHP联系表单无法向Hotmail发送邮件的问题:使用SMTP认证
嘿,我明白你现在的困扰——用PHP原生mail()函数发邮件到Gmail没问题,但Hotmail就是收不到,对吧?这其实是因为Hotmail(现在归属Outlook生态)的反垃圾邮件规则比Gmail严格很多,原生mail()是通过服务器本地的邮件服务发送的,没有经过官方SMTP认证,很容易被当成垃圾邮件直接拦截。
下面我给你改成带SMTP认证的版本,推荐用PHPMailer这个库——这是PHP领域处理邮件最成熟、最靠谱的工具,能完美解决这类邮件投递问题。
步骤1:准备PHPMailer
你有两种方式获取PHPMailer:
- 如果你用Composer管理项目,直接运行命令:
composer require phpmailer/phpmailer - 手动下载:去PHPMailer的官方仓库下载源码,把
src文件夹里的三个核心文件(Exception.php、PHPMailer.php、SMTP.php)放到你的项目目录里。
步骤2:修改后的完整代码
<?php // 引入PHPMailer相关文件(根据你的安装方式选一种) // 方式1:Composer安装的话,直接引入自动加载文件 require 'vendor/autoload.php'; // 方式2:手动下载的话,引入三个核心文件 // require 'src/Exception.php'; // require 'src/PHPMailer.php'; // require 'src/SMTP.php'; // 导入PHPMailer的命名空间 use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\SMTP; use PHPMailer\PHPMailer\Exception; // 获取表单提交的用户数据 $name = $_POST['name']; $email = $_POST['email']; $phone = $_POST['phone']; $message = $_POST['message']; // 构建邮件内容(纯文本格式) $emailContent = "Name: $name \nEmail: $email \nPhone: $phone \nMessage: $message"; // 初始化PHPMailer实例 $mail = new PHPMailer(true); try { // -------------------------- SMTP配置 -------------------------- $mail->SMTPDebug = SMTP::DEBUG_OFF; // 关闭调试输出,上线前务必保持关闭 $mail->isSMTP(); // 启用SMTP发送模式 $mail->Host = 'smtp.office365.com'; // Outlook/Hotmail官方SMTP服务器 $mail->SMTPAuth = true; // 开启SMTP认证(必须打开,否则无法投递) $mail->Username = 'your-sender-email@hotmail.com'; // 你的发件Hotmail邮箱(必须是真实存在的) $mail->Password = 'your-app-password-or-email-password'; // 邮箱密码:如果开启了两步验证,要用微软账户的「应用密码」 $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS; // 加密方式:TLS $mail->Port = 587; // SMTP端口(对应TLS加密的标准端口) // -------------------------- 邮件收发人设置 -------------------------- $mail->setFrom('your-sender-email@hotmail.com', '你的网站名称'); // 发件人用你的认证邮箱,可信度更高 $mail->addAddress('abc@hotmail.com'); // 你的收件邮箱(就是原来的$to) $mail->addReplyTo($email, $name); // 设置回复邮箱为用户提交的邮箱,方便你直接回复用户 // -------------------------- 邮件内容设置 -------------------------- $mail->isHTML(false); // 这里用纯文本格式,也可以改成true发送HTML邮件 $mail->Subject = 'Contact Form'; // 邮件主题 $mail->Body = $emailContent; // 邮件正文 // 发送邮件 $mail->send(); // 发送成功后的提示(保留你原来的前端提示) echo "<br><br><p style='color:#000'><b>Thank You $name</b></p><p style='color:#000'>We will be in touch as soon as possible.</p>"; echo "<p style='color:#000'>Go to <a href='index.html'><b>Home Page</b></a></p>"; } catch (Exception $e) { // 发送失败时的错误提示 echo "Error! Message could not be sent. Mailer Error: {$mail->ErrorInfo}"; } ?>
关键注意事项
- 关于发件邮箱的密码:如果你的Hotmail账户开启了两步验证,直接用登录密码会失败,需要去微软账户后台创建一个「应用密码」(专门给第三方应用用的密码),用这个密码代替普通登录密码。
- 不要硬编码密码:上线部署时,建议把邮箱密码存在环境变量里,不要直接写在代码里,避免泄露。
- 发件人设置:尽量用你自己的认证邮箱作为发件人,不要直接用用户提交的邮箱——很多邮件服务商不允许伪造发件人,这样做能避免邮件被拦截。
- 调试模式:如果还是收不到,可以把
SMTPDebug改成SMTP::DEBUG_SERVER,这样会输出详细的SMTP交互日志,方便排查问题。
内容的提问来源于stack exchange,提问作者Webhostwala
相关产品推荐
相关产品推荐

