本地PHP使用Mailjet发送邮件显示成功但未送达问题
解决Mailjet API显示发送成功但未收到邮件的问题
排查与修复步骤
1. 查看Mailjet后台发送日志
登录Mailjet控制台,找到对应邮件的发送记录:
- 若状态为
pending:属于Mailjet队列延迟,等待一段时间再检查; - 若状态为
blocked/rejected:日志会标注具体原因(比如发件人未验证、内容触发垃圾邮件规则); - 若状态为
delivered:直接去收件人的垃圾邮件、归档文件夹查找,测试邮件常被误判。
2. 验证发件人地址合法性
Mailjet要求发件人地址必须完成验证(单地址验证或域名DKIM/SPF验证),未验证地址发送的邮件几乎都会被收件方拒收。登录后台确认你使用的x@gmail.com已通过验证,或替换为已验证的发件地址。
3. 修正代码的响应判断逻辑
你当前的代码判断逻辑存在错误:Mailjet的post方法无论请求成功或失败,都会返回响应对象,不会直接返回false,这导致你误判了发送状态。修改代码如下:
try { $response = $mj->post(Resources::$Email, ['body' => $body]); if ($response->success()) { echo "Email sent successfully!"; // 可选:打印响应详情,确认邮件的发送状态 // print_r($response->getData()); } else { echo "Email failed to send!"; // 打印错误信息,精准定位问题 print_r($response->getErrorInfo()); } } catch (Exception $e) { echo 'Caught exception: '. $e->getMessage() ."\n"; }
通过success()方法判断请求是否真的成功,用getErrorInfo()获取具体错误,能快速定位API层面的问题。
4. 检查收件人邮箱状态
- 确认收件人地址
y@gmail.com拼写无误; - 若收件人是企业邮箱,可能被公司邮件网关拦截,换用个人邮箱测试;
- 检查收件人的已删除邮件、垃圾邮件文件夹。
5. 确认本地网络连通性
本地PHP环境需要能正常访问Mailjet的API服务器,可在终端执行以下curl命令测试:
curl -X POST https://api.mailjet.com/v3.1/send \ -u "你的API_KEY:你的SECRET_KEY" \ -H "Content-Type: application/json" \ -d '{ "Messages":[ { "From": {"Email":"x@gmail.com","Name":"name"}, "To": [{"Email":"y@gmail.com","Name":"name"}], "Subject": "Test", "TextPart": "Test content" } ] }'
如果curl请求失败,说明本地网络被防火墙、代理拦截,需调整网络设置。
内容的提问来源于stack exchange,提问作者Eng. Kai
相关产品推荐
相关产品推荐

