Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Письма приходят с задержкой или не доходят

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
savchenkoarts
Отправлено: 24 Августа, 2014 - 18:32:35
Post Id


Новичок


Покинул форум
Сообщений всего: 13
Дата рег-ции: Авг. 2014  


Помог: 0 раз(а)




Письма приходят с задержкой или не доходят. Задания Cron на этот файл, поставил на 5 минут. Что может быть? Cron работает, присылает сообщение:

Cron <eurozoo@multidomain4> php -f /home/eurozoo/public_html/system /crontab/cms/mailq.php (Cron <@ eurozoo multidomain4> PHP е /home/eurozoo/public_html/system/crontab/cms/mailq.php)

[Я] Первая Mailq. Найдено 0 новых сообщений.

CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. <?php
  3. /**
  4.  * Рассылка писем, стоящих в очереди
  5.  * @package Pilot
  6.  * @subpackage CMS
  7.  * @cron ~/5 * * * *
  8.  */
  9.  
  10. /**
  11.  * Определяем интерфейс
  12.  * @ignore
  13.  */
  14. define('CMS_INTERFACE', 'ADMIN');
  15.  
  16. // Устанавливаем правильную рабочую директорию
  17. chdir(dirname(__FILE__));
  18.  
  19. /**
  20. * Конфигурационный файл
  21. */
  22. require_once('../../config.inc.php');
  23.  
  24. $DB = DB::factory('default');
  25.  
  26. // Блокировка паралельного запуска скрипта    
  27. Shell::collision_catcher();
  28.  
  29. $message = $DB->fetch_column("
  30.         SELECT id, recipient
  31.         FROM cms_mail_queue
  32.         WHERE delivery = 'wait' AND DATE(create_dtime) = current_date()
  33.         ORDER BY id DESC
  34. ", 'id', 'recipient');
  35.  
  36.  
  37. $counter = 0;
  38. echo "[i] Start Mailq. ".count($message)." new messages found. \n";
  39.  
  40. reset($message);
  41. while(list($message_id, $recipient) = each($message)){
  42.        
  43.         $result = @Sendmail::delivery($message_id);
  44.        
  45.         $counter++;
  46.        
  47.         if(empty($result)){
  48.                 echo iconv(CMS_CHARSET, CMS_SHELL_CHARSET.'//IGNORE', "[i] $counter\t Message (ID:$message_id) to $recipient : failed!!! \n");
  49.         } else {
  50.                 echo iconv(CMS_CHARSET, CMS_SHELL_CHARSET.'//IGNORE', "[i] $counter\t Message (ID:$message_id) to $result[recipient] : $result[delivery] ($result[status_message])\n");
  51.         }
  52. }
  53.  
  54.  
  55. ?>
  56.  
 
 Top
OrmaJever
Отправлено: 24 Августа, 2014 - 18:36:58
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




Это скорее всего проблемы почтового сервера, а не php. php просто отдаёт на отправку письма, а когда оно отправиться и отправиться ли вообще этого он не знает и не контролирует


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
savchenkoarts
Отправлено: 24 Августа, 2014 - 18:39:40
Post Id


Новичок


Покинул форум
Сообщений всего: 13
Дата рег-ции: Авг. 2014  


Помог: 0 раз(а)




Когда пользуюсь почтой сервера, через cPanel, все работает, а через сайт не хочет
 
 Top
OrmaJever
Отправлено: 24 Августа, 2014 - 19:04:59
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




окей, как тогда отправляються письма? что находиться в методе Sendmail::delivery($message_id); ?


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
savchenkoarts
Отправлено: 24 Августа, 2014 - 19:21:39
Post Id


Новичок


Покинул форум
Сообщений всего: 13
Дата рег-ции: Авг. 2014  


Помог: 0 раз(а)




Я новичок в php, лучшее скажите куда посмотреть и что сделать, я сделаю.
(Добавление)
OrmaJever пишет:
что находиться в методе Sendmail::delivery($message_id); ?

На сколько я понял описание и номер заказа, это интернет магазин.

OrmaJever пишет:
как тогда отправляються письма?

Отправляются с корзины.

Если нужно еще какие-то кодировки по сайту найти, говорите, я найду и выложу.

(Отредактировано автором: 24 Августа, 2014 - 19:46:43)

 
 Top
savchenkoarts
Отправлено: 25 Августа, 2014 - 18:22:42
Post Id


Новичок


Покинул форум
Сообщений всего: 13
Дата рег-ции: Авг. 2014  


Помог: 0 раз(а)




ап
 
 Top
dmaw
Отправлено: 25 Августа, 2014 - 22:22:59
Post Id



Частый гость


Покинул форум
Сообщений всего: 227
Дата рег-ции: Сент. 2009  
Откуда: Беларусь, Витебск


Помог: 0 раз(а)




У меня были похожие проблемы:
Исходящие письма с сайта site.by должны быть с емайлом, где после собаки имя site.by, если имя другое, то почтовый сервер куда Вы отправили письмо может не принять такое отправление, воспринять как спам и удалить. Не знаю как у вас, проверьте от какого имени Вы отправляете письма.
 
 Top
Viper
Отправлено: 25 Августа, 2014 - 22:27:22
Post Id



Активный участник


Покинул форум
Сообщений всего: 4555
Дата рег-ции: Февр. 2007  
Откуда: Симферополь


Помог: 98 раз(а)




savchenkoarts что апать? Вам же сказали - без дебага не смогут помочь. Конкретно нужно увидеть код Sendmail::delivery.

savchenkoarts пишет:
Отправляются с корзины.
вы в этом уверены? Я точно уверен что нет.


-----
Список фильмов с описанием, блекджеком и... для Joomla? -> https://киноархив[dot]com
Демо нового движка для сайта php.su -> php[dot]su, проект на гитхабе
 
 Top
savchenkoarts
Отправлено: 25 Августа, 2014 - 22:53:50
Post Id


Новичок


Покинул форум
Сообщений всего: 13
Дата рег-ции: Авг. 2014  


Помог: 0 раз(а)




Через Notepad++ "Sendmail::delivery" я только нашел в этом коде.
Нашел еще файлы с кодом, может помогут. Я просто не знаю где найти код "Sendmail::delivery". Извините. Спасибо.

pop3.class.php
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. <?php
  3. /**
  4.  * Класс по работе с POP3 сервером
  5.  * @package Pilot
  6.  * @subpackage CMS
  7.  */
  8.  
  9. /**
  10.  * Класс по работе с POP3 сервером
  11.  * @package Maillist
  12.  * @subpackage Libraries
  13.  */
  14. class POP3 {
  15.        
  16.         /**
  17.         * Ресурс соединения
  18.         * @var resource
  19.         */
  20.         private $connection;
  21.        
  22.         /**
  23.         * Индекс сообщений
  24.         * @var array
  25.         */
  26.         public $stat = array();
  27.        
  28.         /**
  29.          * Формат перевода строки, для M$ Exchange используется \r\n
  30.          *
  31.          * @var string
  32.          */
  33.         private $newline = "\n";
  34.                
  35.         /**
  36.         * Конструктор класса
  37.         * @param string $host
  38.         * @param int $port
  39.         * @return object
  40.         */
  41.         public function __construct($host, $port, $user, $pass) {
  42.                 $this->connection = fsockopen($host, $port, $errno, $errstr, 30);
  43.                 if(!$this->connection) {
  44.                         trigger_error(cms_message('CMS', 'Невозможно установить соединение с POP3 сервером %s (%d)', $errstr, $errno), E_USER_ERROR);
  45.                 }
  46.                 $greeting = fgets($this->connection, 128);
  47.                 $this->newline = (stristr($greeting, "microsoft")) ? "\r\n" : "\n";
  48.                 fputs($this->connection, "user $user".$this->newline);
  49.                 fgets($this->connection, 128);
  50.                 fputs($this->connection, "pass $pass".$this->newline);
  51.                 $pass_check = fgets($this->connection, 128);
  52.                
  53.                 /**
  54.                  * Если попыька входа не удалась - выводим ошибку
  55.                  */
  56.                 if (!preg_match('/^\+OK/i', $pass_check)) {
  57.                         trigger_error(cms_message('CMS', 'Невозможно установить соединение с POP3 сервером %s (%d)', $pass_check, 0), E_USER_ERROR);
  58.                 }
  59.                
  60.                 /**
  61.                 * Определяем количество и размер писем
  62.                 */
  63.                 fputs($this->connection, "list".$this->newline);
  64.                 $stat = '';
  65.                 while (trim($stat) != ".") {
  66.                         $stat = fgets($this->connection, 128);
  67.                         if (preg_match("/^([0-9]+) ([0-9]+)/", $stat, $matches)) {
  68.                                 $this->stat[$matches[1]] = $matches[2];
  69.                         }
  70.                 }
  71.         }
  72.        
  73.         /**
  74.         * Читает сообщение
  75.         * @param int $id
  76.         * @return mixed
  77.         */
  78.         public function retr($id) {
  79.                 if (!isset($this->stat[$id])) {
  80.                         return false;
  81.                 }
  82.                
  83.                 fputs($this->connection, "retr $id".$this->newline);
  84.                
  85.                 return $this->read();
  86.         }
  87.        
  88.         /**
  89.         * Читает заголовок + верхние n строк сообщения
  90.         * @param int $id
  91.         * @param int $lines
  92.         * @return mixed
  93.         */
  94.         public function top($id, $lines) {
  95.                 if (!isset($this->stat[$id])) {
  96.                         return false;
  97.                 }
  98.                 fputs($this->connection, "top $id $lines".$this->newline);
  99.                
  100.                 return $this->read();
  101.         }
  102.        
  103.         /**
  104.         * Читает тело сообщения
  105.         * @param void
  106.         * @return string
  107.         */
  108.         private function read() {
  109.                 do {
  110.                         $message[] = $line = fgets($this->connection);
  111. //                      echo "READLINE: $line\n";
  112.                 } while ((trim($line) != '.'));
  113.                
  114.                 array_shift($message);
  115.                 array_pop($message);
  116.                
  117.                 return implode("", $message);
  118.         }
  119.        
  120.        
  121.         /**
  122.         * Удаляет сообщение
  123.         * @param int $id
  124.         * @return string
  125.         */
  126.         public function dele($id) {
  127.                 if (!isset($this->stat[$id])) {
  128.                         return false;
  129.                 }
  130.                 unset($this->stat[$id]);
  131.                 fputs($this->connection, "dele $id".$this->newline);
  132.                 return fgets($this->connection, 128);
  133.         }              
  134.        
  135.         /**
  136.         * Деструктор класса
  137.         * @param void
  138.         * @return void
  139.         */
  140.         public function __destruct() {
  141.                 fputs($this->connection, "quit".$this->newline);
  142.                 fclose($this->connection);
  143.         }
  144.        
  145. }
  146. ?>
  147.  


smtp.class.php
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. <?php
  3. /**
  4. * Отправка сообщений по протоколу SMTP
  5. * @package Pilot
  6. * @subpackage CMS
  7. * @version 1.0
  8. */
  9.  
  10.  
  11. /**
  12. * Определение конца строки
  13. */
  14. define('CRLF', "\r\n");
  15.  
  16. /**
  17. * Отправка сообщений по протоколу SMTP
  18. * @package Maillist
  19. * @subpackage CMS
  20. */
  21. class SMTP {
  22.        
  23.         /**
  24.         * Соединение с сервером
  25.         * @var resource
  26.         */
  27.         private $connection;
  28.        
  29.         /**
  30.          * Включение режима отладки для класса
  31.          * @var bool
  32.          */
  33.         public $debug = false;
  34.        
  35.         /**
  36.         * Таймаут соединения
  37.         * @var int
  38.         */
  39.         private $timeout = 5;
  40.        
  41.         /**
  42.         * Код последнего ответа сервера
  43.         * @var string
  44.         */
  45.         private $last_code;
  46.        
  47.         /**
  48.         * Текст сообщения последнего ответа сервера
  49.         * @var string
  50.         */
  51.         private $last_message;
  52.        
  53.         /**
  54.         * Последний ответ сервера
  55.         * @var string
  56.         */
  57.         private $last_response;
  58.        
  59.         /**
  60.         * Строка приветствия для SMTP
  61.         * @var string
  62.         */
  63.         private $helo = '';
  64.        
  65.         /**
  66.         * Конструктор
  67.         * @param string $host
  68.         * @param int $port
  69.         * @param string $login
  70.         * @param string $passwd
  71.         * @param string $auth_type (plain, login, none)
  72.         * @return object
  73.         */
  74.         public function __construct($host, $port, $login, $passwd, $auth_type) {
  75.                
  76.                 $this->helo = CMS_HOST;
  77.                
  78.                 $this->connection = fsockopen($host, $port, $this->error_num, $this->error_str, $this->timeout);
  79.                
  80.                 /**
  81.                 * Чтобы вытащить из буфера начальное приглашение сервера
  82.                 */
  83.                 $this->readResponse();
  84.                
  85.                 //return $this->need_auth ?  $this->ehlo() : $this->helo();
  86.                
  87.                 if (!$this->ehlo()) {
  88.                         trigger_error(cms_message('Maillist', 'Не удаётся послать приветствие почтовому серверу.'), E_USER_ERROR);
  89.                 }
  90.                
  91. //              if (preg_match('~^tls://~', $host)) {
  92. //                      $this->sendData("STARTTLS");
  93. //              }
  94.                
  95.                 switch (strtolower($auth_type)) {
  96.                         case 'plain':
  97.                                 $auth_result = $this->authPlain($login, $passwd);
  98.                                 break;
  99.                         case 'login':
  100.                                 $auth_result = $this->authLogin($login, $passwd);
  101.                                 break;
  102.                         case 'none':
  103.                                 $auth_result = true;
  104.                                 break;
  105.                         case '': // так как указание none в ini файле без кавычек равнозначно пустому значению
  106.                                 $auth_result = true;
  107.                                 break;
  108.                         default:
  109.                                 trigger_error(cms_message('CMS', 'Неподдерживаемый тип SMTP авторизации: %s', $auth_type), E_USER_ERROR);
  110.                 }
  111.                
  112.                 if (!$auth_result) {
  113.                         trigger_error(cms_message('CMS', 'Ошибка SMTP авторизации'), E_USER_ERROR);
  114.                 }
  115.         }
  116.  
  117.         /**
  118.         * Login авторизация
  119.         * @param $login string
  120.         * @param $passwd string
  121.         * @return boolean
  122.         */
  123.         private function authLogin($login, $passwd) {
  124.                 $this->sendData("AUTH LOGIN");
  125.                 if ($this->checkError('334')) {
  126.                         return false;
  127.                 }
  128.                
  129.                 $this->sendData(base64_encode($login));
  130.                 if ($this->checkError('334')) {
  131.                         return false;
  132.                 }
  133.                
  134.                 $this->sendData(base64_encode($passwd));
  135.                 if($this->checkError('235')) {
  136.                         return false;
  137.                 }
  138.                 return true;
  139.         }
  140.        
  141.         /**
  142.         * Простейшая Plain Text авторизация
  143.         * @param $login string
  144.         * @param $passwd string
  145.         * @return boolean
  146.         */
  147.         private function authPlain($login, $passwd) {
  148.                 $this->sendData("AUTH PLAIN");
  149.                 if ($this->checkError('334')) {
  150.                         return false;
  151.                 }
  152.                 $this->sendData(base64_encode(chr(0) . $login . chr(0) . $passwd));
  153.                 if($this->checkError('235')) {
  154.                         return false;
  155.                 }
  156.                 return true;
  157.         }
  158.        
  159.        
  160.         /**
  161.         * Посылает почтовое сообщение
  162.         * @param string $from Адрес отправителя
  163.         * @param string $to Адрес получателя
  164.         * @param array $headers MIME-заголовки
  165.         * @param string $body Тело сообщения
  166.         * @return bool
  167.         */
  168.         public function send($from, $to, $headers, $body) {
  169.                 if (!is_resource($this->connection)) {
  170.                         return false;
  171.                 }
  172.                
  173.                 if (strpos($from, '<') !== false) {
  174.                         $from = substr($from, strpos($from, '<') + 1);
  175.                         $from = substr($from, 0, strpos($from, '>'));
  176.                 }
  177.                 if (strpos($to, '<') !== false) {
  178.                         $to = substr($to, strpos($to, '<') + 1);
  179.                         $to = substr($to, 0, strpos($to, '>'));
  180.                 }
  181.                
  182.                 // Устанавливаем заголовки для прохождения через SPAM фильтры
  183.                 if (!isset($headers['From'])) {
  184.                         $headers['From'] = $from;
  185.                 }
  186.                 if (!isset($headers['Reply-To'])) {
  187.                         $headers['Reply-To'] = $from;
  188.                 }
  189.                 if (!isset($headers['User-Agent'])) {
  190.                         $headers['User-Agent'] = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.5b) Gecko/20030827';
  191.                 }
  192.                 if (!isset($headers['Content-Type'])) {
  193.                         $headers['Content-Type'] = 'text/plain; charset="Windows-1251"';
  194.                 }
  195.                 if (!isset($headers['Content-Transfer-Encoding'])) {
  196.                         $headers['Content-Transfer-Encoding'] = '8bit';
  197.                 }
  198.                 if (!isset($headers['MIME-Version'])) {
  199.                         $headers['MIME-Version'] = '1.0';
  200.                 }
  201.                 if (!isset($headers['Date'])) {
  202.                         $headers['Date'] = date('r');
  203.                 }
  204.                 if (!isset($headers['In-Reply-To'])) {
  205.                         $host = isset($_SERVER['HOSTNAME']) ? $_SERVER['HOSTNAME'] : CMS_HOST;
  206.                         $headers['In-Reply-To'] = '<'.Misc::randomKey(20).'.'.time().'.mail@'.$host.'>';
  207.                 }
  208.                 if (!isset($headers['To'])) {
  209.                         $headers['To'] = $to;
  210.                 }
  211.                
  212.                 // Разбор заголовков
  213.                 $tmp_headers = '';
  214.                 reset($headers);
  215.                 while (list($key,$val) = each($headers)) {
  216.                         $tmp_headers .= $key.": ".$val.CRLF;
  217.                 }
  218.  
  219.                 $this->sendData("RSET");
  220.                 if($this->checkError('250')) {
  221.                         return false;
  222.                 }
  223.                 $this->sendData("MAIL FROM: <$from>");
  224.                 if($this->checkError('250')) {
  225.                         return false;
  226.                 }
  227.                 $this->sendData("RCPT TO: <$to>");
  228.                 if($this->checkError('250')) {
  229.                         return false;
  230.                 }
  231.                 $this->sendData("DATA");
  232.                 if($this->checkError('354')) {
  233.                         return false;
  234.                 }
  235.                
  236.                 $this->sendData($tmp_headers.CRLF.$body.CRLF.".");
  237.                
  238.                 if ($this->last_code == '250') {
  239.                         return true;
  240.                 } else {
  241.                         return false;
  242.                 }
  243.         }
  244.        
  245.         /**
  246.         * SMTP-Приветствие БЕЗ авторизации
  247.         * @param void
  248.         * @return boolean
  249.         */
  250.         private function helo() {
  251.                 if ($this->sendData("HELO ".$this->helo) && $this->last_code == '250') {
  252.                         return true;
  253.                 }
  254.                 return false;
  255.         }
  256.        
  257.         /**
  258.         * SMTP-Приветствие с авторизацией
  259.         * @param void
  260.         * @return boolean
  261.         */
  262.         private function ehlo() {
  263.                 if ($this->sendData("EHLO ".$this->helo) && $this->last_code == '250') {
  264.                         return true;
  265.                 }
  266.                 return false;
  267.         }
  268.        
  269.         /**
  270.         * Возвращает true, если последняя операция завершилась НЕ с кодом $code
  271.         * @param $code string
  272.         * @return boolean
  273.         */
  274.         private function checkError($code) {
  275.                 if ($this->last_code == $code) {
  276.                         return false;
  277.                 } else {
  278.                         return true;
  279.                 }
  280.         }
  281.        
  282.         /**
  283.         * Чтение ответа сервера
  284.         * @return mixed
  285.         */
  286.         private function readResponse() {
  287.                 $return = '';
  288.                 $line   = '';
  289.                 $loops  = 0;
  290.  
  291.                 if(is_resource($this->connection)){
  292.                         while((strpos($return, CRLF) === FALSE || substr($line,3,1) !== ' ') && $loops < 100){
  293.                                 $line = fgets($this->connection, 512);
  294.                                 $return .= $line;
  295.                                 $loops++;
  296.                         }
  297.                         if ($this->debug) {
  298.                                 echo "<< $return\n";
  299.                         }
  300.                         $this->last_code = substr($return, 0, 3);
  301.                         $this->last_message = substr($return, 5);
  302.                         return $return;
  303.  
  304.                 } else {
  305.                         return false;
  306.                 }
  307.         }
  308.        
  309.         /**
  310.         * Посылает данные серверу
  311.         * @param string $string Строка, посылаемая серверу
  312.         * @param boolean $wait_response После отсылки строки прочитать ответ сервера
  313.         * @return boolean
  314.         */
  315.         private function sendData($string, $wait_response = true) {
  316.                 if (is_resource($this->connection)) {
  317.                         fwrite($this->connection, $string.CRLF, strlen($string)+2);
  318.                         if ($this->debug) {
  319.                                 if (strlen($string) > 100) {
  320.                                         echo ">> ".substr($string, 0 , 100)."...\n";
  321.                                 } else {
  322.                                         echo ">> $string\n";
  323.                                 }
  324.                         }
  325.                         if ($wait_response) {
  326.                                 $this->last_response = $this->readResponse();
  327.                         }
  328.                         return true;
  329.                 }
  330.                 return false;
  331.         }
  332.        
  333.         /**
  334.          * Возвращает последний ответ SMTP сервера
  335.          *
  336.          * @return string
  337.          */
  338.         public function getLastMessage() {
  339.                 return $this->last_response;
  340.         }
  341.        
  342.         /**
  343.         * Деструктор, завершение соединения
  344.         * @param void
  345.         * @return void
  346.         */
  347.         public function __destruct() {
  348.                 $this->sendData("QUIT");
  349.                 if (is_resource($this->connection)) {
  350.                         fclose($this->connection);
  351.                 }
  352.         }
  353. }
  354.  


control.php

PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. /**
  3. * Управление рассылкой по e-mail
  4. *
  5. * @package Pilot
  6. * @subpackage Maillist
  7. * @version 3.0
  8. * @cron ~/5 * * * *
  9. */
  10.  
  11. /**
  12.  * Определяем интерфейс
  13.  * @ignore
  14.  */
  15. define('CMS_INTERFACE', 'ADMIN');
  16.  
  17. // Устанавливаем правильную рабочую директорию
  18. chdir(dirname(__FILE__));
  19.  
  20. /**
  21. * Конфигурационный файл
  22. */
  23. require_once('../../config.inc.php');
  24.  
  25. $DB = DB::factory('default');
  26.  
  27. // Блокировка паралельного запуска скрипта
  28. Shell::collision_catcher();
  29.  
  30. /**
  31.  * Параметры авторизации, действительны для текущего письма
  32.  */
  33. $auth_email = '';
  34. $auth_passwd = '';
  35.  
  36. $query = "select * from cms_mail_account where id='".MAILLIST_CONTROL_MAIL_ID."'";
  37. $mailserver = $DB->query_row($query);
  38.  
  39. // Соединяемся с pop3 сервером, переход в состояние TRANSACTION
  40. $POP3 = new POP3($mailserver['pop3_host'], $mailserver['pop3_port'], $mailserver['pop3_login'], $mailserver['pop3_passwd']);
  41.  
  42. $message_count = count($POP3->stat);
  43.  
  44. echo '[i] '.$message_count." message(s) in mailbox\n";
  45.  
  46. reset($POP3->stat);
  47. while(list($message_id, $size) = each($POP3->stat)) {
  48.         echo "[i] Parsing message ".$message_id." of ".$message_count."\n";
  49.        
  50.         if ($size > MAILLIST_CONTROL_MAX_SIZE) {
  51.                 //$text = $POP3->top($message_id, 50);
  52.                 echo "[i] Message size is greater than ".MAILLIST_CONTROL_MAX_SIZE." byte - skipped\n";
  53.                 continue;
  54.         } else {
  55.                 $text = $POP3->retr($message_id);
  56.         }
  57.         $POP3->dele($message_id);
  58.        
  59.         $message = Mime::decode($text);
  60.        
  61.         /**
  62.          * Не удалось распознать формат сообщения
  63.          */
  64.         if (!is_array($message)) {
  65.                 echo "[e] Message format unrecognized - skipped\n";
  66.                 continue;
  67.         }
  68.        
  69.         /**
  70.          * Если в сообщении больше одной части, значит там есть вложения
  71.          * (файлы или другие сообщения)
  72.          */
  73.         if (count($message) != 1) {
  74.                 echo "[i] Message has embedded multipart content - skipped\n";
  75.                 continue;
  76.         }
  77.        
  78.         if (!isset($message[0]['body'])) {
  79.                 echo "[e] Message without body - skipped\n";
  80.                 continue;
  81.         }
  82.        
  83.         if (!isset($message[0]['headers']['from']) || !preg_match("/([a-z0-9_\.\-]+@[a-z0-9_\.\-]+\.[a-z]{2,4})/i", $message[0]['headers']['from'], $match)) {
  84.                 echo "[e] Message without from header - skipped\n";
  85.                 continue;
  86.         } else {
  87.                 $message_from = $match[1];
  88.         }
  89.        
  90.         $auth_email = '';
  91.         $auth_passwd = '';
  92.         $commands = preg_split("~[\n\r]+~", $message[0]['body'], -1, PREG_SPLIT_NO_EMPTY);
  93.        
  94.         $TmplReport = new TemplateDB('cms_mail_template', 'maillist', 'control_report');
  95.         reset($commands);
  96.         while (list(,$row)=each($commands)) {
  97.                 execute_command($row, $message_from);
  98.         }
  99.        
  100.         /**
  101.          * Отсылаем пользователю отчет о выполнении команд
  102.          */
  103.         $Sendmail = new Sendmail(MAILLIST_CONTROL_MAIL_ID, 'Отчет по выполнению Вашего запроса', nl2br($TmplReport->display()));
  104.        
  105.         $random_seed = Misc::randomKey(32);
  106.         file_put_contents("/tmp/$random_seed.eml", $text);
  107.         $Sendmail->attach("/tmp/$random_seed.eml", 'your-request.eml');
  108.         unlink("/tmp/$random_seed.eml");
  109.         $Sendmail->send($message_from, true);
  110.         echo "[i] Report sent to $message_from\n";
  111. }
  112. unset($POP3);
  113.  
  114.  
  115.  
  116.  
  117.  
  118. /**
  119.  * Функция выполняется для каждой строки входящего письма
  120.  * @param string $command
  121.  * @param string $message_from
  122.  */
  123. function execute_command($command, $message_from) {
  124.         global $DB, $auth_email, $auth_passwd;
  125.        
  126.         echo "[cmd] $command\n";
  127.        
  128.         $command = trim($command);
  129.        
  130.         if (strtolower($command) == 'help') {
  131.                 /**
  132.                  * Запрос списка команд, поддерживаемых системой
  133.                  */
  134.                 $Template = new TemplateDB('cms_mail_template', 'maillist', 'control_help');
  135.                 $Sendmail = new Sendmail(MAILLIST_CONTROL_MAIL_ID, 'Помощь по использованию рассылок на '.CMS_HOST, nl2br($Template->display()));
  136.                 $Sendmail->send($message_from, true);
  137.                 echo "[cmd] Help message sent to $message_from\n";
  138.                 iterate_report($command, 'OK');
  139.                
  140.         } elseif(strtolower($command) == 'remind_password') {
  141.                 /**
  142.                  * Напоминание пароля
  143.                  */
  144.                 $user = $DB->query_row("SELECT * FROM auth_user WHERE email = '$message_from'");
  145.                 if ($DB->rows == 1) {
  146.                        
  147.                         $Template = new TemplateDB('cms_mail_template', 'cms', 'amnesia');
  148.                         $Template->set($user);
  149.                         $Sendmail = new Sendmail(MAILLIST_CONTROL_MAIL_ID, 'Напоминание пароля на '.CMS_HOST, nl2br($Template->display()));
  150.                         $Sendmail->send($message_from, true);
  151.                         echo "[cmd] Reminder message sent to $message_from\n";
  152.                         iterate_report($command, 'OK');
  153.                 }
  154.                
  155.         } elseif(strtolower($command) == 'list') {
  156.                 /**
  157.                  * Список всех доступных рассылок
  158.                  */
  159.                 $query = "SELECT * FROM maillist_category WHERE private != 'true'";
  160.                 $lists = $DB->query($query);
  161.                
  162.                 $Template = new TemplateDB('cms_mail_template', 'maillist', 'control_list');
  163.                 reset($lists);
  164.                 while (list(,$row)=each($lists)) {
  165.                         $Template->iterate('/list/', null, $row);
  166.                 }
  167.                 $Sendmail = new Sendmail(MAILLIST_CONTROL_MAIL_ID, 'Список рассылок на '.CMS_HOST, nl2br($Template->display()));
  168.                 $Sendmail->send($message_from, true);
  169.                 iterate_report($command, 'OK');
  170.                
  171.         } elseif(strtolower($command) == 'subscribed_list') {
  172.                 /**
  173.                  * Получение списка рассылок, на которые подписан пользователь. Требует авторизации
  174.                  */
  175.                 if (!check_auth($error, $user)) {
  176.                         return iterate_report($command, "Ошибка авторизации: $error");
  177.                 }
  178.                
  179.                 $query = "
  180.                         SELECT tb_category.*
  181.                         FROM maillist_user_category AS tb_rel
  182.                         INNER JOIN maillist_category AS tb_category
  183.                                 ON tb_rel.category_id = tb_category.id
  184.                         WHERE tb_rel.user_id = '$user[id]'
  185.                 ";
  186.                 $lists = $DB->query($query);
  187.                
  188.                 $Template = new TemplateDB('cms_mail_template', 'maillist', 'control_subscribed_list');
  189.                 reset($lists);
  190.                 while (list(,$row)=each($lists)) {
  191.                         $Template->iterate('/list/', null, $row);
  192.                 }
  193.                 $Sendmail = new Sendmail(MAILLIST_CONTROL_MAIL_ID, 'Список рассылок на '.CMS_HOST.', на которые Вы подписаны', nl2br($Template->display()));
  194.                 $Sendmail->send($message_from, true);
  195.                 iterate_report($command, 'OK');
  196.                
  197.         } elseif (preg_match("~^pause\s+([0-9]+)$~i", $command, $match)) {
  198.                 /**
  199.                  * Добавление в стоп-лист на N дней. Требует авторизации
  200.                  */
  201.                 if (!check_auth($error, $user)) {
  202.                         return iterate_report($command, "Ошибка авторизации: $error");
  203.                 }
  204.                
  205.                 /**
  206.                  * Ставим в стоп-лист так, чтобы пользователь разблокировался через N дней
  207.                  */
  208.                 $query = "REPLACE INTO maillist_stoplist SET id = '$user[id]', `date` = NOW() + INTERVAL ".intval($match[1] * 86400 - MAILLIST_STOPLIST_DURATION)." SECOND";
  209.                 $DB->insert($query);
  210.                 iterate_report($command, "OK. Письма на Ваш адрес не будут приходить в течении $match[1] дней");
  211.                
  212.         } elseif (preg_match("~^subscribe\s+(.+)$~i", $command, $match)) {
  213.                 /**
  214.                  * Подписка на рассылку. Требует авторизации
  215.                  */
  216.                 if (!check_auth($error, $user)) {
  217.                         return iterate_report($command, "Ошибка авторизации: $error");
  218.                 }
  219.                
  220.                 $query = "SELECT * FROM maillist_category WHERE uniq_name = '".$DB->escape($match[1])."'";
  221.                 $list = $DB->query_row($query);
  222.                 if ($DB->rows == 0) {
  223.                         iterate_report($command, "Рассылка с кодом $match[1] не найдена");
  224.                 } else {
  225.                         $DB->insert("INSERT IGNORE INTO maillist_user_category SET user_id = '$user[id]', category_id = '$list[id]'");
  226.                         iterate_report($command, "OK. Вы подписаны на рассылку '$list[name_ru]'");
  227.                 }
  228.                
  229.         } elseif (preg_match("~^unsubscribe\s+(.+)$~i", $command, $match)) {
  230.                 /**
  231.                  * Отписаться от рассылки. Требует авторизации
  232.                  */
  233.                 if (!check_auth($error, $user)) {
  234.                         return iterate_report($command, "Ошибка авторизации: $error");
  235.                 }
  236.                
  237.                 $query = "SELECT * FROM maillist_category WHERE uniq_name = '".$DB->escape($match[1])."'";
  238.                 $list = $DB->query_row($query);
  239.                 if ($DB->rows == 0) {
  240.                         iterate_report($command, "Рассылка с кодом $match[1] не найдена");
  241.                 } else {
  242.                         $DB->insert("DELETE FROM maillist_user_category WHERE user_id = '$user[id]' AND category_id = '$list[id]'");
  243.                         iterate_report($command, "OK. Вы отписаны от рассылки '$list[name_ru]'");
  244.                 }
  245.                
  246.         } elseif (preg_match("/^email:\s+([a-z0-9\-\_\.]+@[a-z0-9\-\_\.]+\.[a-z]{1,4})$/i", $command, $match)) {
  247.                 /**
  248.                  * Пользователь указывает свой e-mail для подписки или отписки от рассылки
  249.                  */
  250.                 $auth_email = $match[1];
  251.                 iterate_report($command, 'OK');
  252.                
  253.         } elseif (preg_match("/^passwd:\s+([a-zA-Z0-9_+!@#$%^&*~\(\)\-]{1,20})$/i", $command, $match)) {
  254.                 /**
  255.                  * Пользователь указывает свой пароль для подписки или отписки от рассылки
  256.                  */
  257.                 $auth_passwd = $match[1];
  258.                 iterate_report($command, 'OK');
  259.                
  260.         } else {
  261.                 echo "[cmd] unknown command\n";
  262.                 iterate_report($command, 'Неизвестная команда или ошибка синтаксиса');
  263.         }
  264.        
  265. }
  266.  
  267. /**
  268.  * Отчет о выполнении команды
  269.  *
  270.  * @param string $command
  271.  * @param string $result
  272.  */
  273. function iterate_report($command, $result) {
  274.         global $TmplReport;
  275.        
  276.         if ($TmplReport instanceof Template) {
  277.                 $TmplReport->iterate('/command/', null, array('command' => $command, 'result' => $result));
  278.         }
  279. }
  280.  
  281. /**
  282.  * Проверка авторизации для команд, которые этого требуют
  283.  * @param string $error
  284.  * @return bool
  285.  */
  286. function check_auth(&$error, &$user) {
  287.         global $DB, $auth_email, $auth_passwd;
  288.        
  289.         if (empty($auth_email)) {
  290.                 $error = 'Не указан e-mail. Используйте команду email: your@mail.box или help для получения справки';
  291.                 return false;
  292.         } elseif (empty($auth_passwd)) {
  293.                 $error = 'Не указан пароль. Используйте команду passwd: ваш_пароль или help для получения справки';
  294.                 return false;
  295.         } else {
  296.                 $query = "SELECT id, passwd FROM auth_user WHERE email = '$auth_email'";
  297.                 $user = $DB->query_row($query);
  298.                 if ($DB->rows == 0) {
  299.                         $error = "Пользователь с адресом $auth_email не существует";
  300.                         return false;
  301.                 } elseif ($auth_passwd != $user['passwd']) {
  302.                         $error = "Неправильно указан пароль";
  303.                         return false;
  304.                 }
  305.         }
  306.        
  307.         return true;
  308. }
  309.  
  310. ?>


maillist.php
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2.  
  3. /**
  4.  * Рассылка почты
  5.  *
  6.  * @package Pilot
  7.  * @subpackage Maillist
  8.  * @version 4.0
  9.  *
  10.  * @cron ~/15 * * * *
  11.  */
  12.  
  13. define('CMS_INTERFACE', 'ADMIN');
  14. chdir(dirname(__FILE__));
  15.  
  16. require_once('../../config.inc.php');
  17. $DB = DB::factory('default');
  18. ini_set('memory_limit', '512M');
  19.  
  20. // Блокировка паралельного запуска скрипта
  21. Shell::collision_catcher();
  22.  
  23.  
  24. /**
  25.  * Ставим в очередь письма, которые выполняются по расписанию
  26.  */
  27. $task = $DB->query("
  28.         select id, message_id, `repeat` from maillist_task
  29.         where _next < now() and (date_to > current_date() or date_to is null)
  30. ");
  31.  
  32. reset($task);
  33. while (list(,$row) = each($task)) {
  34.         $amount = Maillist::queue($row['message_id'], false);
  35.        
  36.         /**
  37.          * Сохраняем информацию в логе
  38.          */
  39.         $DB->insert("insert into maillist_task_log (task_id, amount) values ('$row[id]', '$amount')");
  40.        
  41.         /**
  42.          * Определяем следующую дату выполнения задачи
  43.          */
  44.         $next = "NULL";
  45.         if ($row['repeat'] == 'hourly') {
  46.                 $next = "_next + INTERVAL 1 HOUR";
  47.         } elseif ($row['repeat'] == 'daily') {
  48.                 $next = "_next + INTERVAL 1 DAY";
  49.         } elseif ($row['repeat'] == 'weekly') {
  50.                 $next = "_next + INTERVAL 1 WEEK";
  51.         } elseif ($row['repeat'] == 'monthly') {
  52.                 $next = "_next + INTERVAL 1 MONTH";
  53.         } elseif ($row['repeat'] == 'yearly') {
  54.                 $next = "_next + INTERVAL 1 YEAR";
  55.         }
  56.        
  57.         $DB->update("update maillist_task set _next=$next where id='$row[id]'");
  58. }
  59.  
  60.  
  61. if (rand(0,100) > 95) {
  62.         $DB->delete("delete from maillist_task_log where tstamp < now() - interval 1 month");
  63. }
  64.  
  65.  
  66. $mailserver = $DB->query_row("select * from cms_mail_account where id='".MAILLIST_MAIL_ID."'");
  67. $stoplist = $DB->result("select sender_email from cms_mail_account where id='".MAILLIST_STOPLIST_MAIL_ID."'");
  68.  
  69. $SMTP = new SMTP($mailserver['smtp_host'], $mailserver['smtp_port'], $mailserver['smtp_login'], $mailserver['smtp_password'], $mailserver['smtp_auth']);
  70.  
  71. echo "[i] Starting ".date('Y-m-d H:i:s')."\n";
  72. $messages = $DB->query("SELECT message_id FROM maillist_queue WHERE delivery='wait'", 'message_id');
  73.  
  74. reset($messages);
  75. while(list($message_id, ) = each($messages)) {
  76.        
  77.         if (CVS::isLocked('maillist_message', $message_id)) {
  78.                 echo "[e] Message #$message_id locked by another user.\n";
  79.                 continue;
  80.         }
  81.        
  82.         $Maillist = new Maillist($message_id);
  83.         if (strlen($Maillist->content) < 100) {
  84.                 echo "[e] Please create message\n";
  85.                 continue;
  86.         }
  87.        
  88.         /**
  89.          * Обрамляем текст сообщения шаблоном
  90.          */
  91.         $Template = new TemplateDB('cms_mail_template', 'maillist', 'message');
  92.        
  93.         /**
  94.          * Отправка сообщений
  95.          */
  96.         $emails = $Maillist->getQueue();
  97.         $total_rows = count($emails);
  98.          
  99.         reset($emails);
  100.         while (list($counter, $rcpt) = each($emails)) {
  101.                 echo "[i][$counter/$total_rows] Sending mail to $rcpt[email] ... ";
  102.                
  103.                 $TmplContent = new TemplateString($Maillist->content);
  104.                 if (!empty($rcpt['param'])) {
  105.                         $param = unserialize($rcpt['param']);
  106.                         $TmplContent->set($param);
  107.                 }
  108.                
  109.                 $Template->set('content', $TmplContent->display());
  110.                
  111.                 $Sendmail = new Sendmail(MAILLIST_MAIL_ID, $Maillist->subject, $Template->display());
  112.                 $Sendmail->addHeaders(array(
  113.                         'From'           => $Maillist->from,
  114.                         'Errors-To'  => $stoplist,
  115.                         'Reply-To'   => $Maillist->reply_to,
  116.                         'Precedence' => 'bulk'
  117.                 ));
  118.                
  119.                 $attach = $Maillist->getAttachments();
  120.                
  121.                 reset($attach);
  122.                 while (list(,$row) = each($attach)) {
  123.                         $Sendmail->attach($row['file'], $row['name']);
  124.                 }
  125.                
  126.                 $result = $Sendmail->send($rcpt['email'], true);
  127.                 echo "$result[delivery]\n";
  128.                
  129.                 if (!in_array($result['delivery'], array('error', 'wait', 'ok'))) {
  130.                         $result['delivery'] = 'error';
  131.                 }
  132.                  
  133.                 $DB->update("
  134.                         UPDATE maillist_queue SET delivery='$result[delivery]'
  135.                         WHERE message_id='$rcpt[message_id]' AND email='$rcpt[email]'
  136.                 ");
  137.         }
  138. }
  139.  
  140.  
  141. echo "[i] Finish ".date('Y-m-d H:i:s')."\n";
  142.  
  143.  
  144.  

(Добавление)
pop3parser.php

PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. /**
  3. * Прасер сообщений с рассылкой, присылаемых по почте
  4. *
  5. * @package Pilot
  6. * @subpackage Maillist
  7. * @version 3.0
  8. * @cron ~/5 * * * *
  9. */
  10.  
  11. /**
  12.  * Определяем интерфейс
  13.  * @ignore
  14.  */
  15. define('CMS_INTERFACE', 'ADMIN');
  16.  
  17. // Устанавливаем правильную рабочую директорию
  18. chdir(dirname(__FILE__));
  19.  
  20. /**
  21. * Конфигурационный файл
  22. */
  23. require_once('../../config.inc.php');
  24.  
  25. $DB = DB::factory('default');
  26.  
  27. /**
  28.  * Блокировка паралельного запуска скрипта
  29.  */
  30. Shell::collision_catcher();
  31.  
  32. $query = "select * from cms_mail_account where id='".MAILLIST_PARSER_MAIL_ID."'";
  33. $mailserver = $DB->query_row($query);
  34.  
  35. // Соединяемся с pop3 сервером, переход в состояние TRANSACTION
  36. $POP3 = new POP3($mailserver['pop3_host'], $mailserver['pop3_port'], $mailserver['pop3_login'], $mailserver['pop3_password']);
  37.  
  38. $message_count = count($POP3->stat);
  39.  
  40. echo '[i] '.$message_count." message(s) in mailbox\n";
  41.  
  42. reset($POP3->stat);
  43. while(list($message_id, $size) = each($POP3->stat)) {
  44.        
  45.         echo "[i] Parsing message ".$message_id." of ".$message_count."\n";
  46.        
  47.         if ($size > MAILLIST_PARSER_MAX_SIZE) {
  48.                 $text = $POP3->top($message_id, 50);
  49.         } else {
  50.                 $text = $POP3->retr($message_id);
  51.         }
  52. //      $POP3->dele($message_id);
  53.        
  54.         /**
  55.          * Сохраняем письмо в логе
  56.          */
  57.         if (!is_dir(LOGS_ROOT.'pop3parser/')) {
  58.                 mkdir(LOGS_ROOT.'pop3parser/', 0755, true);
  59.         }
  60.         file_put_contents(LOGS_ROOT.'pop3parser/'.date('Y-m-d-H-i-s-').$message_id, $text);
  61.        
  62.         if(!$message_parts = split_multipart($text)) {
  63.                 echo "[e] Message parsing error\n";
  64.                 continue;
  65.         }
  66.        
  67.         $top_headers = $message_parts[0]['headers'];
  68.        
  69.         /**
  70.          * Вырезаем поле From
  71.          */
  72.         if (!set_and_match("/([a-z0-9_\.\-]+@[a-z0-9_\.\-]+\.[a-z]{2,4})/i", $top_headers['from'], $match)) {
  73.                 echo "[e] == From header not found. Message skipped.\n";
  74.                 continue;
  75.         } else {
  76.                 $message_from = $match[1];
  77.         }
  78.        
  79.         /**
  80.          * Разрешено ли парсить сообщения, пришедшие с этого адреса
  81.          */
  82.         $allow_from = preg_split("/[\s\t,]/", MAILLIST_PARSER_ALLOW_FROM, -1, PREG_SPLIT_NO_EMPTY);
  83.        
  84.         if (MAILLIST_PARSER_ALLOW_FROM != '' && !in_array($message_from, $allow_from)) {
  85.                 $Template = new Template(SITE_ROOT.'templates/maillist/parser_access_denied');
  86.                 if (isset($top_headers['subject'])) {
  87.                         $Template->set('subject', $top_headers['subject']);
  88.                 } else {
  89.                         $Template->set('subject', 'Без темы');
  90.                 }
  91.                 $Sendmail = new Sendmail(CMS_MAIL_ID, 'Access denied', $Template->display());
  92.                 $Sendmail->send($message_from);
  93.                 unset($Template);
  94.                 echo "[w] Message from $message_from : access denied\n";
  95.                 continue;      
  96.         }
  97.        
  98.         /**
  99.          * Если размер сообщения превышает лимит - игнорировать сообщение и
  100.          * послать уведомление автору
  101.          */
  102.         if ($size > MAILLIST_PARSER_MAX_SIZE) {
  103.                 $Template = new TemplateDB('cms_mail_template', 'maillist', 'parser_max_size');
  104.                 if (isset($top_headers['subject'])) {
  105.                         $Template->set('subject', $top_headers['subject']);
  106.                 } else {
  107.                         $Template->set('subject', 'Без темы');
  108.                 }
  109.                
  110.                 $Sendmail = new Sendmail(CMS_MAIL_ID, 'Max message size exceeded', $Template->display());
  111.                 $Sendmail->send($message_from);
  112.                 unset($Template);
  113.                 echo "[w] Maximum message size exceeded in message from $message_from\n";
  114.                 continue;
  115.         }
  116.        
  117.         /**
  118.          * Определение заголовка сообщения
  119.          */
  120.         if (isset($top_headers['subject'])) {
  121.                 echo "[i] == Subject: ".iconv(LANGUAGE_CHARSET, CMS_SHELL_CHARSET.'//IGNORE', $top_headers['subject'])."\n";
  122.         } else {
  123.                 echo "[e] Subject header not found\n";
  124. //              x($text);
  125.                 continue;
  126.         }
  127.        
  128.         $query = "
  129.                 INSERT INTO maillist_message
  130.                 SET
  131.                         subject = '".$top_headers['subject']."',
  132.                         editable = 'true',
  133.                         reply_to = '$message_from'
  134.         ";
  135.         $db_message_id = $DB->insert($query);
  136.        
  137.         /**
  138.          * Разнос сообщений по группам
  139.          */
  140.         if (isset($top_headers['subject']) && preg_match("/^{([^\}]+)}/", trim($top_headers['subject']), $matches)) {
  141.                 $top_headers['subject'] = trim(substr($top_headers['subject'], strpos($top_headers['subject'], '}') + 1));
  142.                 $category = preg_split("/,/", strtolower($matches[1]), -1, PREG_SPLIT_NO_EMPTY);
  143.                 $query = "
  144.                         INSERT INTO maillist_message_category (message_id, category_id)
  145.                         SELECT '$db_message_id' AS message_id, id AS category_id
  146.                         FROM maillist_category
  147.                         WHERE LOWER(uniq_name) IN ('".implode("','", $category)."')
  148.                 ";
  149.                 $DB->insert($query);
  150.                
  151.                 // Обновляем заголовок
  152.                 $query = "UPDATE maillist_message SET subject='".$top_headers['subject']."' WHERE id='$db_message_id'";
  153.                 $DB->update($query);
  154.                
  155.         } else {
  156.                 // Если пользователь не указал группы на которые необходимо рассылать
  157.                 // то добавляем письмо во все группы
  158.                 $query = "
  159.                         INSERT INTO maillist_message_category (message_id, category_id)
  160.                         SELECT '$db_message_id' AS message_id, id AS category_id
  161.                         FROM maillist_category
  162.                 ";
  163.                 $DB->insert($query);
  164.  
  165.         }
  166.         unset($matches);
  167.        
  168.        
  169.         /**
  170.          * Обработка частей сообщения
  171.          */
  172.         $embed_counter = 0;
  173.         $message_text = '';
  174.         $replacements = array();
  175.         reset($message_parts);
  176.         while (list($index, $row)=each($message_parts)) {
  177.                 if ($row['meta']['type'] == 'attachment') {
  178.                         /**
  179.                          * Эта часть сообщения - аттач
  180.                          */
  181.                         echo "[i] == Attachment found\n";
  182.                         $query = "
  183.                                 INSERT INTO maillist_attachment
  184.                                 SET
  185.                                         message_id = '$db_message_id',
  186.                                         name = '".basename($row['meta']['filename'], '.'.$row['meta']['extension'])."',
  187.                                         file = '".$row['meta']['extension']."'
  188.                         ";
  189.                         $attach_id = $DB->insert($query);
  190.                        
  191.                         $filename = Uploads::getFile('maillist_attachment', 'file', $attach_id, $row['meta']['extension']);
  192.                         if (!is_dir(dirname($filename))) {
  193.                                 mkdir(dirname($filename), 0755, true);
  194.                         }
  195.                         file_put_contents($filename, $row['body']);
  196.                 } elseif ($row['meta']['type'] == 'embed') {
  197.                         /**
  198.                          * Это встроенный в HTML файл (рисунок, звук, etc)
  199.                          */
  200.                         echo "[i] == Embeded file found\n";
  201.                         $file = 'maillist_message/'.LANGUAGE_CURRENT.'/'.Uploads::getIdFileDir($db_message_id).'/'.sprintf('%02d', $embed_counter).'.'.$row['meta']['extension'];
  202.                         $filename = UPLOADS_ROOT.$file;
  203.                        
  204.                         if (!is_dir(dirname($filename))) {
  205.                                 mkdir(dirname($filename), 0755, true);
  206.                         }
  207.                         file_put_contents($filename, $row['body']);
  208.                         $replacements[ 'cid:'.$row['meta']['cid'] ] = '/'.UPLOADS_DIR.$file;
  209.                         $embed_counter++;
  210.                 } elseif ($row['meta']['type'] == 'text') {
  211.                         $message_text = $row['body'];
  212.                 }
  213.         }
  214.        
  215.         /**
  216.          * Записываем в файл текст сообщения (после замены в нем CID'ов на имена файлов)
  217.          */
  218.         $message_text = str_replace(array_keys($replacements), array_values($replacements), $message_text);
  219.        
  220.         // нам необходимо только тело сообщения, без заголовков
  221.         $message_text = preg_replace("~^.+</HEAD>.+<BODY[^>]*>~ismU", '', $message_text);
  222.         $message_text = preg_replace("/<\/body>.*$/i", '', $message_text);
  223.  
  224.         $query = "update maillist_message set content='".addcslashes($message_text, "'")."' where id='$db_message_id'";
  225.         $DB->update($query);
  226. }
  227.  
  228. // Переходим в состояние UPDATE
  229. unset($POP3);
  230.  
  231.  
  232.  
  233.  
  234.  
  235.  
  236.  
  237.  
  238.  
  239.  
  240.  
  241.  
  242.  
  243.  
  244.  
  245.  
  246. /**
  247.  * Проверяет, существует ли переменная и соответствует ли она шаблону
  248.  *
  249.  * @param string $pattern
  250.  * @param string $subject
  251.  * @param array $match
  252.  * @return bool
  253.  */
  254. function set_and_match($pattern, &$subject, &$match = null) {
  255.         if (isset($subject) && preg_match($pattern, $subject, $match)) {
  256.                 return true;
  257.         }
  258.         return false;
  259. }
  260.  
  261. /**
  262.  * Поскольку рассылка проводится в HTML формате, необходимо превратить текст
  263.  * в HTML, чтобы он выглядел как в письме
  264.  *
  265.  * @param string $text
  266.  * @return string
  267.  */
  268. function text2html($text) {
  269.         /**
  270.          * 1. Преобразуем переводы строк в <br>
  271.          */
  272.         $result = preg_replace("/(\r\n|\r|\n)/", "<br />\n", $text);
  273.         return $result;
  274. }
  275.  
  276. /**
  277.  * Разбивает текст multipart сообщения на части,
  278.  * производит обработку частей (декодирование base64, quoted-printable, перевод текста в кодировку сайта)
  279.  *
  280.  * @param string $text
  281.  * @return array
  282.  */
  283. function split_multipart($text) {
  284.         $message_parts = array();
  285.        
  286.         $splitted = preg_split("/\r\n\r\n/", $text, 2);
  287.        
  288.         /**
  289.          * Отделяем заголовки сообщения от тела
  290.          */
  291.         if (count($splitted) != 2) {
  292.                 echo "[e] Can't detect headers delimiter!\n";
  293. //              x($text);
  294.                 return false;
  295.         }
  296.        
  297.         $splitted[0] = array_change_key_case(iconv_mime_decode_headers(trim($splitted[0]), ICONV_MIME_DECODE_CONTINUE_ON_ERROR, LANGUAGE_CHARSET), CASE_LOWER);
  298.        
  299.         if (set_and_match('/multipart.*boundary=\"(.*)\"/iU', $splitted[0]['content-type'], $match)) {
  300.                 // Это текст multipart сообщения - разбить его на части
  301.                 $parts = preg_split('/--'.preg_quote($match[1], '/').'/', $text);
  302.                 echo "[i] == Multipart message. Boundary = ".$match[1]."\n";
  303.                
  304.                 if (!is_array($parts)) {
  305.                         echo "BOUNDARY: $match[1]";
  306.                         exit;
  307.                 }
  308.                
  309.                 /**
  310.                  * Убираем top-level заголовок, чтобы предотвратить зацикливание,
  311.                  * предварительно сохранив их в первом элементе возвращаемого массива
  312.                  */
  313.                 $message_parts[0] = array('headers' => $splitted[0], 'meta' => array('type' => 'multipart'));
  314.                 unset($parts[0]);
  315.                
  316.                 $splitted = array();
  317.                 reset($parts);
  318.                 while (list(,$row)=each($parts)) {
  319.                         $splitted = split_multipart($row);
  320.                        
  321.                         if (!is_array($splitted)) {
  322.                                 echo "[e] Can't split multipart message!\n";
  323. //                              x($text);
  324. //                              x($splitted);
  325.                                 return false;
  326.                         }
  327.                        
  328.                         reset($splitted);
  329.                         while (list(,$row2)=each($splitted)) {
  330.                                 $message_parts[] = $row2;
  331.                         }
  332.                 }
  333.         } else {
  334.                 // Это заголовки и содержимое файла
  335.                 $splitted_part = preg_split("/\r\n\r\n/", $text, 2);
  336.                 if (count($splitted_part) == 2) {
  337.                         $this_part = array('headers' => array_change_key_case(iconv_mime_decode_headers(trim($splitted_part[0]), ICONV_MIME_DECODE_CONTINUE_ON_ERROR, LANGUAGE_CHARSET), CASE_LOWER), 'body' => trim($splitted_part[1]));
  338.                        
  339.                         /**
  340.                          * Декодирование quoted-printable или base64, если такое присутствует
  341.                          */
  342.                         if (set_and_match('/(quoted-printable|base64)/i', $this_part['headers']['content-transfer-encoding'], $match)) {
  343.                                 if ($match[1] == 'base64') {
  344.                                         echo "[i] == Base64 encoded file\n";
  345.                                         $this_part['body'] = base64_decode($this_part['body']);
  346.                                 } elseif ($match[1] == 'quoted-printable') {
  347.                                         echo "[i] == Quoted-printable text\n";
  348.                                         $this_part['body'] = quoted_printable_decode($this_part['body']);
  349.                                 }
  350.                         }
  351.                        
  352.                         /**
  353.                          * Исправление глюка с MS Word текстами - замена длинного тире на знак минуса
  354.                          */
  355.                         if (set_and_match('/text\/html/i', $this_part['headers']['content-type'])) {
  356.                                 $this_part['body'] = preg_replace('/\x96/', chr(45), $this_part['body']);
  357.                         }
  358.                        
  359.                         /**
  360.                          * Перевод в кодировку сайта, если в заголовке указана кодировка сообщения
  361.                          */
  362.                         if (set_and_match('/charset=\"?([^\s\"]+)/i', $this_part['headers']['content-type'], $match)) {
  363.                                 echo "[i] == Charset detected: ".$match[1]."\n";
  364.                                 $this_part['body'] = iconv($match[1], LANGUAGE_CHARSET.'//IGNORE', $this_part['body']);
  365.                                
  366.                                 // В контенте может быть заголовок <meta http-equiv=Content-Type content="text/html; charset=koi8-r">, в него надо вставить правильную кодировку
  367.                                 $this_part['body'] = preg_replace("/".preg_quote($match[1], '/')."/", LANGUAGE_CHARSET, $this_part['body']);
  368.                         } elseif (set_and_match('/text\//i', $this_part['headers']['content-type'])) {
  369.                                 $charset = Charset::detectCyrCharset($this_part['body']);
  370.                                 echo "[i] == Charset GUESSED: $charset\n";
  371.                                 $this_part['body'] = iconv($charset, LANGUAGE_CHARSET.'//IGNORE', $this_part['body']);
  372.                         }
  373.                        
  374.                         /**
  375.                          * Определение типа части - это аттач, встроенный в HTML файл или текст
  376.                          */
  377.                         if (set_and_match('/attachment;\s+filename=\"(.*)\"/i', $this_part['headers']['content-disposition'], $match)) {
  378.                                 $this_part['meta']['type'] = 'attachment';
  379.                                 $this_part['meta']['filename'] = $match[1];
  380.                                 $this_part['meta']['extension'] = Uploads::getFileExtension($this_part['meta']['filename']);
  381.                                
  382.                         } elseif (set_and_match('/\<(.*)\>/i', $this_part['headers']['content-id'], $match) && set_and_match('/name=\"(.*)\"/i', $this_part['headers']['content-type'], $match2)) {
  383.                                 $this_part['meta']['type'] = 'embed';
  384.                                 $this_part['meta']['filename'] = $match2[1];
  385.                                 $this_part['meta']['extension'] = Uploads::getFileExtension($this_part['meta']['filename']);
  386.                                 $this_part['meta']['cid'] = $match[1];
  387.                                
  388.                         } elseif (set_and_match('/text\//i', $this_part['headers']['content-type'])) {
  389.                                 /**
  390.                                  * Исправление глюка MS Word
  391.                                  */
  392.                                 $this_part['meta']['type'] = 'text';
  393.                                
  394.                         } else {
  395.                                 $this_part['meta']['type'] = 'undefined';
  396.                         }
  397.                        
  398.                         /**
  399.                          * Преобразование текста в HTML
  400.                          */
  401.                         if (set_and_match('/text\/plain/i', $this_part['headers']['content-type'])) {
  402.                                 $this_part['body'] = text2html($this_part['body']);
  403.                         }
  404.                        
  405.                         $message_parts[] = $this_part;
  406.                 }
  407.         }
  408.        
  409.        
  410.         if (count($message_parts) == 0) {
  411.                 return false;
  412.         } else {
  413.                 return $message_parts; 
  414.         }
  415. }
  416. ?>


stoplist.php

PHP:
скопировать код в буфер обмена
  1.  
  2.  
  3. <?PHP
  4. /**
  5. * Обработка писем, которые не доставлены адресатам
  6. *
  7. * @package Pilot
  8. * @subpackage Maillist
  9. * @version 3.0
  10. * @cron 33 ~/4 * * *
  11. */
  12.  
  13. /**
  14.  * Определяем интерфейс
  15.  * @ignore
  16.  */
  17. define('CMS_INTERFACE', 'ADMIN');
  18.  
  19. // Устанавливаем правильную рабочую директорию
  20. chdir(dirname(__FILE__));
  21.  
  22. /**
  23. * Конфигурационный файл
  24. */
  25. require_once('../../config.inc.php');
  26.  
  27. $DB = DB::factory('default');
  28.  
  29. /**
  30. * Блокировка паралельного запуска скрипта
  31. */
  32. Shell::collision_catcher();
  33.  
  34. /**
  35.  * Периодическая чистка стоплиста
  36.  */
  37. if (rand(0, 100) > 70) {
  38.         $query = "DELETE FROM maillist_stoplist WHERE dtime < NOW() - INTERVAL ".MAILLIST_STOPLIST_DURATION." SECOND";
  39.         $DB->delete($query);
  40. }
  41.  
  42. /**
  43.  * Определяем слова, которые должны встречаться в тексте для того, что б система
  44.  * обрабатывала письма добавляя их в стоп лист. Все письма со словами, которые
  45.  * не встречаются в этом списке буду т игнорироваться
  46.  */
  47. $accept_words = preg_split("/\s*,\s*/", MAILLIST_STOPLIST_ACCEPT_WORDS, -1, PREG_SPLIT_NO_EMPTY);
  48.  
  49.  
  50. $query = "select * from cms_mail_account where id='".MAILLIST_MAIL_ID."'";
  51. $mailserver = $DB->query_row($query);
  52.  
  53. /**
  54.  * Соединяемся с POP3 сервером
  55.  */
  56. $POP3 = new POP3($mailserver['pop3_host'], $mailserver['pop3_port'], $mailserver['pop3_login'], $mailserver['pop3_password']);
  57. echo '[i] '.count($POP3->stat)." message(s) in mailbox\n";
  58. reset($POP3->stat);
  59. while(list($message_id, $size) = each($POP3->stat)) {
  60.         echo "\n[i] Parsing message ".$message_id." of ".count($POP3->stat)."\n";
  61.         if ($size > 1000000) {
  62.                 echo "[i] Message size $size, skip\n";
  63. //              $POP3->dele($message_id);
  64.                 continue;
  65.         }
  66.        
  67.         $text = $POP3->retr($message_id);
  68.                
  69.         // Очистить сообщение от заголовков и вложенных сообщений, так как
  70.         // они могут содержать адреса в заголовках From, Reply-To etc.
  71.         $text = message_cleanup($text);
  72.        
  73.         // Проверяем слова, которые содержатся в письмах, сгенерированных почтовыми роботами
  74.         $accepted = false;
  75.         reset($accept_words);
  76.         while(list(,$word) = each($accept_words)) {
  77.                 if (stristr($text, $word)) {
  78.                         $accepted = true;
  79.                         continue;
  80.                 }
  81.         }
  82.         if (!$accepted && !empty($accept_words)) {
  83.                 echo "[i] not accepted\n";
  84.                 $POP3->dele($message_id);
  85.                 continue;
  86.         }
  87.  
  88.        
  89.         if (!preg_match_all("/[a-z0-9_\.\-]+@[a-z0-9_\.\-]+\.[a-z]{2,4}/i", $text, $matches)) {
  90.                 echo "[i] skipped\n";
  91.                 $POP3->dele($message_id);
  92.                 continue;
  93.         }
  94.        
  95.         echo "[i] ".count($matches[0])." e-mail found ... \n";
  96.         // Ставим в стоплист сообщения, которые вернули ошибку
  97.         if (count($matches[0]) > 0) {
  98.                 $insert = array();
  99.                 reset($matches[0]);
  100.                 while (list(,$email) = each($matches[0])) {
  101.                         $insert[] = "('$email', '".$DB->escape($text)."')";
  102.                 }
  103.                 $query = "INSERT INTO maillist_stoplist (email, message) VALUES ".implode(",", $insert);
  104.                 $DB->insert($query);
  105.                 echo "[i] ".$DB->affected_rows . " e-mail added to stoplist\n";
  106.         }
  107.        
  108.         /**
  109.          * Удаляем обработанное сообщение
  110.          */
  111.         $POP3->dele($message_id);
  112. }
  113. unset($POP3);
  114.  
  115.  
  116.  
  117.  
  118.  
  119.  
  120. /**
  121.  * Очистка текста письма от заголовков и вложений, в том числе
  122.  * вложенных сообщений
  123.  *
  124.  * @param string $message_text
  125.  * @return string
  126.  */
  127. function message_cleanup($message_text) {
  128.         $parts = preg_split("/\r\n\r\n/", $message_text, 2);
  129.        
  130.         /**
  131.          * Это не почтовое сообщение - возвращаем неизмененным
  132.          */
  133.         if (count($parts) != 2) {
  134.                 return $message_text;
  135.         }
  136.        
  137.         $parts[0] = array_change_key_case(iconv_mime_decode_headers(trim($parts[0]), ICONV_MIME_DECODE_CONTINUE_ON_ERROR, LANGUAGE_CHARSET), CASE_LOWER);
  138.         if (isset($parts[0]['content-type']) && preg_match('/multipart.*boundary=\"(.*)\"/i', $parts[0]['content-type'], $match)) {
  139.                 $result = '';
  140.                 $parts = preg_split('/--'.preg_quote($match[1], '/').'/', $message_text);
  141.                 echo "[i] == Multipart message. Boundary = ".$match[1]."\n";
  142.                
  143.                 reset($parts);
  144.                 while (list(,$row)=each($parts)) {
  145.                         /**
  146.                          * Отделяем заголовки от тела, если неудачно - игнорируем эту часть
  147.                          */
  148.                         $splitted = preg_split("/\r\n\r\n/", $row, 2);
  149.                         if (count($splitted) != 2) {
  150.                                 continue;
  151.                         }
  152.                        
  153.                         /**
  154.                          * Если тип части - text/*, то добавляем содержимое части к результату
  155.                          * В другом случае (аттач, рисунокб сообщение) - игнорируем
  156.                          */
  157.                         $this_part = array('headers' => array_change_key_case(iconv_mime_decode_headers(trim($splitted[0]), 0, LANGUAGE_CHARSET), CASE_LOWER), 'body' => trim($splitted[1]));
  158.                         if (isset($this_part['headers']['content-type']) && preg_match('/text\//i', $this_part['headers']['content-type'])) {
  159.                                 $result .= $this_part['body']."\n";
  160.                         }
  161.                 }
  162.                
  163.                 return $result;
  164.                
  165.         } else {
  166.                 /**
  167.                  * Это не multipart сообщение - возвращаем его текст (без заголовков)
  168.                  */
  169.                 return $parts[1];
  170.         }
  171. }
  172. ?>

(Добавление)
Вот все что нашло по ключевому слову Sendmail, если где-то есть зацепка, то я выложу тот код. Еще раз спасибо.

CODE (htmlphp):
скопировать код в буфер обмена
  1. Search "Sendmail" (99 hits in 25 files)
  2.    \system\actions\admin\shop\send_confirm_order.act.php (3 hits)
  3.         Line 62: $Sendmail = new Sendmail(CMS_MAIL_ID, 'Подтверждение заказ на сайте', $Template->display());
  4.         Line 62: $Sendmail = new Sendmail(CMS_MAIL_ID, 'Подтверждение заказ на сайте', $Template->display());
  5.         Line 63: $Sendmail->send(trim($order['email']), true);
  6.    \system\actions\site\cms\amnesia.act.php (3 hits)
  7.         Line 50: $Sendmail = new Sendmail(CMS_MAIL_ID, cms_message('CMS', 'Восстановление пароля - '.CMS_HOST), $Template->display());
  8.         Line 50: $Sendmail = new Sendmail(CMS_MAIL_ID, cms_message('CMS', 'Восстановление пароля - '.CMS_HOST), $Template->display());
  9.         Line 51: $Sendmail->send($data['email'], true);
  10.    \system\actions\site\cms\find_error.act.php (3 hits)
  11.         Line 26:                $Sendmail = new Sendmail(CMS_MAIL_ID, 'Найдена новая ошибка на сайте', $Template->display());
  12.         Line 26:                $Sendmail = new Sendmail(CMS_MAIL_ID, 'Найдена новая ошибка на сайте', $Template->display());
  13.         Line 27:                $Sendmail->send(trim($email),true);
  14.    \system\actions\site\comment\add.act.php (3 hits)
  15.         Line 71:        $Sendmail = new Sendmail(CMS_MAIL_ID, $Template->title, $message);
  16.         Line 71:        $Sendmail = new Sendmail(CMS_MAIL_ID, $Template->title, $message);
  17.         Line 72:        $Sendmail->send($email);
  18.    \system\actions\site\faq\question.act.php (3 hits)
  19.         Line 52: $Sendmail = new Sendmail(CMS_MAIL_ID, cms_message('FAQ', 'Часто задаваемый вопрос'), $Template->display());
  20.         Line 52: $Sendmail = new Sendmail(CMS_MAIL_ID, cms_message('FAQ', 'Часто задаваемый вопрос'), $Template->display());
  21.         Line 53: $Sendmail->send(CMS_NOTIFY_EMAIL);
  22.    \system\actions\site\form\order.act.php (6 hits)
  23.         Line 89:        $Sendmail = new Sendmail(SHOPORDER_MAIL_ID_SEND_ADMIN, 'Сформирован новый заказ на сайте', $Template->display());
  24.         Line 89:        $Sendmail = new Sendmail(SHOPORDER_MAIL_ID_SEND_ADMIN, 'Сформирован новый заказ на сайте', $Template->display());
  25.         Line 90:        $Sendmail->send(trim($email));
  26.         Line 95: $Sendmail = new Sendmail(SHOPORDER_MAIL_ID_SEND_CLIENT, 'Благодарим Вас за то, что стали нашим клиентом', $TemplateComplete->display());
  27.         Line 95: $Sendmail = new Sendmail(SHOPORDER_MAIL_ID_SEND_CLIENT, 'Благодарим Вас за то, что стали нашим клиентом', $TemplateComplete->display());
  28.         Line 96: $Sendmail->send(trim($form_data['email']),true);
  29.    \system\actions\site\form\send.act.php (7 hits)
  30.         Line 90:        $Sendmail = new Sendmail(CMS_MAIL_ID, $Form->title, $content);
  31.         Line 90:        $Sendmail = new Sendmail(CMS_MAIL_ID, $Form->title, $content);
  32.         Line 93:                $Sendmail->attach($row);
  33.         Line 95:        $Sendmail->send($email,true);
  34.         Line 108:       $Sendmail = new Sendmail($from, 'Ваша заявка принята', $form_reply['autoreply']);
  35.         Line 108:       $Sendmail = new Sendmail($from, 'Ваша заявка принята', $form_reply['autoreply']);
  36.         Line 109:       $Sendmail->send($form_data['email'],true);
  37.    \system\actions\site\shop\book_product.act.php (6 hits)
  38.         Line 38:        $Sendmail = new Sendmail(CMS_MAIL_ID, '«аказано уведоление о наличии', $Template->display());
  39.         Line 38:        $Sendmail = new Sendmail(CMS_MAIL_ID, '«аказано уведоление о наличии', $Template->display());
  40.         Line 39:        $Sendmail->send(trim($email),false);
  41.         Line 47: $Sendmail = new Sendmail(CMS_MAIL_ID, '«аказано уведоление о наличии', $Template->display());
  42.         Line 47: $Sendmail = new Sendmail(CMS_MAIL_ID, '«аказано уведоление о наличии', $Template->display());
  43.         Line 48: $Sendmail->send(trim($data['email']), false);
  44.    \system\actions\site\shoporder\order.act.php (3 hits)
  45.         Line 147:       $Sendmail = new Sendmail(CMS_MAIL_ID, 'Сформирован новый заказ на сайте', $Template->display());
  46.         Line 147:       $Sendmail = new Sendmail(CMS_MAIL_ID, 'Сформирован новый заказ на сайте', $Template->display());
  47.         Line 148:       $Sendmail->send(trim($email),true);
  48.    \system\actions\site\user\change.act.php (3 hits)
  49.         Line 419:       $Sendmail = new Sendmail(CMS_MAIL_ID, "Запрос подтверждения внесенных изменений", $TmplMail->display());
  50.         Line 419:       $Sendmail = new Sendmail(CMS_MAIL_ID, "Запрос подтверждения внесенных изменений", $TmplMail->display());
  51.         Line 420:       if($Sendmail->send($send_confirmation_to, true)){
  52.    \system\actions\site\user\notification.inc.php (3 hits)
  53.         Line 46:        $Sendmail = new Sendmail(CMS_MAIL_ID, cms_message('CMS', 'Регистрация на %s: подтверждение e-mail', CMS_HOST), $Template->display());
  54.         Line 46:        $Sendmail = new Sendmail(CMS_MAIL_ID, cms_message('CMS', 'Регистрация на %s: подтверждение e-mail', CMS_HOST), $Template->display());
  55.         Line 47:        $Sendmail->send($mailto, false);
  56.    \system\actions\site\user\register.act.php (3 hits)
  57.         Line 386:       $Sendmail = new Sendmail(CMS_MAIL_ID, cms_message('CMS', 'Регистрация на %s', CMS_HOST), $Template->display());
  58.         Line 386:       $Sendmail = new Sendmail(CMS_MAIL_ID, cms_message('CMS', 'Регистрация на %s', CMS_HOST), $Template->display());
  59.         Line 387:       $Sendmail->send(CMS_NOTIFY_EMAIL, false);
  60.    \system\actions\site\user\send_code.act.php (3 hits)
  61.         Line 33: $Sendmail = new Sendmail(CMS_MAIL_ID, cms_message('CMS', 'Регистрация на %s: подтверждение e-mail', CMS_HOST), $Template->display());
  62.         Line 33: $Sendmail = new Sendmail(CMS_MAIL_ID, cms_message('CMS', 'Регистрация на %s: подтверждение e-mail', CMS_HOST), $Template->display());
  63.         Line 35: $Sendmail->send($user['email'], true);
  64.    \system\crontab\cms\mailq.php (1 hit)
  65.         Line 44:        $result = @Sendmail::delivery($message_id);
  66.    \system\crontab\maillist\control.php (16 hits)
  67.         Line 105:       $Sendmail = new Sendmail(MAILLIST_CONTROL_MAIL_ID, 'Отчет по выполнению Вашего запроса', nl2br($TmplReport->display()));
  68.         Line 105:       $Sendmail = new Sendmail(MAILLIST_CONTROL_MAIL_ID, 'Отчет по выполнению Вашего запроса', nl2br($TmplReport->display()));
  69.         Line 109:       $Sendmail->attach("/tmp/$random_seed.eml", 'your-request.eml');
  70.         Line 111:       $Sendmail->send($message_from, true);
  71.         Line 137:               $Sendmail = new Sendmail(MAILLIST_CONTROL_MAIL_ID, 'Помощь по использованию рассылок на '.CMS_HOST, nl2br($Template->display()));
  72.         Line 137:               $Sendmail = new Sendmail(MAILLIST_CONTROL_MAIL_ID, 'Помощь по использованию рассылок на '.CMS_HOST, nl2br($Template->display()));
  73.         Line 138:               $Sendmail->send($message_from, true);
  74.         Line 151:                       $Sendmail = new Sendmail(MAILLIST_CONTROL_MAIL_ID, 'Напоминание пароля на '.CMS_HOST, nl2br($Template->display()));
  75.         Line 151:                       $Sendmail = new Sendmail(MAILLIST_CONTROL_MAIL_ID, 'Напоминание пароля на '.CMS_HOST, nl2br($Template->display()));
  76.         Line 152:                       $Sendmail->send($message_from, true);
  77.         Line 169:               $Sendmail = new Sendmail(MAILLIST_CONTROL_MAIL_ID, 'Список рассылок на '.CMS_HOST, nl2br($Template->display()));
  78.         Line 169:               $Sendmail = new Sendmail(MAILLIST_CONTROL_MAIL_ID, 'Список рассылок на '.CMS_HOST, nl2br($Template->display()));
  79.         Line 170:               $Sendmail->send($message_from, true);
  80.         Line 195:               $Sendmail = new Sendmail(MAILLIST_CONTROL_MAIL_ID, 'Список рассылок на '.CMS_HOST.', на которые Вы подписаны', nl2br($Template->display()));
  81.         Line 195:               $Sendmail = new Sendmail(MAILLIST_CONTROL_MAIL_ID, 'Список рассылок на '.CMS_HOST.', на которые Вы подписаны', nl2br($Template->display()));
  82.         Line 196:               $Sendmail->send($message_from, true);
  83.    \system\crontab\maillist\maillist.php (5 hits)
  84.         Line 113:               $Sendmail = new Sendmail(MAILLIST_MAIL_ID, $Maillist->subject, $Template->display());
  85.         Line 113:               $Sendmail = new Sendmail(MAILLIST_MAIL_ID, $Maillist->subject, $Template->display());
  86.         Line 114:               $Sendmail->addHeaders(array(
  87.         Line 125:                       $Sendmail->attach($row['file'], $row['name']);
  88.         Line 128:               $result = $Sendmail->send($rcpt['email'], true);
  89.    \system\crontab\maillist\pop3parser.php (6 hits)
  90.         Line 93:                $Sendmail = new Sendmail(CMS_MAIL_ID, 'Access denied', $Template->display());
  91.         Line 93:                $Sendmail = new Sendmail(CMS_MAIL_ID, 'Access denied', $Template->display());
  92.         Line 94:                $Sendmail->send($message_from);
  93.         Line 112:               $Sendmail = new Sendmail(CMS_MAIL_ID, 'Max message size exceeded', $Template->display());
  94.         Line 112:               $Sendmail = new Sendmail(CMS_MAIL_ID, 'Max message size exceeded', $Template->display());
  95.         Line 113:               $Sendmail->send($message_from);
  96.    \system\crontab\shop\book_product.php (3 hits)
  97.         Line 53:     $Sendmail = new Sendmail(CMS_MAIL_ID, 'Появился в наличии товар', $Template->display());
  98.         Line 53:     $Sendmail = new Sendmail(CMS_MAIL_ID, 'Появился в наличии товар', $Template->display());
  99.         Line 54:     $Sendmail->send(trim($row['email']));
  100.    \system\crontab\users\register.php (3 hits)
  101.         Line 140:       $Sendmail = new Sendmail(CMS_MAIL_ID, cms_message('CMS', 'Регистрация на %s', CMS_HOST), $Template->display());
  102.         Line 140:       $Sendmail = new Sendmail(CMS_MAIL_ID, cms_message('CMS', 'Регистрация на %s', CMS_HOST), $Template->display());
  103.         Line 141:       $Sendmail->send($user_email, true);
  104.    \system\libs\AuthOID.class.php (3 hits)
  105.         Line 608:               $Sendmail = new Sendmail(CMS_MAIL_ID, cms_message('CMS', 'Регистрация на %s', CMS_HOST), $Template->display());
  106.         Line 608:               $Sendmail = new Sendmail(CMS_MAIL_ID, cms_message('CMS', 'Регистрация на %s', CMS_HOST), $Template->display());
  107.         Line 609:               $Sendmail->send($user_email, true);
  108.    \system\libs\AuthOTP.class.php (3 hits)
  109.         Line 179:               $Sendmail = new Sendmail(CMS_MAIL_ID, cms_message('CMS', 'Двухэтапная авторизация на сайте %s отключена', CMS_HOST), $Template->display());
  110.         Line 179:               $Sendmail = new Sendmail(CMS_MAIL_ID, cms_message('CMS', 'Двухэтапная авторизация на сайте %s отключена', CMS_HOST), $Template->display());
  111.         Line 180:               $Sendmail->send($user['email'], true);  
  112.    \system\libs\Comment.class.php (3 hits)
  113.         Line 254:                       $Sendmail = new Sendmail(CMS_MAIL_ID, $Template->title, $Template->display());
  114.         Line 254:                       $Sendmail = new Sendmail(CMS_MAIL_ID, $Template->title, $Template->display());
  115.         Line 255:                       $Sendmail->send($row['email']);
  116.    \system\libs\misc.class.php (3 hits)
  117.         Line 590:               $Sendmail = new Sendmail(CMS_MAIL_ID, $subject, $content);
  118.         Line 590:               $Sendmail = new Sendmail(CMS_MAIL_ID, $subject, $content);
  119.         Line 591:               $Sendmail->send($email, $immediatly);
  120.    \system\libs\sendmail.class.php (1 hit)
  121.         Line 10: class Sendmail {
  122.    \system\triggers\default\auth_user\update_after.act.php (3 hits)
  123.         Line 14:                $Sendmail = new Sendmail(CMS_MAIL_ID, cms_message('CMS', 'Ваш аккаунт был проверен администратором'), $TmplMail->display());
  124.         Line 14:                $Sendmail = new Sendmail(CMS_MAIL_ID, cms_message('CMS', 'Ваш аккаунт был проверен администратором'), $TmplMail->display());
  125.         Line 15:                $Sendmail->send($this->NEW['email']);

(Добавление)
dmaw пишет:
У меня были похожие проблемы:
Исходящие письма с сайта site.by должны быть с емайлом, где после собаки имя site.by, если имя другое, то почтовый сервер куда Вы отправили письмо может не принять такое отправление, воспринять как спам и удалить. Не знаю как у вас, проверьте от какого имени Вы отправляете письма.


Отправляются от имени имяскрываю@eurozoo.in.ua порт 26
По настройке все отлично.

(Отредактировано автором: 25 Августа, 2014 - 23:12:19)

 
 Top
savchenkoarts
Отправлено: 27 Августа, 2014 - 18:21:28
Post Id


Новичок


Покинул форум
Сообщений всего: 13
Дата рег-ции: Авг. 2014  


Помог: 0 раз(а)




OrmaJever пишет:
окей, как тогда отправляються письма? что находиться в методе Sendmail::delivery($message_id); ?


Viper пишет:
Вам же сказали - без дебага не смогут помочь. Конкретно нужно увидеть код Sendmail::delivery.


Нашел

PHP:
скопировать код в буфер обмена
  1. $email_list = explode(',', SHOPORDER_NOTIFY_EMAIL);
  2.  
  3. while (list(,$email) = each($email_list)) {
  4.         $Sendmail = new Sendmail(CMS_MAIL_ID, 'Сформирован новый заказ на сайте', $Template->display());
  5.         $Sendmail->send(trim($email),true);
  6.  
 
 Top
savchenkoarts
Отправлено: 28 Августа, 2014 - 11:14:20
Post Id


Новичок


Покинул форум
Сообщений всего: 13
Дата рег-ции: Авг. 2014  


Помог: 0 раз(а)




ап
 
 Top
savchenkoarts
Отправлено: 28 Августа, 2014 - 23:24:22
Post Id


Новичок


Покинул форум
Сообщений всего: 13
Дата рег-ции: Авг. 2014  


Помог: 0 раз(а)




Нашли проблему, может кому то поможет, google почта не принимала эти письма с сайта, воспринимает как частый запрос и банит, иногда пропускает! На почту mail.ru приходит хорошо. Короче я был в шоке, проблемы то Подмигивание
 
 Top
RickMan
Отправлено: 28 Августа, 2014 - 23:39:04
Post Id


Участник


Покинул форум
Сообщений всего: 1033
Дата рег-ции: Май 2012  


Помог: 30 раз(а)




https://mandrill[dot]com/ - юзай этот сервис. Там за бесплатно можно 12к писем в месяц слать. API на PHP есть. И письма такие будут проходить фильтр гугла всегда.

(Отредактировано автором: 28 Августа, 2014 - 23:39:26)

 
 Top
savchenkoarts
Отправлено: 29 Августа, 2014 - 00:00:59
Post Id


Новичок


Покинул форум
Сообщений всего: 13
Дата рег-ции: Авг. 2014  


Помог: 0 раз(а)




Ого класс, уже юзаю) Все работает, на google приходит! 5+ Спасибо.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Напишите за меня, пожалуйста »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB