Magento 1.9编程发送密码恢复邮件失败,求解决方案
解决Magento 1.9密码重置邮件无法发送的问题
兄弟,先给你指个最明显的坑——你的代码里空的catch块简直是排查问题的噩梦!连错误信息都看不到,怎么知道到底是哪里出问题了?先把catch块补上,至少把异常信息写到日志里,比如:
if ($customer->getId()) { try { $newResetPasswordLinkToken = Mage::helper('customer')->generateResetPasswordLinkToken(); $customer->changeResetPasswordLinkToken($newResetPasswordLinkToken); $customer->save(); $customer->sendPasswordResetConfirmationEmail(); } catch (Exception $exception) { // 把错误日志写到单独的文件里,方便排查 Mage::log($exception->getMessage(), null, 'password_reset_errors.log'); // 开发环境可以直接输出错误(生产环境别这么干) // echo $exception->getMessage(); } }
接下来按优先级给你几个排查方向,一步步来:
1. 先确认Magento后台邮件配置没问题
- 进后台
System > Configuration > Advanced > System > Mail Sending Settings,确保Disable Email Communications是No,别不小心把全局邮件关了 - 去
System > Configuration > Sales > Sales Emails > Customer > Password Reset Confirmation Template,检查模板是启用状态,并且模板内容没有乱码或者缺失 - 如果用SMTP发邮件(比PHP mail靠谱多了),去
System > Configuration > Advanced > System > SMTP Settings填对服务器地址、端口、账号密码,建议用第三方SMTP服务,避免服务器邮件被当成垃圾邮件拦截
2. 优化你的代码逻辑
- 先确认
$customer对象是正确加载的:比如你是不是用Mage::getModel('customer/customer')->load($customerId)获取的?如果是新建的客户或者未正确加载的对象,即使有ID也可能出问题 - 去掉多余的
$customer->save():sendPasswordResetConfirmationEmail()方法内部已经会自动保存token了,你前面手动调用save()可能会触发额外事件,甚至覆盖token,试试改成这样:
if ($customer->getId()) { try { $newResetPasswordLinkToken = Mage::helper('customer')->generateResetPasswordLinkToken(); $customer->changeResetPasswordLinkToken($newResetPasswordLinkToken); // 删掉这里的$customer->save() $customer->sendPasswordResetConfirmationEmail(); } catch (Exception $exception) { Mage::log($exception->getMessage(), null, 'password_reset_errors.log'); } }
3. 排查服务器层面的邮件问题
- 看服务器邮件日志:Linux系统一般在
/var/log/mail.log或者/var/log/maillog,搜你的测试邮箱,看看有没有发送失败的记录(比如SMTP认证失败、被收件方拒绝) - 命令行测试邮件发送:在服务器上跑
echo "Test email content" | mail -s "Magento Test" your-test-email@xxx.com,如果命令行都发不出去,那就是服务器邮件服务(比如postfix、sendmail)的问题,找运维修吧 - 检查垃圾邮件箱:有时候邮件没丢,只是被收件方当成垃圾邮件过滤了,去垃圾邮件里找找
4. 排查第三方模块干扰
有些第三方模块会监听customer_reset_password或者email_send_before这类事件,可能会偷偷阻止邮件发送。可以先临时禁用所有第三方模块(记得备份数据库),测试邮件能不能发,如果能,再逐个启用模块排查是哪个搞的鬼
最后再强调一遍:先把catch块的错误日志加上,绝大多数情况下,邮件发不出去都是有明确错误信息的,比如“SMTP认证失败”、“客户邮箱格式无效”、“邮件模板不存在”之类的,有了错误信息,问题就好解决多了。
内容的提问来源于stack exchange,提问作者Knowledge Drilling
相关产品推荐
相关产品推荐

