Статьи о настройке ПО и прочего, что связано с хостингом.
  • Дата создания
    18 февраля 2013
  • Топиков
    51
  • Ограничение на постинг
    1000000.000

Об отправке почты

У нас нельзя отправлять почту просто функцией PHP mail, потому что спамеры, регулярно взламывающие незащищенные Joomla и Wordpress сайты используют домены клиентов для своих рассылок и затем уже почта добросовестных клиентов совершенно не доходит получателям.

Рекомендуем следующие скрипты для отправки почты:

Библиотека smtp-func.php

<?php

function smtpmail($mail_to, $subject, $message, $headers='') {

        //Настройки почты
        $config['smtp_username'] = 'test@cishost.ru';  //Смените на имя своего почтового ящика из ISPManager.
        $config['smtp_password'] = 'Пароль от почтового ящика из панели ISPManager';  //Измените пароль.
        $config['smtp_from']     = 'Test Mailbox'; //Ваше имя - или имя Вашего сайта. Будет показывать при прочтении в поле "От кого".
        //Обычно эти настройки менять не стоит
        $config['smtp_host']     = 'localhost';  //Сервер для отправки почты (для наших клиентов менять не требуется).
        $config['smtp_port']     = '25'; // Порт работы. Не меняйте, если не уверены.
        $config['smtp_debug']    = false;  //Если Вы хотите видеть сообщения ошибок, укажите true вместо false.
        $config['smtp_charset']  = 'UTF-8';   //Кодировка сообщений.

        $SEND =   "Date: ".date("D, d M Y H:i:s") . " +0300\r\n";
        $SEND .=   'Subject: =?'.$config['smtp_charset'].'?B?'.base64_encode($subject)."=?=\r\n";
        if ($headers) $SEND .= $headers."\r\n\r\n";
        else
        {
                $SEND .= "Reply-To: ".$config['smtp_username']."\r\n";
                $SEND .= "MIME-Version: 1.0\r\n";
                $SEND .= "Content-Type: text/plain; charset=\"".$config['smtp_charset']."\"\r\n";
                $SEND .= "Content-Transfer-Encoding: 8bit\r\n";
                $SEND .= "From: \"".$config['smtp_from']."\" <".$config['smtp_username'].">\r\n";
                $SEND .= "To: $mail_to <$mail_to>\r\n";
                $SEND .= "X-Priority: 3\r\n\r\n";
        }
        $SEND .=  $message."\r\n";
         if( !$socket = fsockopen($config['smtp_host'], $config['smtp_port'], $errno, $errstr, 30) ) {
            if ($config['smtp_debug']) echo $errno."<br>".$errstr;
            return false;
         }

            if (!server_parse($socket, "220", __LINE__)) return false;

            fputs($socket, "EHLO " . $config['smtp_host'] . "\r\n");
            if (!server_parse($socket, "250", __LINE__)) {
               if ($config['smtp_debug']) echo '<p>Не могу отправить EHLO!</p>';
               fclose($socket);
               return false;
            }
            fputs($socket, "AUTH LOGIN\r\n");
            if (!server_parse($socket, "334", __LINE__)) {
               if ($config['smtp_debug']) echo '<p>Не могу найти ответ на запрос авторизации!</p>';
               fclose($socket);
               return false;
            }
            fputs($socket, base64_encode($config['smtp_username']) . "\r\n");
            if (!server_parse($socket, "334", __LINE__)) {
               if ($config['smtp_debug']) echo '<p>Логин авторизации не был принят сервером!</p>';
               fclose($socket);
               return false;
            }
            fputs($socket, base64_encode($config['smtp_password']) . "\r\n");
            if (!server_parse($socket, "235", __LINE__)) {
               if ($config['smtp_debug']) echo '<p>Пароль не был принят сервером как верный! Ошибка авторизации!</p>';
               fclose($socket);
               return false;
            }
            fputs($socket, "MAIL FROM: <".$config['smtp_username'].">\r\n");
            if (!server_parse($socket, "250", __LINE__)) {
               if ($config['smtp_debug']) echo '<p>Не могу отправить команду MAIL FROM:</p>';
               fclose($socket);
               return false;
            }
            fputs($socket, "RCPT TO: <" . $mail_to . ">\r\n");

            if (!server_parse($socket, "250", __LINE__)) {
               if ($config['smtp_debug']) echo '<p>Не могу отправить команду RCPT TO:</p>';
               fclose($socket);
               return false;
            }
            fputs($socket, "DATA\r\n");

            if (!server_parse($socket, "354", __LINE__)) {
               if ($config['smtp_debug']) echo '<p>Не могу отправить команду DATA!</p>';
               fclose($socket);
               return false;
            }
            fputs($socket, $SEND."\r\n.\r\n");

            if (!server_parse($socket, "250", __LINE__)) {
               if ($config['smtp_debug']) echo '<p>Не могу отправить тело письма. Письмо не было отправлено!</p>';
               fclose($socket);
               return false;
            }
            fputs($socket, "QUIT\r\n");
            fclose($socket);
            return TRUE;
}
function server_parse($socket, $response, $line = __LINE__) {
        global $config;
        $server_response="";
    while (substr($server_response, 3, 1) != ' ') {
        if (!($server_response = fgets($socket, 256))) {
                   if ($config['smtp_debug']) echo "<p>Проблемы с отправкой почты!</p>$response
$line
";
                   return false;
                }
    }
    if (!(substr($server_response, 0, 3) == $response)) {
           if ($config['smtp_debug']) echo "<p>Проблемы с отправкой почты!</p>$response
$line
";
           return false;
        }
    return true;
}

//Отправить почту сразу нескольким получателям, ящики получателей пишем через запятую.

function smtpmassmail($mail_to, $subject, $message, $headers='')
{
$mailaddresses=explode(",",$mail_to);
foreach ($mailaddresses as $mailaddress) smtpmail($mailaddress,$subject,$message,$headers);
}

?>


и сам файл отправки mailer.php

<?php
//Замените настройки на нужные.
$mail_to = 'mail@cishost.ru'; //Вам потребуется указать здесь Ваш настоящий почтовый ящик, куда должно будет прийти письмо.
$type = 'plain'; //Можно поменять на html; plain означает: будет присылаться чистый текст.
$charset = 'UTF-8';

include('smtp-func.php');
if ($_REQUEST['message'])
{
   $name = $_REQUEST['name'];
   $phone = $_REQUEST['phone'];
   $message = $_REQUEST['message'];
   $replyto = 'no_reply@yandex.ru';
   $headers = "To: \"Administrator\" <$mail_to>\r\n".
              "From: \"$replyto\" <$mail_from>\r\n".
              "Reply-To: $replyto\r\n".
              "Content-Type: text/$type; charset=\"$charset\"\r\n";
   $sended = smtpmail($mail_to, $name, $message, $headers);
   
   echo '<html>
        <head>
        <meta http-equiv="content-type" content="text/html; charset='.$charset.'">
        </head>
              <body>';
   if (!$sended) echo 'Письмо не удалось отправить. Пожалуйста свяжитесь с администратором сайта по адресу: '.$mail_to;
   else echo 'Письмо было успешно отправлено.';
   echo '</body>';
   exit;
}
?>
Читать дальше

Еще раз о Malware

Еще раз о Malware.

Жалобы за несколько дней

В последнее время участились вопросы пользователей хостинга об установке прав 555(чтение и исполнение) на их папку www.

Отчего же это происходит?
Дело в том, что на серверах хостинга установлен защитный скрипт, который работает так:
Если обнаружено множественного подключение к внешним SMTP серверам на порт 25/tcp от имени пользователя, то:
1. Запускается антивирусный сканер Clamav/Maldet для поиска вирусов в папке пользователя.
2. Устанавливаются права 555 для того, чтобы предотвратить последующее заражение через различные уязвимости сайтов, в частности старых версий Joomla, Wordpress, DLE и тому подобных.

Другие хостинг провайдеры просто блокируют сайт пользователя при получении уведомления о рассылаемом спаме, мы же стараемся, чтобы сайты клиентов продолжали работать бесперебойно, несмотря на их заражение. Дело в том, что при правильно настроенной CMS вполне достаточно прав 555 (чтение и исполнение) для её работы.

Каким же образом отправлять письма?

Вы можете пользоваться нашими серверами для отправки до 50 писем в час(используя явную авторизацию на сервере) или другими почтовыми службами, подключаясь к ним на защищенные порты(любой кроме 25/tcp). Google, например, использует порт 465(требуется SSL) и порт 587(требуется TLS). Здесь нет никаких ограничений.

Зачем мы вообще пользуемся антивирусами?
Если ими не пользоваться, то сайты уязвимых CMS наполняются вирусами, которые рассылают спам, собирают пароли, работают в ботнетах.

Например, на одном из сайтов было недавно обнаружено 179 различных вредоносных скриптов(сайт не обновлялся с 2011 года, Joomla 1.5). Подобные сайты часто вызывают до 1000 одновременных подключений на внешние серверы для прямой доставки спама.

Помимо дополнительной нагрузки на серверы, наши диапазоны IP попадют в черные списки, что ведет к запрету на отправку писем обычными пользователями, блокировке в поисковых системах и другим подобным вещам. Мы стараемся максимально быстро вытаскивать IP из черных списков. И на данный момент ни один из наших адресов в них не находится.

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

Базы данных InnoDB vs MyISAM

Наш опыт подсказывает, что лучше использовать таблицы InnoDB. Таблицы MyISAM часто блокируются при нагруженном одновременном чтении и записи. Ну если на сайт Joomla одновременно зашли примерно 1000 пользователей, то ситуация выглядит так:

Вывод mytop:

Id      User    Host    db      Command Time    State   Info    Progress
108751  user_main  localhost       user_j15   Query   146980  closing tables  SELECT * FROM jos_session WHERE session_id = 'dfeodu7tv41tbgg4pts44s2kk6'       0.000
108753  user_main  localhost       user_j15   Query   146980  updating        DELETE FROM jos_session WHERE ( time < '1405526121' )   0.000
108774  user_main  localhost       user_j15   Query   146978  Waiting for table level lock    SELECT * FROM jos_session WHERE session_id = 'g2j9kt3stbtkg75tct5r2dvkb6'       0.000
108829  user_main  localhost       user_j15   Query   146977  Waiting for table level lock    SELECT * FROM jos_session WHERE session_id = 'et6833daba2v5t6hptk4e72jr4'       0.000
108834  user_main  localhost       user_j15   Query   146976  Waiting for table level lock    SELECT * FROM jos_session WHERE session_id = 'r35kp3balnt1kt9qnrdclf1k30'       0.000
108930  user_main  localhost       user_j15   Query   146975  Waiting for table level lock    SELECT * FROM jos_session WHERE session_id = '8fssht7k44uiq5kdellgtfe6o7'       0.000
108936  user_main  localhost       user_j15   Query   146969  Waiting for table level lock    SELECT * FROM jos_session WHERE session_id = 'qfvubpisihl1p10k3gkd6tg1v4'       0.000
109030  user_main  localhost       user_j15   Query   146964  Waiting for table level lock    SELECT * FROM jos_session WHERE session_id = '250oati4c74eac3fth5lcpf696'       0.000
109038  user_main  localhost       user_j15   Query   146964  Waiting for table level lock    SELECT * FROM jos_session WHERE session_id = 'f910sn4upaijefoehb546b66h7'       0.000
109121  user_main  localhost       user_j15   Query   146959  Waiting for table level lock    SELECT * FROM jos_session WHERE session_id = 'mo6c9pg63l7m693bpeomas7j60'       0.000

Была попытка одновременного удаления строк из таблицы с сессиями и чтения записей. Такое происходит нечасто, но бывает.
Можно обратить внимание, что запросы исполняются уже 146980 секунд, что препятствует нормальной работе сайта. Если бы таблица jos_session была не MyISAM, а InnoDB, такого бы не произошло. Сменить тип таблиц Вы можете сделав экспорт дампа базы и произвести замену с помощью Notepad++, либо обратившись в нашу техническую поддержку — мы конвертируем таблицу MyISAM в InnoDB самостоятельно, после чего сайт заработает без проблем.

Взлом сайтов на CMS


Взломы web-сайтов на популярных CMS, таких как Joomla, Wordpress, 1C-Bitrix, происходят постоянно. В этой статье мы хотим рассказать как и для чего это делается, и какие меры можно предпринять для защиты.
Читать дальше

Первые вопросы о конструкторе сайтов


1 июля был официально анонсирован конструктор сайтов, в связи с чем за сутки накопились некоторые вопросы к нашим консультантам.
Многие вопросы задавались несколько раз и ответ будет подробно афиширован в этой статье.
Читать дальше

Как создать резервную копию / перенести сайт из конструктора на другое доменное имя

1) Переходим в конструктор сайта 1:
В панели управления ISPmanager в разделе www-домены выбираем строку с нужным сайтом и нажимаем кнопку «Конструктор», входим в конструктор

Читать дальше