在PrestaShop 1.6中调试Swift Mailer

时间:2016-11-30 11:22:13

标签: prestashop-1.6 swiftmailer

偶尔使用PrestaShop的Mail::send功能发送邮件失败。我使用外部邮件服务器,那里的负责人告诉我没有收到发送任何邮件的请求(我发现这很奇怪)。所以,我做了一个小记录器,做了以下事情:

if ( !Mail::send() )
    // logging details here here..

Mail::send正确返回false。现在我想知道原因。因此,我想在SwiftMailer中记录有关连接的信息。有人可以给我一些线索如何在一个简单的庄园中解决这个问题(如果可能的话,不要使用SwiftMailer插件)。

Swift Mailer版本:3.3.2

3 个答案:

答案 0 :(得分:2)

如果您将$die param设置为true,那么在更改订单状态等时,您将导致该脚本停止并在购买或管理时为客户带来糟糕的体验。您应该检查以下内容:

  1. 检查特定电子邮件模板上的电子邮件发送是否失败。如果为true,则可能会遇到模板结构,传递参数,html渲染等问题。
  2. Prestashop日志中记录了Mail::Send功能中的每个错误。所以你应该在那里检查一下。您可以知道在函数Mail::Send中识别此类代码的每个可能错误:Tools::dieOrLog(Tools::displayError('Error: invalid SMTP server or SMTP port'), $die);
  3. 使用此代码记录特定的Swift异常:PrestaShopLogger::addLog('Swift Error: ' . $e->getMessage(), 3, null, 'Swift_Message');因此它也应出现在Prestashop日志中。
  4. 无论如何,Swift有他自己的班级Swift_Log_DefaultLog。您可以在\tools\swift\Swift\Log\DefaultLog.php找到它。您可以修改adddump函数以将日志保存到特定文件或类似文件。
  5. 祝你好运。

答案 1 :(得分:1)

$die参数设置为true以显示错误。您需要_PS_MODE_DEV_设置为true才能看到它。

/**
 * Send Email
 *
 * @param int $id_lang Language ID of the email (to translate the template)
 * @param string $template Template: the name of template not be a var but a string !
 * @param string $subject Subject of the email
 * @param string $template_vars Template variables for the email
 * @param string $to To email
 * @param string $to_name To name
 * @param string $from From email
 * @param string $from_name To email
 * @param array $file_attachment Array with three parameters (content, mime and name). You can use an array of array to attach multiple files
 * @param bool $mode_smtp SMTP mode (deprecated)
 * @param string $template_path Template path
 * @param bool $die Die after error
 * @param string $bcc Bcc recipient
 * @return bool|int Whether sending was successful. If not at all, false, otherwise amount of recipients succeeded.
 */
public static function Send($id_lang, $template, $subject, $template_vars, $to,
    $to_name = null, $from = null, $from_name = null, $file_attachment = null, $mode_smtp = null,
    $template_path = _PS_MAIL_DIR_, $die = false, $id_shop = null, $bcc = null, $reply_to = null)

或者,您可以转到后台和菜单Advanced Parameters -> Logs,输入消息过滤器:error并搜索结果。它不能保证它只会向您显示电子邮件错误,但它会将其缩小很多。

答案 2 :(得分:0)

无法告诉您Mail :: send()函数失败的原因。失败可能有多种原因。

有12行代码在Mail :: send()函数中返回false,每行都有不同的条件。您需要调试函数以找到确切的原因。

你可以在/classes/Mail.php的Mail.php文件中找到Mail :: send()函数

提示:您可以添加每个'返回false的日志;'函数中的语句,用于检查哪些语句正在执行。