Magento:如何使用实际数据预览/测试事务性电子邮件,而不实际发送它们?

38

我正在编辑Magento中的交易邮件中包含的一些phtml文件,但为了测试更改,我必须实际发送电子邮件。例如订单确认电子邮件的情况下,这意味着每次想要测试电子邮件时都必须下订单!

在后台选择“预览电子邮件”没有帮助,因为电子邮件不包含可见的订单数据。

是否有一种方法可以预览交易邮件,但使其呈现具有订单数据?


你能硬编码它,让它直接发送邮件给你吗? - Wing Lian
作为“预览电子邮件”功能的一部分,您是指吗?可能是这样,但我不确定如何做到。而且在发送之前,我也不知道如何将订单数据注入其中。 - WackGet
12
像这样的情况,创建一个开发环境通常是个好主意。而且您无需创建新的订单,可以重新发送之前的订单电子邮件(进入该订单并点击“重新发送电子邮件”)。 - MagePal Extensions
重新发送电子邮件是个好的提示。谢谢您。如果您想将其作为正式答案,我会接受它。否则我会回答它。 - WackGet
其他的电子邮件通知呢? - ermannob
11个回答

39

来自用户R.S:

您不必创建新订单,您可以重新发送以前的订单电子邮件(通过进入该订单并点击重新发送电子邮件)。

这是我在调试模板时快速重新测试电子邮件所找到的最接近的方法。感谢R.S!


1
如果已经发送了新订单电子邮件,则可能无法再次发送。请检查Mage_Sales_Model_Order :: sendNewOrderEmail()是否具有if($ this-> getEmailSent()){return $ this;}测试。如果是这样,请暂时将其注释掉。 - Hervé Guétin

19
以下代码片段将呈现“新销售订单”电子邮件并将其显示给任何给定的订单。例如,将以下内容放入/test.php中,然后只需浏览到正确的位置,如http://www.example.com/test.php
require_once 'app/Mage.php';
Mage::app();

// loads the proper email template
$emailTemplate  = Mage::getModel('core/email_template')
                      ->loadDefault('sales_email_order_template');

// All variables your error log tells you that are missing can be placed like this:

$emailTemplateVars = array();
$emailTemplateVars['usermessage'] = "blub";
$emailTemplateVars['store'] = Mage::app()->getStore();
$emailTemplateVars['sendername'] = 'sender name';
$emailTemplateVars['receivername'] = 'receiver name';

// order you want to load by ID

$emailTemplateVars['order'] = Mage::getModel('sales/order')->load(673);

// load payment details:
// usually rendered by this template:
// web/app/design/frontend/base/default/template/payment/info/default.phtml
$order = $emailTemplateVars['order'];
$paymentBlock = Mage::helper('payment')->getInfoBlock($order->getPayment())
                ->setIsSecureMode(true);
$paymentBlock->getMethod()->setStore(Mage::app()->getStore()); 

$emailTemplateVars['payment_html'] = $paymentBlock->toHtml();

//displays the rendered email template
echo $emailTemplate->getProcessedTemplate($emailTemplateVars);

1
请在您的代码中添加更多信息,以便该网站的其他访问者可以从您的答案中受益! - KhorneHoly
它真的很好用!非常感谢!这样可以节省很多电子邮件 :D - Keenora Fluffball

15

对于销售订单,我使用一个测试帐户和我在根目录中拥有的脚本。

这个脚本看起来像这样:

<?php
include 'app/Mage.php';
Mage::app('default');

$_order = Mage::getModel('sales/order')->load($argv[1]);
$_order->sendNewOrderEmail(); 

我将其称为:

php -f sendTestEmail.php -- 4303 

4303是我之前用于测试的订单号。

希望这有所帮助。


2
这是一个理想的使用情况,适合于Web不可访问的Shell脚本。如果一个脚本小子在Web根目录中找到了它,那就糟糕了。 - Luke A. Leber
2
@LukeA.Leber 如果只是在开发环境中,那就没问题了,只要确保它不会出现在公共访问地图中。 - Bram B

4
我们开发了一个名为 Hackathon_EmailPreview 的免费开源扩展程序。

关于订单邮件,您可以在不发送的情况下在浏览器中预览,并且您可以输入任何订单号来检查不同订单的外观。

1
你的扩展程序没有“如何使用”的帮助文档。你应该将其添加到文档中,因为目前只有安装说明。 - RPDeshaies
1
没错。感谢您的输入。 - Matthias Zeis
你好,我在Magento 1.9上测试了你的模块,但它无法正常工作。在点击预览按钮后,我们会收到一个错误提示,大概意思是“调用支付实例”,具体我记不清了,但在1.9版本上无法正常运行。 - joaogdesigner
可能是真的。这是一个黑客马拉松项目,不是一个正在积极维护的项目。正如自述文件中所述,它仅在CE 1.7.0.2上进行了测试(这是黑客马拉松期间的当前版本)。 - Matthias Zeis

4

这也很棒,肯定会派上用场。谢谢。唯一的缺点是它不能消除我不得不不断下订单的需求。但是使用R.S上面提到的“重新发送电子邮件”的提示,这将变得容易。 - WackGet
没错。继续发送相同的订单以微调您的交易电子邮件。 - Tom van den Heuvel

3

4
StackOverflow不是发布付费扩展链接的地方,特别是当您的答案只是链接而没有有用的文字时。 - swl1020
2
这位同学只是在提出一个解决方案,我认为这并没有违反任何 Stack Overflow 的规定... - Zaffar Saffee
答案确实是宣传性的。但我能做的只有留下一个“宣传性”的评论,因为我在工作中使用那个扩展程序,它能够完成工作并且很好用。 - hakre

1
我发布了一个扩展程序,使您可以预览后台的交易邮件。 您只需传递一个订单,然后在BO中将会出现一个邮件预览按钮。此外,它允许您直接在邮件预览窗口中启用模板/块提示。请查看这里:https://github.com/OddBrew/Oddbrew_MailViewer 这是一个免费的扩展程序,所以我希望它不会违反SO的推广规则。

好东西 - 谢谢!在1.9.4上运行良好。 - Andy Triggs

1
您可以进入后台,选择“客户”,选择自己的客户用户,在底部您会看到“发送自动生成密码”的选项。输入管理员密码并点击“保存并继续编辑”。这样,您将向自己的帐户发送一个密码,并测试模板。

1
我使用一个小测试脚本来重新发送订单确认电子邮件。这在Magento 1.9中有效,因为它会触发cronjob来处理电子邮件队列。此外,它会重置属性“已发送电子邮件”,以便Magento不会跳过发送该电子邮件。
include 'app/Mage.php';
Mage::app('default');

$oid = '1234567';

$_order = Mage::getModel('sales/order')->load($oid);    
$_order->setEmailSent('0');
$_order->save();

$_order->sendNewOrderEmail();

// var_dump($_order);

// Trigger email queue
$a = new Mage_Core_Model_Email_Queue();
$a->send();

echo "\nFinished\n";

0

前往 app/code/local/Mage/Core/Model/Email/Template.php 文件。 在 send 函数中,大约在第 441 行附近有一段代码

   if ($this->isPlain()) {
         $mail->setBodyText($text);
    } else {
        $mail->setBodyHTML($text);
    }
  echo $text;die();

它将在浏览器上回显邮件,而不实际发送给用户。可以用于测试。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接