You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为PHP邮件功能配置SMTP?故障代码排查与修复

问题排查与修复方案

看了你的代码,核心问题是混用了PHPMailer类和PHP原生mail()函数——你前面写的$mail->IsSMTP()这些都是PHPMailer的配置,但最后却调用了原生的mail(),这俩完全不搭边,mail()根本不会读取你给$mail对象设置的SMTP参数。另外还有几个小错误,我帮你一一修复:

核心问题:API混用

你前面的代码是给PHPMailer对象配置SMTP,但最后调用的是PHP原生的mail()函数,这两个是独立的工具,mail()不会使用$mail对象里的任何配置。你得二选一:要么用PHPMailer完整实现(推荐,处理SMTP更可靠),要么用原生mail()(但原生mail()处理SMTP认证限制较多)。


方案1:用PHPMailer正确实现(推荐)

首先确保你已经安装了PHPMailer(比如通过Composer执行composer require phpmailer/phpmailer),然后修改代码如下:

<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;

// 引入PHPMailer自动加载文件
require 'vendor/autoload.php';

// 初始化PHPMailer对象
$mail = new PHPMailer(true);

try {
    // SMTP核心配置
    $mail->isSMTP();
    $mail->SMTPAuth = true;
    $mail->Host = 'smtp.example.com'; // 你的SMTP服务器地址
    $mail->Port = 26; // SMTP端口(注意部分服务商要求用587/465,需确认)
    $mail->Username = '#@#@#@#@-####-@@@@-#####-@#@#@#@#@#@#'; // SMTP用户名
    $mail->Password = '#@#@#@#@-####-@@@@-#####-@#@#@#@#@#@#'; // SMTP密码
    $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS; // 加密方式,根据服务器要求选STARTTLS/SSL,无需加密可注释

    // 邮件收发人配置
    $mail->setFrom('support@example.com', 'Support Team'); // 修复了原代码里的拼写错误:exmaple → example
    $mail->addAddress('info@example.com'); // 收件人邮箱
    $mail->addReplyTo($email, $fname . ' ' . $lname); // 回复地址

    // 邮件内容配置
    $mail->Subject = 'Test mail';
    $mail->isHTML(false); // 因为你的内容是纯文本,设为false;如果要发HTML,改为true并编写HTML内容
    $email_message = "First Name: $fname \r\n";
    $email_message .= "Last Name: $lname \r\n";
    $email_message .= "Designation: $designation \r\n";
    $email_message .= "Email: $email \r\n";
    $email_message .= "Phone Number: $phonenumber \r\n";
    $mail->Body = $email_message;

    // 发送邮件
    $mail->send();
    echo '邮件发送成功';
} catch (Exception $e) {
    echo "邮件发送失败: {$mail->ErrorInfo}";
}
?>

方案2:用PHP原生mail()函数(不推荐)

如果你坚持用原生mail(),需要注意:原生mail()本身不支持SMTP认证,必须依赖服务器本地的邮件服务(如sendmail/postfix),或者修改php.ini的SMTP配置。另外你原代码的mail()调用参数完全错误,正确语法是:

mail($to, $subject, $message, $headers, $additional_parameters);

你之前把$mail对象传成了第一个参数,这是无效的。

同时还要修复两个小问题:

  • 发件人邮箱拼写错误:support@exmaple.com → support@example.com
  • 内容与Header匹配:你设置了HTML类型的Header,但$email_message是纯文本,要么把Header改成Content-type: text/plain; charset=iso-8859-1,要么把内容改成HTML格式。

内容的提问来源于stack exchange,提问作者Gold Pearl

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 10:04:06