Вход • Регистрация

PHP не отправляет с сайта на хостинге DIAFAN почтовые сообщения

  • 04 февраля 2019 г.
  • Добрый день!

    Разместил сайт на хостинге DIAFAN, шаблон бизнес (нет корзины товаров, но она в полноценном виде не нужна, поскольку сайт B2B, только сформировать заказ и отправить его на почту менеджеру).

    В сети нашел скрипт: http://www.cyberforum.ru/php-beginners/thread2150996.html#post13269630

    Разобрался, запустил его на сайте, все работает, кроме php отправки почтовых сообщений (файл sendmail во вложении), для того ,чтобы понять, почему php не работает, набрал тестовый php:

    ?php
    $to = "Alex_bur;buralkov_a_v@mail.ru>, " ;
    $to .= "AlexVas;alexvas@inbox.ru>";

    $subject = "Test";

    $message = '
    <html>
    <head>
    <title>Test from uart24.ru</title>
    </head>
    <body>
    <p>Do you recieve this mail</p>
    </body>
    </html>';

    $headers = "Content-type: text/html; charset=windows-1251 \r\n";
    $headers .= "From: Birthday Reminder <uart.plc@bk.ru>\r\n";
    $headers .= "Bcc: birthday-archive@example.com\r\n";

    mail($to, $subject, $message, $headers);
    ?>


    но результата так и не получил.

    Кто нибудь сталкивался с таким вопросом? Помогите пожалуйста.
    Пытался посмотреть, как работает обратная связь на моем шаблоне, так там обращение к функциям ч/з несколько файлов, я всю цепочку не отследил.

    • 04 февраля 2019 г.
    • Зачем это все, если отправка уведомлений о событии есть в cms?
      • 04 февраля 2019 г.
      • Здравствуйте, отправка уведомлений есть, но это неудобно, мне нужно, чтобы клиент на сайте из нескольких товаров выбрал список необходимого, затем один раз сформировал заказ, который обработал менеджер, выставил счет клиенту, после оплаты счета, продукция была отправлена заказчику.
        • 04 февраля 2019 г.
        • Ну так зачем терять время и что-то изобретать, если можно использовать для этих целей корзину.
          Переименовать кнопку: добавить в список.
          Переименовать страницу корзины: Ваш список заказов (site.ru/orders)

          Бонусом, клиент сразу указывает адрес доставки и прочее (можно добавить нужные поля).

          Вообще вы выше описали корзину.
          • 04 февраля 2019 г.
          • Цитата
            Разместил сайт на хостинге DIAFAN, шаблон бизнес (нет корзины товаров)


            Чую я, нужен тариф с магазином.
    • 04 февраля 2019 г.
    • Используйте отправку уведомлений чере smtp-сервер.
      • 04 февраля 2019 г.
      • Здравствуйте, подскажите, как мне подключить smtp, если у меня вызывается форма:

        <div id="order" class="popup">
        <a href="#" onclick="cart.closeWindow(&#39;order&#39;, 0)" style="float:right; color:#A60D0D">[закрыть]</a>
        <h4 style="color:#A60D0D">Введите ваши контактные данные</h4>

        <form id="formToSend">
        <input id="fio" type="text" placeholder="Организация и контактное лицо" class="">
        <input id="city" type="text" placeholder="Город" class="text-input">
        <input id="phone" type="text" placeholder="Контактный телефон" class="text-input">
        <input id="email" type="text" placeholder="Электронная почта" class="">
        <br>
        <textarea id="question" placeholder="Адрес"></textarea>
        </form>
        <button onclick="cart.sendOrder(&#39;formToSend,overflw,bsum&#39;);" href="#">Отправить заказ</button>
        </div>


        При нажатии кнопки "Отправить заказ"

        в js скрипте данные из формы передаются в обработку php:

        $.post( "https://uart24.ru/sendmail.php?subj=Order Uart24.ru", { "order": bodyHTML, "email": $("#email").val() }).done(function( data ) {


        а в php происходит подготовка и отправка сообщений клиенту и менеджеру:

        <?php
        $mail = $_POST["order"];
        $subject = htmlentities($_GET["subj"]) . "/ Заказ (".date("d.M.Y H:i:s").")";

        $mail = strip_tags($mail, "<b><div><table><tbody><tr><td><html><body><style><h1><th><br>");
        $mail = str_replace("<td></td>", "",$mail);
        $mail = preg_replace('/<div[^>]+class="basket_num_buttons"[^>]*>.*?<\/div>/i', '', $mail);
        $mail = preg_replace("/<([a-z][a-z0-9]*)[^>]*?(\/?)>/i",'<$1$2>', $mail);

        $template = "<html>
        <style>
        *
        { font-family: Arial;}
        table
        { border-collapse: collapse; }
        td
        { padding: 5px; border: 1px solid #000;}
        th
        {
        background: #999; padding: 5px;
        }

        </style>
        <body>
        <h1>".$subject."</h1>
        ".$mail."</body></html>";

        $template .= '<hr>' . $_SERVER['HTTP_REFERER'];

        // Clear form


        $head = "<tr><th>ID</th><th>Название</th><th>Цена</th><th>Кол-во</th><th>Всего</th></tr>";

        $template = str_replace ( "<tbody>" ,"<tbody>".$head, $template);

        //$domain = "uart24.ru";

        $ea = $_POST["email"]; // адрес e-mail клиента
        $headers = "From: " . $ea . "\r\n";
        $headers .= "Reply-To: ". $ea . "\r\n";
        $headers .= "MIME-Version: 1.0\r\n";
        $headers .= "Content-Type: text/html; charset=UTF-8\r\n";
        $success = mail("uart.plc@bk.ru", $subject, $template, $headers); //Отправляется менеджеру


        $from = "uart.plc@bk.ru"; // от кого
        $headers = "From: " . $from . "\r\n";
        $headers .= "Reply-To: ". $from . "\r\n";
        $headers .= "MIME-Version: 1.0\r\n";
        $headers .= "Content-Type: text/html; charset=UTF-8\r\n";
        $success = mail($ea, $subject, $template, $headers); //Отправляется клиенту

        echo ($success) ? 'true' : 'false';

        ?>


        У себя в менеджере файлов нашел функцию php обработки smtp:

        <?php
        /**
        * @package DIAFAN.CMS
        *
        * @author diafan.ru
        * @version 6.0
        * @license http://www.diafan.ru/license.html
        * @copyright Copyright (c) 2003-2018 OOO «Диафан» (http://www.diafan.ru/)
        */

        if (! defined('DIAFAN'))
        {
        $path = __FILE__;
        while(! file_exists($path.'/includes/404.php'))
        {
        $parent = dirname($path);
        if($parent == $path) exit;
        $path = $parent;
        }
        include $path.'/includes/404.php';
        }

        /**
        * Отправляет электронное письмо
        *
        * @param string|array $recipient получатель/получатели
        * @param string $subject тема письма
        * @param string $body содержание письма
        * @param string $from адрес отправителя
        * @param string $error_output вывод ошибки
        * @param string $trace_output вывод трассировки
        * @return boolean
        */
        function send_mail($recipient, $subject, $body, $from = '', &$error_output = '', &$trace_output = '')
        {
        Custom::inc('plugins/class.phpmailer.php');

        $mail = new PHPMailer();

        if (defined('SMTP_MAIL') && SMTP_MAIL && SMTP_HOST && SMTP_LOGIN && SMTP_PASSWORD)
        {
        $mail->isSMTP(); // telling the class to use SMTP
        $mail->Host = SMTP_HOST; // SMTP server
        $mail->SMTPDebug = MOD_DEVELOPER ? 1 : 0; // enables SMTP debug information (for testing)
        // 1 = errors and messages
        // 2 = messages only
        $mail->SMTPAuth = true; // enable SMTP authentication
        if (SMTP_PORT)
        {
        $mail->Port = SMTP_PORT; // set the SMTP port for the GMAIL server
        }
        $mail->Username = SMTP_LOGIN; // SMTP account username
        $mail->Password = SMTP_PASSWORD; // SMTP account password

        // TO_DO: Don't mix up these modes; ssl on port 587 or tls on port 465 will not work.
        // TO_DO: PHPMailer 5.2.10 introduced opportunistic TLS - if it sees that the server is advertising TLS encryption (after you have connected to the server), it enables encryption automatically, even if you have not set SMTPSecure. This might cause issues if the server is advertising TLS with an invalid certificate, but you can turn it off with $mail->SMTPAutoTLS = false;.
        $mail->SMTPAutoTLS = false;

        // TO_DO: Failing that, you can allow insecure connections via the SMTPOptions property introduced in PHPMailer 5.2.10 (it's possible to do this by subclassing the SMTP class in earlier versions), though this is not recommended as it defeats much of the point of using a secure transport at all:
        $mail->SMTPOptions = array(
        'ssl' => array(
        'verify_peer' => false,
        'verify_peer_name' => false,
        'allow_self_signed' => true
        )
        );
        }

        $mail->setFrom($from ? $from : EMAIL_CONFIG, TITLE);
        $mail->Subject = $subject;
        $mail->msgHTML($body);

        if (is_array($recipient))
        {
        foreach ($recipient as $to)
        {
        $mail->addAddress($to);
        }
        }
        elseif (strpos($recipient, ',') !== false)
        {
        $recipients = explode(',', $recipient);
        foreach ($recipients as $r)
        {
        $mail->addAddress(trim($r));
        }
        }
        else
        {
        $mail->addAddress($recipient);
        }

        ob_start();
        $mailssend = $mail->send();
        $trace_output = ob_get_contents();
        ob_end_clean();
        $error_output = $mail->ErrorInfo;
        return $mailssend;
        }


        Как мне задействовать функцию по нажатию кнопки "Отправить заказ", передать из формы данные, сформировать тело письма?

        Текст письма-заказа:

        Order uart24.ru/ Заказ (31.Jan.2019 06:44:48)
        Наименование Организации/контактное лицо
        Алекс
        Адрес передачи товара
        Красноярск
        Контактный телефон
        123
        Дата доставки
        02.04.2017
        Электронная почта
        burlakov_a_v@mail.ru

        Примечание
        Упаковать, отправить ТК ДелЛин

        ID Название Цена Кол-во Всего
        KP453588 Профиль Daisy 511,53 руб. 1 511,53 руб.


        511,53 руб.


        • 04 февраля 2019 г. , редакция: 04 февраля 2019 г.
        • Цитата
          $success = mail($ea, $subject, $template, $headers); //Отправляется клиенту

          Ответ:
          Цитата
          функция mail() закрыта
          Поэтому надо:
          Цитата
          Используйте отправку уведомлений через smtp-сервер.


          Цитата
          Здравствуйте, подскажите, как мне подключить smtp, если у меня вызывается форма
          Тут два варианта ответа.

          Первое (если Вы действуете в рамках cms), то достаточно задать требуемые параметры smtp-сервера в разделе "Параметры сайта" и в обработчике AJAX-запроса использовать следующую конструкцию для отправки уведомления:

          Код
          $this->diafan->_postman->message_add_mail(
          $recipient, // получатель/получатели
          $subject, // тема письма
          $body, // содержание письма
          $from // адрес отправителя
          );


          Второе (если хотите действовать вне кода cms), то используйте, например, плагин phpmailer. Указанный плагин находится по адресу plugins/class.phpmailer.php. Вариант использования его Вы уже привели в Вашем сообщении. То есть в содержании функции:
          Цитата
          function send_mail($recipient, $subject, $body, $from = '', &$error_output = '', &$trace_output = '')
          • 05 февраля 2019 г.
          • Давайте остановимся на первом варианте:

            Цитата
            Первое (если Вы действуете в рамках cms), то достаточно задать требуемые параметры smtp-сервера в разделе "Параметры сайта" и в обработчике AJAX-запроса использовать следующую конструкцию для отправки уведомления: Код$this->diafan->_postman->message_add_mail( $recipient, // получатель/получатели $subject, // тема письма $body, // содержание письма $from // адрес отправителя);


            Как мне обратиться к AJAX-запросу?

            У меня есть html из которого вызывается форма (приведена в первом сообщении), есть скрипт js в отдельном файле, в котором обрабатываются и формируются данные заказа, по кнопке отправить заказ, вызывается php обработчик, который данные из формы и js скрипта формирует в почтовое сообщение.

            Где разместить ajax-запрос?

            Как перед обращением положить данные в переменные: $recipient, $subject, $body, $from ?
          • 05 февраля 2019 г.
          • Можете привести какой-нибудь простой, но полноценный пример, чтобы мне уловить суть использования ayax-запроса?
    • 04 февраля 2019 г.
    • Во-первых, функция mail() закрыта уже давно у всех нормальных хостингов.
      Во-вторых, воткните форму обратной связи show_form module=feedback у товаров и всё. Человек её заполнил, Вам прилетело письмо. И смс, если надо
      • 04 февраля 2019 г.
      • Здравствуйте!

        Получается ,что для каждого товара клиенту нужно будет заполнять каждый раз форму обратной связи?
  • 02 декабря 2022 г. , редакция: 02 декабря 2022 г.
  • Добрый день!

    У нас в DIAFAN.CMS версия 6.0.13.2 подключена отправка сообщений через Email и Телеграм.

    Проблема заключается в том, что через Телеграм уведомления к Боту уходят моментально, а через сервис Email некоторые уведомления (2-3%) зависают со статусом "Подготовлено" и не отправляются (прикрепил скриншот).

    Уведомления со статусом "Подготовлено" можно отправить только принудительно из админки, отметив их галочками. Самостоятельно они не отправляются.

    Подскажите, пожалуйста, нет ли какого-то механизма в движке, чтобы эти письма отправлялись гарантировано в течении 1-3 минут?
    У нас ресторан доставки еды, а там скорость отправки сообщений на почту очень критична.

    С уважением.

Новости

  • Вчера, 09:05
  • В новой сборке совершили революцию в структурировании кастомизированной информации в шаблонах, добавили авторегистрацию пользователей, усовершенствовали защиту от спама, актуализировали накопительную скидку, а также улучшили производительность и стабильность работы системы.
  • 12 января
  • После выхода сборки 7.1 мы выпустили уже три патча, в каждом из которых улучшаем административную часть сайта. Сборка DIAFAN.CMS 7.1.3 уже доступна к установке. 
  • 15 декабря 2023 г.
  • Подводим итоги 2023 года. Выпустили новую сборку DIAFAN.CMS 7.1.1, вводим новые тарифы на аренду сайта и коммерческую поддержку и автообновления с января 2024 г., строим планы на будущий год.