magento没有发送任何邮件,如何调试?

Posted

技术标签:

【中文标题】magento没有发送任何邮件,如何调试?【英文标题】:magento not sending out any mails, how to debug? 【发布时间】:2012-03-12 16:30:30 【问题描述】:

Magento 没有发送任何电子邮件,跨国,联系表格出错

 cannot send your mail at this moment

我检查过

magento 中的邮件设置,所有电子邮件帐户都在设置中设置 php 邮件工作正常一个带有 php 邮件的 test.php 发出一条消息 检查了我的邮件服务器日志,但没有看到任何错误

/var/log/system.log 和 exception.log 只显示错误而不是错误原因

exception 'Zend_Mail_Transport_Exception' with message 'Unable to send mail. ' in /var/webshop/httpdocs/lib/Zend/Mail/Transport/Sendmail.php:137

【问题讨论】:

【参考方案1】:

任何 php 程序都可以用 phpmail 发送一些电子邮件。

鉴于错误消息,您的 Magento 构建尝试做的是不同的 - 通过 Zend 库使用 Sendmail。

您需要构建和测试您的 sendmail 安装。或者使用其他一些邮件服务,例如 gmail 并让 Magento 使用它。

要测试是您、您的计算机还是 Magento,请在其中放置一些其他程序,例如 Roundcube Mail。如果 Roundcube Mail 可以发送邮件,那么您将知道 Sendmail 正在工作,否则您将知道问题出在 Sendmail 中。

修复您的 Sendmail 是特定于发行版的。

【讨论】:

我为 magento 添加了一个支持身份验证的 smtp 模块,但它仍在尝试发送邮件 true sendmail transport/sendmail.php :S 非常令人沮丧,常规的 php 脚本可以很好地与邮件 magento 一起工作发送任何电子邮件交易或联系表格。 Roundcube 发送邮件正常,我怎样才能让 magento 也发送邮件?对thix有什么建议吗?谢谢!【参考方案2】:

当 Magento 没有发送忘记密码的电子邮件(但向用户报告它)时遇到了这个问题,然后在查看 /var/log/exception.log 后发现它生成的错误是:

2012-05-30T04:27:54+00:00 ERR (3): 
exception 'Exception' with message 'This letter cannot be sent.' in /home/magento/www/app/code/core/Mage/Core/Model/Email/Template.php:354
Stack trace:
#0 /home/magento/www/app/code/core/Mage/Core/Model/Email/Template.php(463): Mage_Core_Model_Email_Template->send(Array, Array, Array)
#1 /home/magento/www/app/code/core/Mage/Core/Model/Email/Template/Mailer.php(79): Mage_Core_Model_Email_Template->sendTransactional('customer_passwo...', 'support', Array, Array, Array, '1')
#2 /home/magento/www/app/code/core/Mage/Customer/Model/Customer.php(646): Mage_Core_Model_Email_Template_Mailer->send()
#3 /home/magento/www/app/code/core/Mage/Customer/Model/Customer.php(663): Mage_Customer_Model_Customer->_sendEmailTemplate('customer/passwo...', 'customer/passwo...', Array, '1')
#4 /home/magento/www/app/code/core/Mage/Customer/controllers/AccountController.php(554): Mage_Customer_Model_Customer->sendPasswordResetConfirmationEmail()
#5 /home/magento/www/app/code/core/Mage/Core/Controller/Varien/Action.php(420): Mage_Customer_AccountController->forgotPasswordPostAction()
#6 /home/magento/www/app/code/core/Mage/Core/Controller/Varien/Router/Standard.php(250): Mage_Core_Controller_Varien_Action->dispatch('forgotpasswordp...')
#7 /home/magento/www/app/code/core/Mage/Core/Controller/Varien/Front.php(176): Mage_Core_Controller_Varien_Router_Standard->match(Object(Mage_Core_Controller_Request_Http))
#8 /home/magento/www/app/code/core/Mage/Core/Model/App.php(349): Mage_Core_Controller_Varien_Front->dispatch()
#9 /home/magento/www/app/Mage.php(640): Mage_Core_Model_App->run(Array)
#10 /home/magento/www/index.php(84): Mage::run('default', 'store')
#11 main

于是打开/app/code/core/Mage/Core/Model/Email/Template.php,发现抛出这个错误的代码(在第354行)是:

if (!$this->isValidForSend()) 
    Mage::logException(new Exception('This letter cannot be sent.')); // translation is intentionally omitted
    return false;

所以看看isValidForSend()

public function isValidForSend()

    return !Mage::getStoreConfigFlag('system/smtp/disable')
        && $this->getSenderName()
        && $this->getSenderEmail()
        && $this->getTemplateSubject();

在函数开头添加了一些变量的日志记录,因为其中之一必须返回false

Mage::Log(var_export(!Mage::getStoreConfigFlag('system/smtp/disable'),true).';'.var_export($this->getSenderName(),true).';'.var_export($this->getSenderEmail(),true).';'.var_export($this->getTemplateSubject(),true),null,'email.log');

这会创建日志文件/var/log/email.log,其中包含:

2012-05-30T04:44:37+00:00 DEBUG (7): false;'CustomerSupport';'support@example.com';'Password Reset Confirmation for var customer.name'

所以问题是:!Mage::getStoreConfigFlag('system/smtp/disable'),您可以在 Admin > System > Configuration > Advanced > System > Mail Sending Settings 中修复它并将 Disable Email Communications 更改为 No,因此电子邮件被禁用。

现在可以了:)

【讨论】:

【参考方案3】:

这可能是sendmail 的问题,如果Magento 使用php 默认传输发送电子邮件。

我遇到过 sendmail 拒绝本地域的电子邮件,而不是将这些电子邮件中继到 MX 服务器的情况

http://www.masterdef.net/blog/magento-unable-to-send-mail-sendmail-configuration/#more-1

我建议检查服务器上的mail.log,并发现是否有user unknown之类的错误 这意味着错误的sendmail 配置

【讨论】:

【参考方案4】:

如果电子邮件模板有问题。您会收到此错误。因此,在检查电子邮件日志之前,请检查您的电子邮件模板,此外,当它是自定义电子邮件模板时,代码没有损坏。

【讨论】:

【参考方案5】:

我也为CE 1.9.1下订单邮件无法发送的问题苦苦挣扎,但过了一段时间才发现问题:

从 Magento CE 1.9.1 开始,Magento 不会在订购过程中直接发送订购电子邮件。 相反,邮件排队并由 cron 发送。 所以请确保正确配置 Magento cronjob。

另请参阅:

http://www.magentocommerce.com/knowledge-base/entry/ee1141-ce191-responsive-email#cron http://www.magentocommerce.com/knowledge-base/entry/ce18-and-ee113-installing#install-cron

【讨论】:

【参考方案6】:
public function isValidForSend()

    return !Mage::getStoreConfigFlag('system/smtp/disable')
        && $this->getSenderName()
        && $this->getSenderEmail()
        && $this->getTemplateSubject();

另外,在我的情况下,错误日志将我带到了这个函数。管理员中的配置很好。但是 $this->getTemplateSubject() 正在发送错误值,因为 /app/locale/ 文件夹下缺少模板。所以添加了丢失的模板。之后它对我有用。

【讨论】:

以上是关于magento没有发送任何邮件,如何调试?的主要内容,如果未能解决你的问题,请参考以下文章

如何在magento管理站点块中翻译变量

Magento 中 Mage::registry() 和 Session 的区别

magento - 警告:require_once(app/Mage.php):无法打开流:没有这样的文件或目录

如何获得 Magento 商店货币

如何在 Magento 中获取订单时间?

Magento交易邮件常见问题