使用PHPMailer发送邮件异常:切换Hostinger邮箱后仅Contabo收件
问题排查与解决方案
核心原因推测
你遇到的问题大概率是DNS MX记录未正确更新,或者服务器本地邮件服务拦截了邮件投递路径,导致邮件仍被路由到Contabo的本地邮箱,而非Hostinger的邮件服务器。以下是具体排查步骤:
1. 强制检查域名MX记录
MX记录决定了邮件的路由方向,必须确保你的域名xxx.gr的MX记录指向Hostinger的邮件服务器:
- 使用命令行工具查询:
nslookup -type=MX xxx.gr - 正常情况下,Hostinger的MX记录应为:
xxx.gr IN MX 10 mx1.hostinger.com. xxx.gr IN MX 20 mx2.hostinger.com. - 如果查询结果显示Contabo的MX记录,说明DNS未更新,需要在域名DNS管理面板(域名注册商或DNS托管平台,比如Cloudflare)替换MX记录为Hostinger提供的地址。
2. 检查Cloudflare MX记录状态
Cloudflare不能代理MX记录,需确保:
- 登录Cloudflare域名控制台,找到MX记录条目,确认右侧的云朵图标为灰色(DNS-only),而非橙色(Proxy状态)。若为橙色,切换为DNS-only后等待DNS生效(可降低TTL加速生效,通常1-48小时)。
3. 完善PHPMailer的完整配置
你提供的代码仅为基础配置,需确保开启SMTP认证并正确设置发件人,避免本地投递或认证失败:
require 'PHPMailer/PHPMailer.php'; require 'PHPMailer/SMTP.php'; require 'PHPMailer/Exception.php'; use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\SMTP; use PHPMailer\PHPMailer\Exception; $mail = new PHPMailer(true); try { // Server settings $mail->isSMTP(); // 启用SMTP发送 $mail->Host = 'smtp.hostinger.com'; // SMTP服务器地址 $mail->SMTPAuth = true; // 开启SMTP认证 $mail->Username = 'info@xxx.gr'; // SMTP用户名 $mail->Password = 'xxxxx'; // SMTP密码 $mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS; // 启用SSL加密 $mail->Port = 465; // SMTP端口 // 收件人与发件人设置 $mail->setFrom('info@xxx.gr', 'Website Contact'); // 发件人需与SMTP用户名一致 $mail->addAddress('info@xxx.gr'); // 添加收件人 // 邮件内容 $mail->isHTML(true); // 设置HTML格式 $mail->Subject = 'Message from website ' . $_SERVER['SERVER_NAME']; $mail->Body = 'Your message content here'; $mail->send(); echo 'Message has been sent'; } catch (Exception $e) { echo "Message could not be sent. Mailer Error: {$mail->ErrorInfo}"; }
- 关键注意点:
setFrom的邮箱必须与SMTP用户名info@xxx.gr一致,否则可能被Hostinger拒绝或触发本地投递逻辑。
4. 禁用Contabo服务器的本地邮件服务
如果Contabo服务器上运行着Postfix、Exim等本地MTA(邮件传输代理),它可能会优先将发往info@xxx.gr的邮件投递到本地系统邮箱,而非通过Hostinger的SMTP发送:
- 停止并禁用本地MTA服务(以Postfix为例):
sudo systemctl stop postfix sudo systemctl disable postfix - 或者修改本地MTA配置,将
xxx.gr的邮件转发到Hostinger的MX服务器,避免本地拦截。
内容的提问来源于stack exchange,提问作者Chris Xanthou
相关产品推荐
相关产品推荐

