Formit произошла ошибка при попытке отправить почту

  1. Главная
  2. Блог
  3. Ошибки, их причины и решения
  4. [FormIt] Ошибка соединения с SMTP-сервером в MODX Revolution

[FormIt] Ошибка соединения с SMTP-сервером в MODX Revolution

Сегодня, после переноса одного из проектов с тестовой площадки на production, перестала работать отправка писем по SMTP через FormIt. Все, что удалось найти в логах это —

[FormIt] Произошла ошибка при попытке отправить почту. Ошибка соединения с SMTP-сервером.

Кроме этого в логах не было ровным счетом ничего. Первое, что пришло на ум — проверить настройки. Они оказались в порядке (не мудрено, ведь я просто перенес сайт с одного хостинга на другой). Следующим шагом стало «гугление» проблемы в интернете, но, к сожалению, ничего внятного по этому поводу найти не удалось ни на русском, ни на английском языке.

Как выяснилось, проблема тут не в FormIt, а в MODX-овском phpmailer. А решилась она заменой версии PHP на хостинге с 5.3 на 5.5. Искать «корень зла» не было времени, а вот решение может еще кому-нибудь поможет.

  • 2016-01-25 20:30:05

Отредактировано: 19 Апреля 2018

QuickEmail можно использовать для отправки писем из какого-либо сниппета, но его основное назначение — диагностика работоспособности функционала отправки почты.

Дополнение устанавливается как и большинство компонентов, через инсталлер MODX. Для использования, просто поместите вызов дополнения на странице сайта.

[[!QuickEmail]]

При просмотре страницы на которой размещен вызов, должна отработать функция отправки сообщения. Если никаких проблем нет, то на почту, указанную при установке cms (можно найти в системных настройках по коду emailsender), должно прийти письмо.

Если ни письма ни ошибки не видно, попробуйте вызвать дополнение так

[[!QuickEmail? &debug=`1`]]

Диагностика проблем электронной почты

Возможные ошибки

  • “Could not instantiate mail function” — на хостинге отключена функция mail();
  • “AUTH failed” — в настройках modx используется отправка с помощью smtp требующая авторизацию. Проверьте правильность доступов, либо используйте mail();
  •  

Отправка почты из сторонних сниппетов

Код ниже можно использовать в сторонних снипетах, но это не лучшее решение, т.к. дополнение обрабатывает кучу информации и лишь затем отправляет почту используя MODX mailer. Гораздо более правильным решением будет — сразу использовать MODX mailer.

$props = array(
    'debug' => '0',
    'hideOutput' => '0',
    'message' => 'Некое сообщение',
    'subject' => 'Какая-то тема',
    'to' => 'someone@somewhere.com',
    'fromName' => 'Кто-то Кто-тович',
    'emailSender' => 'someone@somewhere.com',
    'replyTo' => 'someone@somewhere.com',
    'html' => '1',
    'failureMessage' => '<br /><h3 style=&quot;color:red&quot;>Отправка провалена</h3>',
    'successMessage' => '<br /><h3 style =&quot;color:green&quot;>Почта успешно отправлена</h3>',
    'errorHeader' => '<br />Ошибка почты:',
    'smtpErrorHeader' => '<br />Отчет SMTP-сервера:',
);

$output =  $modx->runSnippet('QuickEmail',$props);
return $output;


Использование MODX Mailer для отправки электронной почты

$modx->getService('mail', 'mail.modPHPMailer');
$modx->mail->set(modMail::MAIL_BODY, 'Some message');
$modx->mail->set(modMail::MAIL_FROM, 'someone@somewhere.com');
$modx->mail->set(modMail::MAIL_FROM_NAME, 'Your Name');
$modx->mail->set(modMail::MAIL_SENDER, 'you@yourdomain.com');
$modx->mail->set(modMail::MAIL_SUBJECT, 'Some Subject');
$modx->mail->address('to', 'somone@somewhere.com', 'UserName');
$modx->mail->address('reply-to', 'you@yourdomain.com');
$modx->mail->setHTML(true);
$sent = $modx->mail->send();
if ($sent) {
    $output = 'Mail Sent';
} else {
    $output = 'Mail Not Sent';
}
return $output;

Описание от разработчика

Здравствуйте друзья!
Попросили подправить форму обратной связи, не отправляет письма.
Вызывается ошибка «Форма содержит ошибки» и красным подсвечивается форма с Почтой, типа адрес почты не правильный или отсутствует…

Форма выводится двумя дополнениями FormIt и AjaxForm
Вот стандартный код который гуляет в сети.

Создаем Чанк tpl.AjaxForm
с кодом

<form action="" method="post" class="ajax_form af_example form-horizontal">
  <div class="control-group">
    <label class="control-label" for="af_name">Имя*</label>
    <div class="controls">
      <input type="text" id="af_name" name="name" value="" placeholder="Введите имя">
      <span class="error_name"></span>
    </div>
  </div>
  <div class="control-group">
    <label class="control-label" for="af_email">E-mail*</label>
    <div class="controls">
      <input type="email" id="af_email" name="email" value="" placeholder="Введите email">
      <span class="error_email"></span>
    </div>
  </div>
  <div class="control-group">
    <label class="control-label" for="af_phone">Телефон</label>
    <div class="controls">
       <input type="text" id="af_phone" name="phone" value="" placeholder="Введите номер телефона">
      <span class="error_phone"></span>
    </div>
  </div>
  <div class="control-group">
    <label class="control-label" for="af_message">Сообщение*</label>
    <div class="controls">
      <textarea id="af_message" name="message" rows="5"></textarea>
      <span class="error_message"></span>
    </div>
  </div>
  <div class="control-group">
    <div class="controls">
      <button type="reset" class="btn btn-default">Очистить</button>
      <button type="submit" class="btn btn-primary">Отправить</button>
    </div>
  </div>
</form>

Вызов сниппета AjaxForm на странице контактов

[[!AjaxForm? 
  &form=`tpl.AjaxForm` 
  &snippet=`FormIt` 
  &hooks=`FormItSaveForm,email`
  &emailSubject=`Тестовое сообщение`
  &emailTo=`myemail@mail.ru`
  &emailFrom=`no-reply@mysite.com`
  &emailTpl=`tpl.email`
  &validate=`name:minLength=^2^,email:email:required,message:minLength=^10^`
  &validationErrorMessage=`В форме содержатся ошибки!`
  &successMessage=`Сообщение успешно отправлено`
]]

Чанк tpl.email с шаблоном самого письма

<h3>Сообщение</h3>
<p>От кого: [[+name]]</p>
<p>E-mail: [[+email]]</p>
<p>Телефон: [[+phone]]</p>
<p>Сообщение: [[+message]]</p>

И не работает, кучу подобный перепробовал, результат тот же.
Подскажите пожалуйста, как решить проблему?
Спасибо!

There is a trouble with email sending in Modx Revolution. Using FormIt plugin, I tried to enable Gmail SMTP at Modx settings list, but the same result. Now SMTP is disabled.

Using this FormIt call:

[[!FormIt? 
     &hooks=`email,redirect`
     &redirectTo=`19`
     &redirectParams=`{"success":"1"}`
     &emailTpl=`feedbackEmailTpl`
     &emailSubject=`New request from [[++site_name]]`
     &emailTo=`***@gmail.com`
     &emailToName=`Support`
     &emailReplyTo=`***@gmail.com`
     &emailFrom=`***@gmail.com`
     &emailFromName=`***@gmail.com`
     &errTpl=`<span class="label label-warning">[[+error]]</span>`
     &validate=`
         name:required:stripTags,
         clientemail:email:required,
         message:required:stripTags
     `
     &clearFieldsOnSuccess=`1`
     &validationErrorMessage=`Error.`
]]

In error.log file:

[2015-06-02 10:33:37] (ERROR @ /var/www/site/core/model/modx/mail/phpmailer/class.phpmailer.php : 893) PHP warning: preg_match(): Compilation failed: internal error: previously-checked referenced subpattern not found at offset 728
[2015-06-02 10:33:37] (ERROR @ /var/www/site/core/model/modx/mail/phpmailer/class.phpmailer.php : 893) PHP warning: preg_match(): Compilation failed: internal error: previously-checked referenced subpattern not found at offset 728
[2015-06-02 10:33:37] (ERROR @ /index.php) [FormIt] Произошла ошибка при попытке отправить почту. Пожалуйста, введите хотя бы один адрес e-mail получателя.

What can be wrong? Is this trouble bound to PHPMailer?

curveball's user avatar

curveball

4,27015 gold badges39 silver badges47 bronze badges

asked Jun 2, 2015 at 8:01

Dmitry's user avatar

This is a PHP bug that affects PHP 5.5.25 and 5.6.9 when run using mod_php with apache. There are a few workarounds until it’s fixed in PHP.

  1. Downgrade PHP to 5.5.24 or 5.6.8
  2. Switch to PHP-FPM instead of mod_php (which is a good idea anyway)
  3. Override the PHPMailer class and change the default email validation method to ‘php’.

This last method would be done like this:

class myMailer extends PHPMailer
{
    public static function validateAddress($address, $patternselect = 'php')
    {
        return parent::validateAddress($address, $patternselect);
    }
}

Then use that subclass instead of the plain PHPMailer class.
The same bug has been affecting various other PHP projects such as Typo3 and SwiftMailer. The bug to track it in PHPMailer is here.

answered Jun 2, 2015 at 9:11

Synchro's user avatar

SynchroSynchro

34.4k15 gold badges79 silver badges99 bronze badges

There is a trouble with email sending in Modx Revolution. Using FormIt plugin, I tried to enable Gmail SMTP at Modx settings list, but the same result. Now SMTP is disabled.

Using this FormIt call:

[[!FormIt? 
     &hooks=`email,redirect`
     &redirectTo=`19`
     &redirectParams=`{"success":"1"}`
     &emailTpl=`feedbackEmailTpl`
     &emailSubject=`New request from [[++site_name]]`
     &emailTo=`***@gmail.com`
     &emailToName=`Support`
     &emailReplyTo=`***@gmail.com`
     &emailFrom=`***@gmail.com`
     &emailFromName=`***@gmail.com`
     &errTpl=`<span class="label label-warning">[[+error]]</span>`
     &validate=`
         name:required:stripTags,
         clientemail:email:required,
         message:required:stripTags
     `
     &clearFieldsOnSuccess=`1`
     &validationErrorMessage=`Error.`
]]

In error.log file:

[2015-06-02 10:33:37] (ERROR @ /var/www/site/core/model/modx/mail/phpmailer/class.phpmailer.php : 893) PHP warning: preg_match(): Compilation failed: internal error: previously-checked referenced subpattern not found at offset 728
[2015-06-02 10:33:37] (ERROR @ /var/www/site/core/model/modx/mail/phpmailer/class.phpmailer.php : 893) PHP warning: preg_match(): Compilation failed: internal error: previously-checked referenced subpattern not found at offset 728
[2015-06-02 10:33:37] (ERROR @ /index.php) [FormIt] Произошла ошибка при попытке отправить почту. Пожалуйста, введите хотя бы один адрес e-mail получателя.

What can be wrong? Is this trouble bound to PHPMailer?

curveball's user avatar

curveball

4,27015 gold badges39 silver badges47 bronze badges

asked Jun 2, 2015 at 8:01

Dmitry's user avatar

This is a PHP bug that affects PHP 5.5.25 and 5.6.9 when run using mod_php with apache. There are a few workarounds until it’s fixed in PHP.

  1. Downgrade PHP to 5.5.24 or 5.6.8
  2. Switch to PHP-FPM instead of mod_php (which is a good idea anyway)
  3. Override the PHPMailer class and change the default email validation method to ‘php’.

This last method would be done like this:

class myMailer extends PHPMailer
{
    public static function validateAddress($address, $patternselect = 'php')
    {
        return parent::validateAddress($address, $patternselect);
    }
}

Then use that subclass instead of the plain PHPMailer class.
The same bug has been affecting various other PHP projects such as Typo3 and SwiftMailer. The bug to track it in PHPMailer is here.

answered Jun 2, 2015 at 9:11

Synchro's user avatar

SynchroSynchro

34.4k15 gold badges79 silver badges99 bronze badges

логи
[2015-04-10 16:49:22] (ERROR @ /assets/components/ajaxform/action.php) [FormIt] Произошла ошибка при попытке отправить почту. Пустое тело сообщения

[[!AjaxForm?
                &snippet=`FormIt`
                &hooks=`spam,email`
                &form=`contactForm`
                &emailTpl=`sentContactEmailTpl`
                &emailSubject=`Заявка с сайта `
                &emailTo=`мояпочта@gmail.com`
                &validate=`orderform_name:required,orderform_email:required`
                &validationErrorMessage=`Необходимо заполнить обязательные поля!`
                &successMessage=`Сообщение успешно отправлено`
            ]]

страница action.php

    <?php

define('MODX_API_MODE', true);
require_once dirname(dirname(dirname(dirname(__FILE__)))) . '/index.php';

$modx->getService('error','error.modError');
$modx->setLogLevel(modX::LOG_LEVEL_ERROR);
$modx->setLogTarget('FILE');

// Switch context if need
if (!empty($_REQUEST['pageId'])) {
    if ($resource = $modx->getObject('modResource', $_REQUEST['pageId'])) {
        if ($resource->get('context_key') != 'web') {
            $modx->switchContext($resource->get('context_key'));
        }
    }
}

/** @var AjaxForm $AjaxForm */
$AjaxForm = $modx->getService('ajaxform','AjaxForm',$modx->getOption('ajaxform_core_path',null,$modx->getOption('core_path').'components/ajaxform/').'model/ajaxform/', array());

if ($_SERVER['HTTP_X_REQUESTED_WITH'] != 'XMLHttpRequest') {
    $modx->sendRedirect($modx->makeUrl($modx->getOption('site_start'),'','','full'));
}
elseif (empty($_REQUEST['af_action'])) {
    echo $AjaxForm->error('af_err_action_ns');
}
else {
    echo $AjaxForm->process($_REQUEST['af_action'], $_REQUEST);
}

@session_write_close();

чанк

<td style="width: 580px;" bgcolor="#ffffff">
                            <h1 style="font-family: Ubuntu, Arial, Helvetica, sans-serif; font-size: 24px; text-align: center;"><font face="Ubuntu, Arial, Helvetica, sans-serif" color="#000000">Заказ звонка!</font></h1>
                            <p style="padding: 10px; font-size: 16px;">
                                <font face="Ubuntu, Arial, Helvetica, sans-serif" color="#000000">
                                    Имя: [[+orderform_name]]<br />
                                    E-mail: [[+orderform_email]]<br />
                                </font>
                            </p>
                            <p style="padding: 10px; font-size: 16px;">
                                <font face="Ubuntu, Arial, Helvetica, sans-serif" color="#000000">
                                    Сообщение: [[+orderform_message]]
                                </font>
                            </p>
                        </td>

заметил вот что, на главной сверху обратный звонок такой

     [[!FormIt?
&hooks=`email`
&emailTpl=`sentEmailTpl`
&emailSubject=`Message from Learn MODx Revo Website`
&emailTo=`моя почта@gmail.com`
]]
                <div class=" col-lg-2 col-md-2 col-sm-6 col-xs-12">
                    <div class="callbak_phone"><button data-target="#callback" data-toggle="modal" title="Заказать обратный звонок" type="submit" class="btn btn-default">Заказать обратный звонок</button>

                    </div>
                </div>

в футере есть

 <!-- callback -->
    <div class="modal fade" id="callback" tabindex="-1" role="dialog" aria-labelledby="callbackLabel" aria-hidden="true">
      <div class="modal-dialog">
        <div class="modal-content">
          <div class="modal-header">
            <button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button>
            <h4 class="modal-title" id="callbackLabel">Заказать обратный звонок</h4>
          </div>
          <div class="modal-body">
            [[!AjaxForm?
                &snippet=`FormIt`
                &hooks=`spam,email`
                &form=`callbackForm`
                &emailTpl=`sentEmailTpl`
                &emailSubject=`Заказ звонка с сайта `
                &emailTo=`моя почта@gmail.com`
                &validate=`callbackform_name:required,callbackform_phone:required`
                &validationErrorMessage=`Необходимо заполнить все поля!`
                &successMessage=`Сообщение успешно отправлено`
            ]]

          </div>
        </div>
      </div>
    </div>

    <!-- callback -->
    <div class="modal fade" id="orderForm" tabindex="-1" role="dialog" aria-labelledby="orderFormLabel" aria-hidden="true">
      <div class="modal-dialog">
        <div class="modal-content">
          <div class="modal-header">
            <button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button>
            <h4 class="modal-title" id="orderFormLabel">Заявка на объект</h4>
          </div>
          <div class="modal-body">
            [[!AjaxForm?
                &snippet=`FormIt`
                &hooks=`spam,email`
                &form=`orderForm`
                &emailTpl=`sentOrderEmailTpl`
                &emailSubject=`Заявка с сайта`
                &emailTo=`моя почта@gmail.com`
                &validate=`orderform_name:required,orderform_email:required,orderform_product_name:required`
                &validationErrorMessage=`Необходимо заполнить все поля!`
                &successMessage=`Сообщение успешно отправлено`
            ]]

          </div>
        </div>
      </div>
    </div>

и вот сам чанк sentEmailTpl

       [[!FormIt?
&hooks=`email`
&emailTpl=`sentEmailTpl`
&emailSubject=`Message from Learn MODx Revo Website`
&emailTo=`моя почта@gmail.com`
]]
                    <table>
                        <tbody>
                        <tr>
                            <td style="width: 10px"></td>
                            <td style="width: 580px;" bgcolor="#ffffff">
                                <h1 style="font-family: Ubuntu, Arial, Helvetica, sans-serif; font-size: 24px; text-align: center;"><font face="Ubuntu, Arial, Helvetica, sans-serif" color="#000000">Заказ звонка!</font></h1>
                                <p style="padding: 10px; font-size: 16px;">
                                    <font face="Ubuntu, Arial, Helvetica, sans-serif" color="#000000">
                                        Имя: [[+callbackform_name]]<br />
                                        Телефон: [[+callbackform_phone]]<br />
                                    </font>
                                </p>
                            </td>
                            <td style="width: 10px"></td>
                        </tr>
                        </tbody>
                    </table>
                </td>
            </tr>

меня смущает &emailTpl=sentEmailTpl т.е. tpl он ставит свой

Ошибки. Как же часто приходится с ними сталкиваться в процессе разработки сайта. Особенно непонятно, что делать, когда ошибка кажется не явной и никаких решений не предвидится. А в интернете на запрос об ошибке выходят только скудные ответы. В этой статье разберем часто возникающие ошибки с одним из популярнейших бесплатных компонентов FormIt:


Внимание! Указание ящика самого сайта (к примеру, test@litosh-web.ru) поможет сделать быструю настройку почты и избежать дальнейших проблем с сайтом и FormIt. При этом указывать SMTP данные не требуется. Поскольку почта принадлежит домену, с которого она отправляется. Саму же почту создаёте через хостинг и управляете ей через SMTP клиенты.

  1. [FormIt] Пожалуйста, укажите получателя или получателей электронной почты.
    • Помогло удаление значения &emailFrom в вызове сниппета
  2. [FormIt] Произошла ошибка при попытке отправить почту. SMTP connect() failed. https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting.
    • В системных настройках SMTP (настройки почты) указан либо неверно, либо вовсе не прописан
    • Можно отключить настройку mail_use_smtp. Но в этом случае возможно попадание писем в СПАМ по причине того, что у вас в письме возможно будет неподтвержденный email (с зачеркнутым замочком).
  3. Если нет логов в журнале ошибок, то необходимо добавить параметр &emailFrom в вызов сниппета.
  4. Важно, если вы не планируете использовать SMTP. Не указывайте в качестве отправителя другие адреса после @ в качестве отправителя. Указывайте свой адрес сайта.

Подобных вопросов как я обнаружил в гугле множество но и решение у них разные(пробовал все!). У каждого своя проблема хоть и название у всех общие (FormIt).
Форма обратной связи у меня состоит из двух строк (имя) и (телефон)

[[!FormIt? &hooks=`recaptcha,spam,email,redirect` &emailTpl=`sentEmailTpl` &emailTo=`bolshackov.junk@yandex.ru` &redirectTo=`11` &validate=`name:required, email:email:required, subject:required, text:required:stripTags, numbers:required, colors:required` ]]

<form action="[[~11]]" method="post"> <fieldset> <div class="in_contact"> <input type="text" name="name" placeholder="имя" class="form-control margin-for-forms" id="name" value="" /> </div> <div class="in_contact"> <input type="text" name="phone" placeholder="телефон" class="form-control margin-for-forms" id="subject" value="" /> </div> <input type="submit" name="submit" class="button-callme" value="Отправить заявку" /> </fieldset> </form>

<p>Имя: [[+name]]</p> <p>Телефон: [[+phone]]</p>

Помогите разобраться в чем проблема, почему редирект исполняется а письмо на почту не доходит.
В конфигах была подобная ошибка(была по тому что перестала выводится само собой): [FormIt] Произошла ошибка при попытке отправить почту. Невозможно запустить функцию mail. Как запускать функцию я не нашел. Предполагаю это где то в phpmailer. но что где и куда не нашел.

  1. Главная
  2. Блог
  3. Ошибки, их причины и решения
  4. [FormIt] Ошибка соединения с SMTP-сервером в MODX Revolution

[FormIt] Ошибка соединения с SMTP-сервером в MODX Revolution

Сегодня, после переноса одного из проектов с тестовой площадки на production, перестала работать отправка писем по SMTP через FormIt. Все, что удалось найти в логах это —

[FormIt] Произошла ошибка при попытке отправить почту. Ошибка соединения с SMTP-сервером.

Кроме этого в логах не было ровным счетом ничего. Первое, что пришло на ум — проверить настройки. Они оказались в порядке (не мудрено, ведь я просто перенес сайт с одного хостинга на другой). Следующим шагом стало «гугление» проблемы в интернете, но, к сожалению, ничего внятного по этому поводу найти не удалось ни на русском, ни на английском языке.

Как выяснилось, проблема тут не в FormIt, а в MODX-овском phpmailer. А решилась она заменой версии PHP на хостинге с 5.3 на 5.5. Искать «корень зла» не было времени, а вот решение может еще кому-нибудь поможет.

  • 2016-01-25 20:30:05

[[FormIt? 
      &hooks=`email`
      &emailSubject=`Сообщение с сайта`
      &emailTo=`myemail@ya.ru`
      &emailFrom=`[[++mail_smtp_user]]`
      &emailTpl=`emailTpl`
      &validate=`name:minLength=^2^,email:email:required,message:minLength=^10^`
      &validationErrorMessage=`В форме содержатся ошибки!`
      &successMessage=`Сообщение успешно отправлено`
]]

Вот код вызова снипетта, но почта не отправляется ниже приложен лог MODX

[2016-07-20 09:13:16] (ERROR @ /var/www/vhosts/12/144988/webspace/httpdocs/core/components/formit/model/formit/fihooks.class.php : 552) [FormIt] Произошла ошибка при попытке отправить почту. Ошибка соединения с SMTP-сервером https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting

Понравилась статья? Поделить с друзьями:
  • Forza horizon 4 ошибка при запуске приложения 0xc000012d
  • Forza horizon 4 ошибка при запуске приложения 0xc000007b
  • Forza horizon 4 ошибка подключения к серверу
  • Forza horizon 4 ошибка память не может быть read
  • Forza horizon 4 ошибка ipsec 0x00000000