Писать на форуме DIAFAN.CMS могут только зарегистрированные пользователи. Войдите или зарегистрируйтесь.

Форум Сайт на DIAFAN.CMS Вопросы от новичков PHP не отправляет с сайта на хостинге DIAFAN почтовые сообщения


Александр (Uart) Сайт в Diafan.Cloud04 февраля, понедельник

Добрый день!

Разместил сайт на хостинге 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);
?>


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

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

Привет (romaromk) 4704 февраля, понедельник

Зачем это все, если отправка уведомлений о событии есть в cms?

Александр (Uart) Сайт в Diafan.Cloud04 февраля, понедельник

Здравствуйте, отправка уведомлений есть, но это неудобно, мне нужно, чтобы клиент на сайте из нескольких товаров выбрал список необходимого, затем один раз сформировал заказ, который обработал менеджер, выставил счет клиенту, после оплаты счета, продукция была отправлена заказчику.

Привет (romaromk) 4704 февраля, понедельник

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

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

Вообще вы выше описали корзину.

Александра (Alexa0105) 16704 февраля, понедельник

Цитата
Разместил сайт на хостинге DIAFAN, шаблон бизнес (нет корзины товаров)


Чую я, нужен тариф с магазином.

Виталий NVGPRO (DIAFAN.CMS) 32604 февраля, понедельник

Используйте отправку уведомлений чере smtp-сервер.

Александр (Uart) Сайт в Diafan.Cloud04 февраля, понедельник

Здравствуйте, подскажите, как мне подключить 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 руб.


Виталий NVGPRO (DIAFAN.CMS) 32604 февраля, понедельник, редакция 04 февраля, понедельник

$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 = '')

Александр (Uart) Сайт в Diafan.Cloud05 февраля, вторник

Давайте остановимся на первом варианте:

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


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

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

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

Как перед обращением положить данные в переменные: $recipient, $subject, $body, $from ?

Александр (Uart) Сайт в Diafan.Cloud05 февраля, вторник

Можете привести какой-нибудь простой, но полноценный пример, чтобы мне уловить суть использования ayax-запроса?

Виталий (DIAFAN.CMS) 63404 февраля, понедельник

Во-первых, функция mail() закрыта уже давно у всех нормальных хостингов.
Во-вторых, воткните форму обратной связи show_form module=feedback у товаров и всё. Человек её заполнил, Вам прилетело письмо. И смс, если надо

Александр (Uart) Сайт в Diafan.Cloud04 февраля, понедельник

Здравствуйте!

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