PHP . SU
Программирование на PHP, MySQL и другие веб-технологии
Без описания
Поиск в теме | Версия для печати
savchenkoarts
Отправлено: 24 Августа, 2014 - 18:32:35
Новичок
Покинул форум
Сообщений всего: 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 ):
скопировать код в буфер обмена
<? php
/**
* Рассылка писем, стоящих в очереди
* @package Pilot
* @subpackage CMS
* @cron ~/5 * * * *
*/
/**
* Определяем интерфейс
* @ignore
*/
define ( 'CMS_INTERFACE' , 'ADMIN' ) ;
// Устанавливаем правильную рабочую директорию
/**
* Конфигурационный файл
*/
require_once ( '../../config.inc.php' ) ;
$DB = DB:: factory ( 'default' ) ;
// Блокировка паралельного запуска скрипта
Shell:: collision_catcher ( ) ;
$message = $DB -> fetch_column ( "
SELECT id, recipient
FROM cms_mail_queue
WHERE delivery = 'wait' AND DATE(create_dtime) = current_date()
ORDER BY id DESC
" , 'id' , 'recipient' ) ;
$counter = 0 ;
echo "[i] Start Mailq. " . count ( $message ) . " new messages found. \n " ;
while ( list ( $message_id , $recipient ) = each ( $message ) ) {
$result = @ Sendmail:: delivery ( $message_id ) ;
$counter ++;
echo iconv ( CMS_CHARSET, CMS_SHELL_CHARSET. '//IGNORE' , "[i] $counter \t Message (ID:$message_id ) to $recipient : failed!!! \n " ) ; } else {
echo iconv ( CMS_CHARSET, CMS_SHELL_CHARSET. '//IGNORE' , "[i] $counter \t Message (ID:$message_id ) to $result[recipient] : $result[delivery] ($result[status_message] )\n " ) ; }
}
?>
savchenkoarts
Отправлено: 24 Августа, 2014 - 19:21:39
Новичок
Покинул форум
Сообщений всего: 13
Дата рег-ции: Авг. 2014
Помог: 0 раз(а)
Я новичок в php, лучшее скажите куда посмотреть и что сделать, я сделаю.
(Добавление)
OrmaJever пишет: что находиться в методе Sendmail::delivery($message_id); ?
На сколько я понял описание и номер заказа, это интернет магазин.
OrmaJever пишет: как тогда отправляються письма?
Отправляются с корзины.
Если нужно еще какие-то кодировки по сайту найти, говорите, я найду и выложу.
(Отредактировано автором: 24 Августа, 2014 - 19:46:43)
Viper
Отправлено: 25 Августа, 2014 - 22:27:22
Активный участник
Покинул форум
Сообщений всего: 4555
Дата рег-ции: Февр. 2007
Откуда: Симферополь
Помог: 98 раз(а)
savchenkoarts что апать? Вам же сказали - без дебага не смогут помочь. Конкретно нужно увидеть код Sendmail::delivery.
savchenkoarts пишет: Отправляются с корзины.
вы в этом уверены? Я точно уверен что нет.
savchenkoarts
Отправлено: 25 Августа, 2014 - 22:53:50
Новичок
Покинул форум
Сообщений всего: 13
Дата рег-ции: Авг. 2014
Помог: 0 раз(а)
Через Notepad++ "Sendmail::delivery" я только нашел в этом коде.
Нашел еще файлы с кодом, может помогут. Я просто не знаю где найти код "Sendmail::delivery". Извините. Спасибо.
pop3.class.php
CODE (
htmlphp ):
скопировать код в буфер обмена
<? php
/**
* Класс по работе с POP3 сервером
* @package Pilot
* @subpackage CMS
*/
/**
* Класс по работе с POP3 сервером
* @package Maillist
* @subpackage Libraries
*/
class POP3 {
/**
* Ресурс соединения
* @var resource
*/
private $connection ;
/**
* Индекс сообщений
* @var array
*/
/**
* Формат перевода строки, для M$ Exchange используется \r\n
*
* @var string
*/
private $newline = "\n " ;
/**
* Конструктор класса
* @param string $host
* @param int $port
* @return object
*/
public function __construct( $host , $port , $user , $pass ) {
$this -> connection = fsockopen ( $host , $port , $errno , $errstr , 30) ; if ( ! $this -> connection ) {
trigger_error ( cms_message( 'CMS' , 'Невозможно установить соединение с POP3 сервером %s (%d)' , $errstr , $errno ) , E_USER_ERROR ) ; }
$greeting = fgets ( $this -> connection , 128) ; $this -> newline = ( stristr ( $greeting , "microsoft" ) ) ? "\r \n " : "\n " ; fputs ( $this -> connection , "user $user " . $this -> newline ) ; fgets ( $this -> connection , 128) ; fputs ( $this -> connection , "pass $pass " . $this -> newline ) ; $pass_check = fgets ( $this -> connection , 128) ;
/**
* Если попыька входа не удалась - выводим ошибку
*/
trigger_error ( cms_message( 'CMS' , 'Невозможно установить соединение с POP3 сервером %s (%d)' , $pass_check , 0) , E_USER_ERROR ) ; }
/**
* Определяем количество и размер писем
*/
fputs ( $this -> connection , "list" . $this -> newline ) ; $stat = '' ;
while ( trim ( $stat ) != "." ) { $stat = fgets ( $this -> connection , 128) ; if ( preg_match ( "/^([0-9]+) ([0-9]+)/" , $stat , $matches ) ) { $this -> stat [ $matches [ 1] ] = $matches [ 2] ;
}
}
}
/**
* Читает сообщение
* @param int $id
* @return mixed
*/
public function retr( $id ) {
if ( ! isset ( $this -> stat [ $id ] ) ) { return false ;
}
fputs ( $this -> connection , "retr $id " . $this -> newline ) ;
return $this -> read ( ) ;
}
/**
* Читает заголовок + верхние n строк сообщения
* @param int $id
* @param int $lines
* @return mixed
*/
public function top( $id , $lines ) {
if ( ! isset ( $this -> stat [ $id ] ) ) { return false ;
}
fputs ( $this -> connection , "top $id $lines " . $this -> newline ) ;
return $this -> read ( ) ;
}
/**
* Читает тело сообщения
* @param void
* @return string
*/
private function read( ) {
do {
$message [ ] = $line = fgets ( $this -> connection ) ; // echo "READLINE: $line\n";
} while ( ( trim ( $line ) != '.' ) ) ;
}
/**
* Удаляет сообщение
* @param int $id
* @return string
*/
public function dele( $id ) {
if ( ! isset ( $this -> stat [ $id ] ) ) { return false ;
}
fputs ( $this -> connection , "dele $id " . $this -> newline ) ; return fgets ( $this -> connection , 128) ; }
/**
* Деструктор класса
* @param void
* @return void
*/
public function __destruct( ) {
fputs ( $this -> connection , "quit" . $this -> newline ) ; }
}
?>
smtp.class.php
CODE (
htmlphp ):
скопировать код в буфер обмена
<? php
/**
* Отправка сообщений по протоколу SMTP
* @package Pilot
* @subpackage CMS
* @version 1.0
*/
/**
* Определение конца строки
*/
/**
* Отправка сообщений по протоколу SMTP
* @package Maillist
* @subpackage CMS
*/
class SMTP {
/**
* Соединение с сервером
* @var resource
*/
private $connection ;
/**
* Включение режима отладки для класса
* @var bool
*/
public $debug = false ;
/**
* Таймаут соединения
* @var int
*/
private $timeout = 5 ;
/**
* Код последнего ответа сервера
* @var string
*/
private $last_code ;
/**
* Текст сообщения последнего ответа сервера
* @var string
*/
private $last_message ;
/**
* Последний ответ сервера
* @var string
*/
private $last_response ;
/**
* Строка приветствия для SMTP
* @var string
*/
private $helo = '' ;
/**
* Конструктор
* @param string $host
* @param int $port
* @param string $login
* @param string $passwd
* @param string $auth_type (plain, login, none)
* @return object
*/
public function __construct( $host , $port , $login , $passwd , $auth_type ) {
$this -> helo = CMS_HOST;
$this -> connection = fsockopen ( $host , $port , $this -> error_num , $this -> error_str , $this -> timeout ) ;
/**
* Чтобы вытащить из буфера начальное приглашение сервера
*/
$this -> readResponse ( ) ;
//return $this->need_auth ? $this->ehlo() : $this->helo();
if ( ! $this -> ehlo ( ) ) {
trigger_error ( cms_message( 'Maillist' , 'Не удаётся послать приветствие почтовому серверу.' ) , E_USER_ERROR ) ; }
// if (preg_match('~^tls://~', $host)) {
// $this->sendData("STARTTLS");
// }
case 'plain' :
$auth_result = $this -> authPlain ( $login , $passwd ) ;
break ;
case 'login' :
$auth_result = $this -> authLogin ( $login , $passwd ) ;
break ;
case 'none' :
$auth_result = true ;
break ;
case '' : // так как указание none в ini файле без кавычек равнозначно пустому значению
$auth_result = true ;
break ;
default :
trigger_error ( cms_message( 'CMS' , 'Неподдерживаемый тип SMTP авторизации: %s' , $auth_type ) , E_USER_ERROR ) ; }
if ( ! $auth_result ) {
trigger_error ( cms_message( 'CMS' , 'Ошибка SMTP авторизации' ) , E_USER_ERROR ) ; }
}
/**
* Login авторизация
* @param $login string
* @param $passwd string
* @return boolean
*/
private function authLogin( $login , $passwd ) {
$this -> sendData ( "AUTH LOGIN" ) ;
if ( $this -> checkError ( '334' ) ) {
return false ;
}
if ( $this -> checkError ( '334' ) ) {
return false ;
}
if ( $this -> checkError ( '235' ) ) {
return false ;
}
return true ;
}
/**
* Простейшая Plain Text авторизация
* @param $login string
* @param $passwd string
* @return boolean
*/
private function authPlain( $login , $passwd ) {
$this -> sendData ( "AUTH PLAIN" ) ;
if ( $this -> checkError ( '334' ) ) {
return false ;
}
if ( $this -> checkError ( '235' ) ) {
return false ;
}
return true ;
}
/**
* Посылает почтовое сообщение
* @param string $from Адрес отправителя
* @param string $to Адрес получателя
* @param array $headers MIME-заголовки
* @param string $body Тело сообщения
* @return bool
*/
public function send( $from , $to , $headers , $body ) {
return false ;
}
if ( strpos ( $from , '<' ) !== false ) { }
if ( strpos ( $to , '<' ) !== false ) { }
// Устанавливаем заголовки для прохождения через SPAM фильтры
if ( ! isset ( $headers [ 'From' ] ) ) { $headers [ 'From' ] = $from ;
}
if ( ! isset ( $headers [ 'Reply-To' ] ) ) { $headers [ 'Reply-To' ] = $from ;
}
if ( ! isset ( $headers [ 'User-Agent' ] ) ) { $headers [ 'User-Agent' ] = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.5b) Gecko/20030827' ;
}
if ( ! isset ( $headers [ 'Content-Type' ] ) ) { $headers [ 'Content-Type' ] = 'text/plain; charset="Windows-1251"' ;
}
if ( ! isset ( $headers [ 'Content-Transfer-Encoding' ] ) ) { $headers [ 'Content-Transfer-Encoding' ] = '8bit' ;
}
if ( ! isset ( $headers [ 'MIME-Version' ] ) ) { $headers [ 'MIME-Version' ] = '1.0' ;
}
if ( ! isset ( $headers [ 'Date' ] ) ) { $headers [ 'Date' ] = date ( 'r' ) ; }
if ( ! isset ( $headers [ 'In-Reply-To' ] ) ) { $host = isset ( $_SERVER [ 'HOSTNAME' ] ) ? $_SERVER [ 'HOSTNAME' ] : CMS_HOST; $headers [ 'In-Reply-To' ] = '<' . Misc:: randomKey ( 20 ) . '.' . time ( ) . '.mail@' . $host . '>' ; }
if ( ! isset ( $headers [ 'To' ] ) ) { $headers [ 'To' ] = $to ;
}
// Разбор заголовков
$tmp_headers = '' ;
while ( list ( $key , $val ) = each ( $headers ) ) { $tmp_headers .= $key . ": " . $val . CRLF;
}
$this -> sendData ( "RSET" ) ;
if ( $this -> checkError ( '250' ) ) {
return false ;
}
$this -> sendData ( "MAIL FROM: <$from >" ) ;
if ( $this -> checkError ( '250' ) ) {
return false ;
}
$this -> sendData ( "RCPT TO: <$to >" ) ;
if ( $this -> checkError ( '250' ) ) {
return false ;
}
$this -> sendData ( "DATA" ) ;
if ( $this -> checkError ( '354' ) ) {
return false ;
}
$this -> sendData ( $tmp_headers . CRLF. $body . CRLF. "." ) ;
if ( $this -> last_code == '250' ) {
return true ;
} else {
return false ;
}
}
/**
* SMTP-Приветствие БЕЗ авторизации
* @param void
* @return boolean
*/
private function helo( ) {
if ( $this -> sendData ( "HELO " . $this -> helo ) && $this -> last_code == '250' ) {
return true ;
}
return false ;
}
/**
* SMTP-Приветствие с авторизацией
* @param void
* @return boolean
*/
private function ehlo( ) {
if ( $this -> sendData ( "EHLO " . $this -> helo ) && $this -> last_code == '250' ) {
return true ;
}
return false ;
}
/**
* Возвращает true, если последняя операция завершилась НЕ с кодом $code
* @param $code string
* @return boolean
*/
private function checkError( $code ) {
if ( $this -> last_code == $code ) {
return false ;
} else {
return true ;
}
}
/**
* Чтение ответа сервера
* @return mixed
*/
private function readResponse( ) {
$return = '' ;
$line = '' ;
$loops = 0 ;
while ( ( strpos ( $return , CRLF) === FALSE || substr ( $line , 3 , 1 ) !== ' ' ) && $loops < 100) { $line = fgets ( $this -> connection , 512) ; $return .= $line ;
$loops ++;
}
if ( $this -> debug ) {
echo "<< $return \n " ;
}
$this -> last_code = substr ( $return , 0, 3) ; $this -> last_message = substr ( $return , 5) ; return $return ;
} else {
return false ;
}
}
/**
* Посылает данные серверу
* @param string $string Строка, посылаемая серверу
* @param boolean $wait_response После отсылки строки прочитать ответ сервера
* @return boolean
*/
private function sendData( $string , $wait_response = true ) {
if ( $this -> debug ) {
echo ">> " . substr ( $string , 0 , 100 ) . "...\n " ; } else {
echo ">> $string \n " ;
}
}
if ( $wait_response ) {
$this -> last_response = $this -> readResponse ( ) ;
}
return true ;
}
return false ;
}
/**
* Возвращает последний ответ SMTP сервера
*
* @return string
*/
public function getLastMessage( ) {
return $this -> last_response ;
}
/**
* Деструктор, завершение соединения
* @param void
* @return void
*/
public function __destruct( ) {
$this -> sendData ( "QUIT" ) ;
}
}
}
control.php
PHP:
скопировать код в буфер обмена
<?PHP
/**
* Управление рассылкой по e-mail
*
* @package Pilot
* @subpackage Maillist
* @version 3.0
* @cron ~/5 * * * *
*/
/**
* Определяем интерфейс
* @ignore
*/
define ( 'CMS_INTERFACE' , 'ADMIN' ) ;
// Устанавливаем правильную рабочую директорию
/**
* Конфигурационный файл
*/
require_once ( '../../config.inc.php' ) ;
$DB = DB:: factory ( 'default' ) ;
// Блокировка паралельного запуска скрипта
Shell:: collision_catcher ( ) ;
/**
* Параметры авторизации, действительны для текущего письма
*/
$auth_email = '' ;
$auth_passwd = '' ;
$query = "select * from cms_mail_account where id='" . MAILLIST_CONTROL_MAIL_ID. "'" ;
$mailserver = $DB -> query_row ( $query ) ;
// Соединяемся с pop3 сервером, переход в состояние TRANSACTION
$POP3 = new POP3( $mailserver [ 'pop3_host' ] , $mailserver [ 'pop3_port' ] , $mailserver [ 'pop3_login' ] , $mailserver [ 'pop3_passwd' ] ) ;
$message_count = count ( $POP3 -> stat ) ;
echo '[i] ' . $message_count . " message(s) in mailbox\n " ;
while ( list ( $message_id , $size ) = each ( $POP3 -> stat ) ) { echo "[i] Parsing message " . $message_id . " of " . $message_count . "\n " ;
if ( $size > MAILLIST_CONTROL_MAX_SIZE) {
//$text = $POP3->top($message_id, 50);
echo "[i] Message size is greater than " . MAILLIST_CONTROL_MAX_SIZE. " byte - skipped\n " ;
continue ;
} else {
$text = $POP3 -> retr ( $message_id ) ;
}
$POP3 -> dele ( $message_id ) ;
$message = Mime:: decode ( $text ) ;
/**
* Не удалось распознать формат сообщения
*/
echo "[e] Message format unrecognized - skipped\n " ;
continue ;
}
/**
* Если в сообщении больше одной части, значит там есть вложения
* (файлы или другие сообщения)
*/
if ( count ( $message ) != 1
) { echo "[i] Message has embedded multipart content - skipped\n " ;
continue ;
}
if ( ! isset ( $message [ 0 ] [ 'body' ] ) ) { echo "[e] Message without body - skipped\n " ;
continue ;
}
if ( ! isset ( $message [ 0 ] [ 'headers' ] [ 'from' ] ) || ! preg_match ( "/([a-z0-9_\.\-]+@[a-z0-9_\.\-]+\.[a-z]{2,4})/i" , $message [ 0 ] [ 'headers' ] [ 'from' ] , $match ) ) { echo "[e] Message without from header - skipped\n " ;
continue ;
} else {
$message_from = $match [ 1] ;
}
$auth_email = '' ;
$auth_passwd = '' ;
$commands = preg_split ( "~[\n \r ]+~" , $message [ 0 ] [ 'body' ] , - 1
, PREG_SPLIT_NO_EMPTY
) ;
$TmplReport = new TemplateDB( 'cms_mail_template' , 'maillist' , 'control_report' ) ;
execute_command( $row , $message_from ) ;
}
/**
* Отсылаем пользователю отчет о выполнении команд
*/
$Sendmail = new Sendmail
( MAILLIST_CONTROL_MAIL_ID
, 'Отчет по выполнению Вашего запроса' , nl2br ( $TmplReport -> display ( ) ) ) ;
$random_seed = Misc:: randomKey ( 32) ;
$Sendmail -> attach ( "/tmp/$random_seed .eml" , 'your-request.eml' ) ;
unlink ( "/tmp/$random_seed .eml" ) ; $Sendmail -> send ( $message_from , true ) ;
echo "[i] Report sent to $message_from \n " ;
}
/**
* Функция выполняется для каждой строки входящего письма
* @param string $command
* @param string $message_from
*/
function execute_command( $command , $message_from ) {
global $DB , $auth_email , $auth_passwd ;
echo "[cmd] $command \n " ;
$command = trim ( $command ) ;
/**
* Запрос списка команд, поддерживаемых системой
*/
$Template = new TemplateDB( 'cms_mail_template' , 'maillist' , 'control_help' ) ;
$Sendmail = new Sendmail
( MAILLIST_CONTROL_MAIL_ID
, 'Помощь по использованию рассылок на ' . CMS_HOST
, nl2br ( $Template -> display ( ) ) ) ; $Sendmail -> send ( $message_from , true ) ;
echo "[cmd] Help message sent to $message_from \n " ;
iterate_report( $command , 'OK' ) ;
} elseif ( strtolower ( $command ) == 'remind_password' ) { /**
* Напоминание пароля
*/
$user = $DB -> query_row ( "SELECT * FROM auth_user WHERE email = '$message_from '" ) ;
if ( $DB -> rows == 1) {
$Template = new TemplateDB( 'cms_mail_template' , 'cms' , 'amnesia' ) ;
$Template -> set ( $user ) ;
$Sendmail = new Sendmail
( MAILLIST_CONTROL_MAIL_ID
, 'Напоминание пароля на ' . CMS_HOST
, nl2br ( $Template -> display ( ) ) ) ; $Sendmail -> send ( $message_from , true ) ;
echo "[cmd] Reminder message sent to $message_from \n " ;
iterate_report( $command , 'OK' ) ;
}
/**
* Список всех доступных рассылок
*/
$query = "SELECT * FROM maillist_category WHERE private != 'true'" ;
$lists = $DB -> query ( $query ) ;
$Template = new TemplateDB( 'cms_mail_template' , 'maillist' , 'control_list' ) ;
$Template -> iterate ( '/list/' , null , $row ) ;
}
$Sendmail = new Sendmail
( MAILLIST_CONTROL_MAIL_ID
, 'Список рассылок на ' . CMS_HOST
, nl2br ( $Template -> display ( ) ) ) ; $Sendmail -> send ( $message_from , true ) ;
iterate_report( $command , 'OK' ) ;
} elseif ( strtolower ( $command ) == 'subscribed_list' ) { /**
* Получение списка рассылок, на которые подписан пользователь. Требует авторизации
*/
if ( ! check_auth( $error , $user ) ) {
return iterate_report( $command , "Ошибка авторизации: $error " ) ;
}
$query = "
SELECT tb_category.*
FROM maillist_user_category AS tb_rel
INNER JOIN maillist_category AS tb_category
ON tb_rel.category_id = tb_category.id
WHERE tb_rel.user_id = '$user[id] '
" ;
$lists = $DB -> query ( $query ) ;
$Template = new TemplateDB( 'cms_mail_template' , 'maillist' , 'control_subscribed_list' ) ;
$Template -> iterate ( '/list/' , null , $row ) ;
}
$Sendmail = new Sendmail
( MAILLIST_CONTROL_MAIL_ID
, 'Список рассылок на ' . CMS_HOST
. ', на которые Вы подписаны' , nl2br ( $Template -> display ( ) ) ) ; $Sendmail -> send ( $message_from , true ) ;
iterate_report( $command , 'OK' ) ;
} elseif ( preg_match ( "~^pause\s+([0-9]+)$~i" , $command , $match ) ) { /**
* Добавление в стоп-лист на N дней. Требует авторизации
*/
if ( ! check_auth( $error , $user ) ) {
return iterate_report( $command , "Ошибка авторизации: $error " ) ;
}
/**
* Ставим в стоп-лист так, чтобы пользователь разблокировался через N дней
*/
$query = "REPLACE INTO maillist_stoplist SET id = '$user[id] ', `date` = NOW() + INTERVAL " . intval ( $match [ 1 ] * 86400 - MAILLIST_STOPLIST_DURATION
) . " SECOND" ; $DB -> insert ( $query ) ;
iterate_report( $command , "OK. Письма на Ваш адрес не будут приходить в течении $match[1] дней" ) ;
} elseif ( preg_match ( "~^subscribe\s+(.+)$~i" , $command , $match ) ) { /**
* Подписка на рассылку. Требует авторизации
*/
if ( ! check_auth( $error , $user ) ) {
return iterate_report( $command , "Ошибка авторизации: $error " ) ;
}
$query = "SELECT * FROM maillist_category WHERE uniq_name = '" . $DB -> escape ( $match [ 1 ] ) . "'" ;
$list = $DB -> query_row ( $query ) ;
if ( $DB -> rows == 0) {
iterate_report( $command , "Рассылка с кодом $match[1] не найдена" ) ;
} else {
$DB -> insert ( "INSERT IGNORE INTO maillist_user_category SET user_id = '$user[id] ', category_id = '$list[id] '" ) ;
iterate_report( $command , "OK. Вы подписаны на рассылку '$list[name_ru] '" ) ;
}
} elseif ( preg_match ( "~^unsubscribe\s+(.+)$~i" , $command , $match ) ) { /**
* Отписаться от рассылки. Требует авторизации
*/
if ( ! check_auth( $error , $user ) ) {
return iterate_report( $command , "Ошибка авторизации: $error " ) ;
}
$query = "SELECT * FROM maillist_category WHERE uniq_name = '" . $DB -> escape ( $match [ 1 ] ) . "'" ;
$list = $DB -> query_row ( $query ) ;
if ( $DB -> rows == 0) {
iterate_report( $command , "Рассылка с кодом $match[1] не найдена" ) ;
} else {
$DB -> insert ( "DELETE FROM maillist_user_category WHERE user_id = '$user[id] ' AND category_id = '$list[id] '" ) ;
iterate_report( $command , "OK. Вы отписаны от рассылки '$list[name_ru] '" ) ;
}
} elseif ( preg_match ( "/^email:\s+([a-z0-9\-\_\.]+@[a-z0-9\-\_\.]+\.[a-z]{1,4})$/i" , $command , $match ) ) { /**
* Пользователь указывает свой e-mail для подписки или отписки от рассылки
*/
$auth_email = $match [ 1] ;
iterate_report( $command , 'OK' ) ;
} elseif ( preg_match ( "/^passwd:\s+([a-zA-Z0-9_+!@#$%^&*~\(\)\-]{1,20})$/i" , $command , $match ) ) { /**
* Пользователь указывает свой пароль для подписки или отписки от рассылки
*/
$auth_passwd = $match [ 1] ;
iterate_report( $command , 'OK' ) ;
} else {
echo "[cmd] unknown command\n " ;
iterate_report( $command , 'Неизвестная команда или ошибка синтаксиса' ) ;
}
}
/**
* Отчет о выполнении команды
*
* @param string $command
* @param string $result
*/
function iterate_report( $command , $result ) {
global $TmplReport ;
if ( $TmplReport instanceof Template) {
$TmplReport -> iterate ( '/command/' , null , array ( 'command' => $command , 'result' => $result ) ) ; }
}
/**
* Проверка авторизации для команд, которые этого требуют
* @param string $error
* @return bool
*/
function check_auth( & $error , & $user ) {
global $DB , $auth_email , $auth_passwd ;
if ( empty ( $auth_email ) ) { $error = 'Не указан e-mail. Используйте команду email: your@mail.box или help для получения справки' ;
return false ;
} elseif ( empty ( $auth_passwd ) ) { $error = 'Не указан пароль. Используйте команду passwd: ваш_пароль или help для получения справки' ;
return false ;
} else {
$query = "SELECT id, passwd FROM auth_user WHERE email = '$auth_email '" ;
$user = $DB -> query_row ( $query ) ;
if ( $DB -> rows == 0) {
$error = "Пользователь с адресом $auth_email не существует" ;
return false ;
} elseif ( $auth_passwd != $user [ 'passwd' ] ) {
$error = "Неправильно указан пароль" ;
return false ;
}
}
return true ;
}
?>
maillist.php
PHP:
скопировать код в буфер обмена
<?PHP
/**
* Рассылка почты
*
* @package Pilot
* @subpackage Maillist
* @version 4.0
*
* @cron ~/15 * * * *
*/
define ( 'CMS_INTERFACE' , 'ADMIN' ) ;
require_once ( '../../config.inc.php' ) ;
$DB = DB:: factory ( 'default' ) ;
// Блокировка паралельного запуска скрипта
Shell:: collision_catcher ( ) ;
/**
* Ставим в очередь письма, которые выполняются по расписанию
*/
$task = $DB -> query ( "
select id, message_id, `repeat` from maillist_task
where _next < now() and (date_to > current_date() or date_to is null)
" ) ;
$amount = Maillist:: queue ( $row [ 'message_id' ] , false ) ;
/**
* Сохраняем информацию в логе
*/
$DB -> insert ( "insert into maillist_task_log (task_id, amount) values ('$row[id] ', '$amount ')" ) ;
/**
* Определяем следующую дату выполнения задачи
*/
$next = "NULL" ;
if ( $row [ 'repeat' ] == 'hourly' ) {
$next = "_next + INTERVAL 1 HOUR" ;
} elseif ( $row [ 'repeat' ] == 'daily' ) {
$next = "_next + INTERVAL 1 DAY" ;
} elseif ( $row [ 'repeat' ] == 'weekly' ) {
$next = "_next + INTERVAL 1 WEEK" ;
} elseif ( $row [ 'repeat' ] == 'monthly' ) {
$next = "_next + INTERVAL 1 MONTH" ;
} elseif ( $row [ 'repeat' ] == 'yearly' ) {
$next = "_next + INTERVAL 1 YEAR" ;
}
$DB -> update ( "update maillist_task set _next=$next where id='$row[id] '" ) ;
}
$DB -> delete ( "delete from maillist_task_log where tstamp < now() - interval 1 month" ) ;
}
$mailserver = $DB -> query_row ( "select * from cms_mail_account where id='" . MAILLIST_MAIL_ID. "'" ) ;
$stoplist = $DB -> result ( "select sender_email from cms_mail_account where id='" . MAILLIST_STOPLIST_MAIL_ID. "'" ) ;
$SMTP = new SMTP( $mailserver [ 'smtp_host' ] , $mailserver [ 'smtp_port' ] , $mailserver [ 'smtp_login' ] , $mailserver [ 'smtp_password' ] , $mailserver [ 'smtp_auth' ] ) ;
echo "[i] Starting " . date ( 'Y-m-d H:i:s' ) . "\n " ; $messages = $DB -> query ( "SELECT message_id FROM maillist_queue WHERE delivery='wait'" , 'message_id' ) ;
while ( list ( $message_id , ) = each ( $messages ) ) {
if ( CVS:: isLocked ( 'maillist_message' , $message_id ) ) {
echo "[e] Message #$message_id locked by another user.\n " ;
continue ;
}
$Maillist = new Maillist( $message_id ) ;
if ( strlen ( $Maillist -> content ) < 100
) { echo "[e] Please create message\n " ;
continue ;
}
/**
* Обрамляем текст сообщения шаблоном
*/
$Template = new TemplateDB( 'cms_mail_template' , 'maillist' , 'message' ) ;
/**
* Отправка сообщений
*/
$emails = $Maillist -> getQueue ( ) ;
$total_rows = count ( $emails ) ;
while ( list ( $counter , $rcpt ) = each ( $emails ) ) { echo "[i][$counter /$total_rows ] Sending mail to $rcpt[email] ... " ;
$TmplContent = new TemplateString( $Maillist -> content ) ;
if ( ! empty ( $rcpt [ 'param' ] ) ) { $TmplContent -> set ( $param ) ;
}
$Template -> set ( 'content' , $TmplContent -> display ( ) ) ;
$Sendmail = new Sendmail( MAILLIST_MAIL_ID, $Maillist -> subject , $Template -> display ( ) ) ;
$Sendmail -> addHeaders ( array ( 'From' => $Maillist -> from ,
'Errors-To' => $stoplist ,
'Reply-To' => $Maillist -> reply_to ,
'Precedence' => 'bulk'
) ) ;
$attach = $Maillist -> getAttachments ( ) ;
$Sendmail -> attach ( $row [ 'file' ] , $row [ 'name' ] ) ;
}
$result = $Sendmail -> send ( $rcpt [ 'email' ] , true ) ;
echo "$result[delivery] \n " ;
if ( ! in_array ( $result [ 'delivery' ] , array ( 'error' , 'wait' , 'ok' ) ) ) { $result [ 'delivery' ] = 'error' ;
}
$DB -> update ( "
UPDATE maillist_queue SET delivery='$result[delivery] '
WHERE message_id='$rcpt[message_id] ' AND email='$rcpt[email] '
" ) ;
}
}
echo "[i] Finish " . date ( 'Y-m-d H:i:s' ) . "\n " ;
(Добавление)
pop3parser.php
PHP:
скопировать код в буфер обмена
<?PHP
/**
* Прасер сообщений с рассылкой, присылаемых по почте
*
* @package Pilot
* @subpackage Maillist
* @version 3.0
* @cron ~/5 * * * *
*/
/**
* Определяем интерфейс
* @ignore
*/
define ( 'CMS_INTERFACE' , 'ADMIN' ) ;
// Устанавливаем правильную рабочую директорию
/**
* Конфигурационный файл
*/
require_once ( '../../config.inc.php' ) ;
$DB = DB:: factory ( 'default' ) ;
/**
* Блокировка паралельного запуска скрипта
*/
Shell:: collision_catcher ( ) ;
$query = "select * from cms_mail_account where id='" . MAILLIST_PARSER_MAIL_ID. "'" ;
$mailserver = $DB -> query_row ( $query ) ;
// Соединяемся с pop3 сервером, переход в состояние TRANSACTION
$POP3 = new POP3( $mailserver [ 'pop3_host' ] , $mailserver [ 'pop3_port' ] , $mailserver [ 'pop3_login' ] , $mailserver [ 'pop3_password' ] ) ;
$message_count = count ( $POP3 -> stat ) ;
echo '[i] ' . $message_count . " message(s) in mailbox\n " ;
while ( list ( $message_id , $size ) = each ( $POP3 -> stat ) ) {
echo "[i] Parsing message " . $message_id . " of " . $message_count . "\n " ;
if ( $size > MAILLIST_PARSER_MAX_SIZE) {
$text = $POP3 -> top ( $message_id , 50) ;
} else {
$text = $POP3 -> retr ( $message_id ) ;
}
// $POP3->dele($message_id);
/**
* Сохраняем письмо в логе
*/
if ( ! is_dir ( LOGS_ROOT
. 'pop3parser/' ) ) { mkdir ( LOGS_ROOT
. 'pop3parser/' , 0755
, true ) ; }
if ( ! $message_parts = split_multipart( $text ) ) {
echo "[e] Message parsing error\n " ;
continue ;
}
$top_headers = $message_parts [ 0 ] [ 'headers' ] ;
/**
* Вырезаем поле From
*/
if ( ! set_and_match( "/([a-z0-9_\.\-]+@[a-z0-9_\.\-]+\.[a-z]{2,4})/i" , $top_headers [ 'from' ] , $match ) ) {
echo "[e] == From header not found. Message skipped.\n " ;
continue ;
} else {
$message_from = $match [ 1] ;
}
/**
* Разрешено ли парсить сообщения, пришедшие с этого адреса
*/
$allow_from = preg_split ( "/[\s\t ,]/" , MAILLIST_PARSER_ALLOW_FROM
, - 1
, PREG_SPLIT_NO_EMPTY
) ;
if ( MAILLIST_PARSER_ALLOW_FROM
!= '' && ! in_array ( $message_from , $allow_from ) ) { $Template = new Template( SITE_ROOT. 'templates/maillist/parser_access_denied' ) ;
if ( isset ( $top_headers [ 'subject' ] ) ) { $Template -> set ( 'subject' , $top_headers [ 'subject' ] ) ;
} else {
$Template -> set ( 'subject' , 'Без темы' ) ;
}
$Sendmail = new Sendmail( CMS_MAIL_ID, 'Access denied' , $Template -> display ( ) ) ;
$Sendmail -> send ( $message_from ) ;
echo "[w] Message from $message_from : access denied\n " ;
continue ;
}
/**
* Если размер сообщения превышает лимит - игнорировать сообщение и
* послать уведомление автору
*/
if ( $size > MAILLIST_PARSER_MAX_SIZE) {
$Template = new TemplateDB( 'cms_mail_template' , 'maillist' , 'parser_max_size' ) ;
if ( isset ( $top_headers [ 'subject' ] ) ) { $Template -> set ( 'subject' , $top_headers [ 'subject' ] ) ;
} else {
$Template -> set ( 'subject' , 'Без темы' ) ;
}
$Sendmail = new Sendmail( CMS_MAIL_ID, 'Max message size exceeded' , $Template -> display ( ) ) ;
$Sendmail -> send ( $message_from ) ;
echo "[w] Maximum message size exceeded in message from $message_from \n " ;
continue ;
}
/**
* Определение заголовка сообщения
*/
if ( isset ( $top_headers [ 'subject' ] ) ) { echo "[i] == Subject: " . iconv ( LANGUAGE_CHARSET
, CMS_SHELL_CHARSET
. '//IGNORE' , $top_headers [ 'subject' ] ) . "\n " ; } else {
echo "[e] Subject header not found\n " ;
// x($text);
continue ;
}
$query = "
INSERT INTO maillist_message
SET
subject = '" . $top_headers [ 'subject' ] . "',
editable = 'true',
reply_to = '$message_from '
" ;
$db_message_id = $DB -> insert ( $query ) ;
/**
* Разнос сообщений по группам
*/
if ( isset ( $top_headers [ 'subject' ] ) && preg_match ( "/^{([^\}]+)}/" , trim ( $top_headers [ 'subject' ] ) , $matches ) ) { $top_headers [ 'subject' ] = trim ( substr ( $top_headers [ 'subject' ] , strpos ( $top_headers [ 'subject' ] , '}' ) + 1
) ) ; $query = "
INSERT INTO maillist_message_category (message_id, category_id)
SELECT '$db_message_id ' AS message_id, id AS category_id
FROM maillist_category
WHERE LOWER(uniq_name) IN ('" . implode ( "','" , $category ) . "') " ;
$DB -> insert ( $query ) ;
// Обновляем заголовок
$query = "UPDATE maillist_message SET subject='" . $top_headers [ 'subject' ] . "' WHERE id='$db_message_id '" ;
$DB -> update ( $query ) ;
} else {
// Если пользователь не указал группы на которые необходимо рассылать
// то добавляем письмо во все группы
$query = "
INSERT INTO maillist_message_category (message_id, category_id)
SELECT '$db_message_id ' AS message_id, id AS category_id
FROM maillist_category
" ;
$DB -> insert ( $query ) ;
}
/**
* Обработка частей сообщения
*/
$embed_counter = 0 ;
$message_text = '' ;
while ( list ( $index , $row ) = each ( $message_parts ) ) { if ( $row [ 'meta' ] [ 'type' ] == 'attachment' ) {
/**
* Эта часть сообщения - аттач
*/
echo "[i] == Attachment found\n " ;
$query = "
INSERT INTO maillist_attachment
SET
message_id = '$db_message_id ',
name = '" . basename ( $row [ 'meta' ] [ 'filename' ] , '.' . $row [ 'meta' ] [ 'extension' ] ) . "', file = '" . $row [ 'meta' ] [ 'extension' ] . "'
" ;
$attach_id = $DB -> insert ( $query ) ;
$filename = Uploads:: getFile ( 'maillist_attachment' , 'file' , $attach_id , $row [ 'meta' ] [ 'extension' ] ) ;
}
} elseif ( $row [ 'meta' ] [ 'type' ] == 'embed' ) {
/**
* Это встроенный в HTML файл (рисунок, звук, etc)
*/
echo "[i] == Embeded file found\n " ;
$file = 'maillist_message/' . LANGUAGE_CURRENT
. '/' . Uploads
:: getIdFileDir ( $db_message_id ) . '/' . sprintf ( '%02d' , $embed_counter ) . '.' . $row [ 'meta' ] [ 'extension' ] ; $filename = UPLOADS_ROOT. $file ;
}
$replacements [ 'cid:' . $row [ 'meta' ] [ 'cid' ] ] = '/' . UPLOADS_DIR. $file ;
$embed_counter ++;
} elseif ( $row [ 'meta' ] [ 'type' ] == 'text' ) {
$message_text = $row [ 'body' ] ;
}
}
/**
* Записываем в файл текст сообщения (после замены в нем CID'ов на имена файлов)
*/
// нам необходимо только тело сообщения, без заголовков
$message_text = preg_replace ( "~^.+</HEAD>.+<BODY[^>]*>~ismU" , '' , $message_text ) ; $message_text = preg_replace ( "/<\/body>.*$/i" , '' , $message_text ) ;
$query = "update maillist_message set content='" . addcslashes ( $message_text , "'" ) . "' where id='$db_message_id '" ; $DB -> update ( $query ) ;
}
// Переходим в состояние UPDATE
/**
* Проверяет, существует ли переменная и соответствует ли она шаблону
*
* @param string $pattern
* @param string $subject
* @param array $match
* @return bool
*/
function set_and_match( $pattern , & $subject , & $match = null ) {
return true ;
}
return false ;
}
/**
* Поскольку рассылка проводится в HTML формате, необходимо превратить текст
* в HTML, чтобы он выглядел как в письме
*
* @param string $text
* @return string
*/
function text2html( $text ) {
/**
* 1. Преобразуем переводы строк в <br>
*/
$result = preg_replace ( "/(\r \n |\r |\n )/" , "<br />\n " , $text ) ; return $result ;
}
/**
* Разбивает текст multipart сообщения на части,
* производит обработку частей (декодирование base64, quoted-printable, перевод текста в кодировку сайта)
*
* @param string $text
* @return array
*/
function split_multipart( $text ) {
$message_parts = array ( ) ;
/**
* Отделяем заголовки сообщения от тела
*/
if ( count ( $splitted ) != 2
) { echo "[e] Can't detect headers delimiter!\n " ;
// x($text);
return false ;
}
if ( set_and_match( '/multipart.*boundary=\"(.*)\"/iU' , $splitted [ 0 ] [ 'content-type' ] , $match ) ) {
// Это текст multipart сообщения - разбить его на части
echo "[i] == Multipart message. Boundary = " . $match [ 1 ] . "\n " ;
echo "BOUNDARY: $match[1] " ;
}
/**
* Убираем top-level заголовок, чтобы предотвратить зацикливание,
* предварительно сохранив их в первом элементе возвращаемого массива
*/
$message_parts [ 0
] = array ( 'headers' => $splitted [ 0 ] , 'meta' => array ( 'type' => 'multipart' ) ) ;
$splitted = split_multipart( $row ) ;
echo "[e] Can't split multipart message!\n " ;
// x($text);
// x($splitted);
return false ;
}
$message_parts [ ] = $row2 ;
}
}
} else {
// Это заголовки и содержимое файла
$splitted_part = preg_split ( "/\r \n \r \n /" , $text , 2
) ; if ( count ( $splitted_part ) == 2
) {
/**
* Декодирование quoted-printable или base64, если такое присутствует
*/
if ( set_and_match( '/(quoted-printable|base64)/i' , $this_part [ 'headers' ] [ 'content-transfer-encoding' ] , $match ) ) {
if ( $match [ 1 ] == 'base64' ) {
echo "[i] == Base64 encoded file\n " ;
} elseif ( $match [ 1 ] == 'quoted-printable' ) {
echo "[i] == Quoted-printable text\n " ;
}
}
/**
* Исправление глюка с MS Word текстами - замена длинного тире на знак минуса
*/
if ( set_and_match( '/text\/html/i' , $this_part [ 'headers' ] [ 'content-type' ] ) ) {
}
/**
* Перевод в кодировку сайта, если в заголовке указана кодировка сообщения
*/
if ( set_and_match( '/charset=\"?([^\s\"]+)/i' , $this_part [ 'headers' ] [ 'content-type' ] , $match ) ) {
echo "[i] == Charset detected: " . $match [ 1 ] . "\n " ;
$this_part [ 'body' ] = iconv ( $match [ 1 ] , LANGUAGE_CHARSET
. '//IGNORE' , $this_part [ 'body' ] ) ;
// В контенте может быть заголовок <meta http-equiv=Content-Type content="text/html; charset=koi8-r">, в него надо вставить правильную кодировку
} elseif ( set_and_match( '/text\//i' , $this_part [ 'headers' ] [ 'content-type' ] ) ) {
$charset = Charset:: detectCyrCharset ( $this_part [ 'body' ] ) ;
echo "[i] == Charset GUESSED: $charset \n " ;
$this_part [ 'body' ] = iconv ( $charset , LANGUAGE_CHARSET
. '//IGNORE' , $this_part [ 'body' ] ) ; }
/**
* Определение типа части - это аттач, встроенный в HTML файл или текст
*/
if ( set_and_match( '/attachment;\s+filename=\"(.*)\"/i' , $this_part [ 'headers' ] [ 'content-disposition' ] , $match ) ) {
$this_part [ 'meta' ] [ 'type' ] = 'attachment' ;
$this_part [ 'meta' ] [ 'filename' ] = $match [ 1] ;
$this_part [ 'meta' ] [ 'extension' ] = Uploads:: getFileExtension ( $this_part [ 'meta' ] [ 'filename' ] ) ;
} elseif ( set_and_match( '/\<(.*)\>/i' , $this_part [ 'headers' ] [ 'content-id' ] , $match ) && set_and_match( '/name=\"(.*)\"/i' , $this_part [ 'headers' ] [ 'content-type' ] , $match2 ) ) {
$this_part [ 'meta' ] [ 'type' ] = 'embed' ;
$this_part [ 'meta' ] [ 'filename' ] = $match2 [ 1] ;
$this_part [ 'meta' ] [ 'extension' ] = Uploads:: getFileExtension ( $this_part [ 'meta' ] [ 'filename' ] ) ;
$this_part [ 'meta' ] [ 'cid' ] = $match [ 1] ;
} elseif ( set_and_match( '/text\//i' , $this_part [ 'headers' ] [ 'content-type' ] ) ) {
/**
* Исправление глюка MS Word
*/
$this_part [ 'meta' ] [ 'type' ] = 'text' ;
} else {
$this_part [ 'meta' ] [ 'type' ] = 'undefined' ;
}
/**
* Преобразование текста в HTML
*/
if ( set_and_match( '/text\/plain/i' , $this_part [ 'headers' ] [ 'content-type' ] ) ) {
$this_part [ 'body' ] = text2html( $this_part [ 'body' ] ) ;
}
$message_parts [ ] = $this_part ;
}
}
if ( count ( $message_parts ) == 0
) { return false ;
} else {
return $message_parts ;
}
}
?>
stoplist.php
PHP:
скопировать код в буфер обмена
<?PHP
/**
* Обработка писем, которые не доставлены адресатам
*
* @package Pilot
* @subpackage Maillist
* @version 3.0
* @cron 33 ~/4 * * *
*/
/**
* Определяем интерфейс
* @ignore
*/
define ( 'CMS_INTERFACE' , 'ADMIN' ) ;
// Устанавливаем правильную рабочую директорию
/**
* Конфигурационный файл
*/
require_once ( '../../config.inc.php' ) ;
$DB = DB:: factory ( 'default' ) ;
/**
* Блокировка паралельного запуска скрипта
*/
Shell:: collision_catcher ( ) ;
/**
* Периодическая чистка стоплиста
*/
$query = "DELETE FROM maillist_stoplist WHERE dtime < NOW() - INTERVAL " . MAILLIST_STOPLIST_DURATION. " SECOND" ;
$DB -> delete ( $query ) ;
}
/**
* Определяем слова, которые должны встречаться в тексте для того, что б система
* обрабатывала письма добавляя их в стоп лист. Все письма со словами, которые
* не встречаются в этом списке буду т игнорироваться
*/
$accept_words = preg_split ( "/\s*,\s*/" , MAILLIST_STOPLIST_ACCEPT_WORDS
, - 1
, PREG_SPLIT_NO_EMPTY
) ;
$query = "select * from cms_mail_account where id='" . MAILLIST_MAIL_ID. "'" ;
$mailserver = $DB -> query_row ( $query ) ;
/**
* Соединяемся с POP3 сервером
*/
$POP3 = new POP3( $mailserver [ 'pop3_host' ] , $mailserver [ 'pop3_port' ] , $mailserver [ 'pop3_login' ] , $mailserver [ 'pop3_password' ] ) ;
echo '[i] ' . count ( $POP3 -> stat ) . " message(s) in mailbox\n " ; while ( list ( $message_id , $size ) = each ( $POP3 -> stat ) ) { echo "\n [i] Parsing message " . $message_id . " of " . count ( $POP3 -> stat ) . "\n " ; if ( $size > 1000000) {
echo "[i] Message size $size , skip\n " ;
// $POP3->dele($message_id);
continue ;
}
$text = $POP3 -> retr ( $message_id ) ;
// Очистить сообщение от заголовков и вложенных сообщений, так как
// они могут содержать адреса в заголовках From, Reply-To etc.
$text = message_cleanup( $text ) ;
// Проверяем слова, которые содержатся в письмах, сгенерированных почтовыми роботами
$accepted = false ;
while ( list ( , $word ) = each ( $accept_words ) ) { $accepted = true ;
continue ;
}
}
if ( ! $accepted && ! empty ( $accept_words ) ) { echo "[i] not accepted\n " ;
$POP3 -> dele ( $message_id ) ;
continue ;
}
if ( ! preg_match_all ( "/[a-z0-9_\.\-]+@[a-z0-9_\.\-]+\.[a-z]{2,4}/i" , $text , $matches ) ) { echo "[i] skipped\n " ;
$POP3 -> dele ( $message_id ) ;
continue ;
}
echo "[i] " . count ( $matches [ 0 ] ) . " e-mail found ... \n " ; // Ставим в стоплист сообщения, которые вернули ошибку
if ( count ( $matches [ 0
] ) > 0
) { while ( list ( , $email ) = each ( $matches [ 0
] ) ) { $insert [ ] = "('$email ', '" . $DB -> escape ( $text ) . "')" ;
}
$query = "INSERT INTO maillist_stoplist (email, message) VALUES " . implode ( "," , $insert ) ; $DB -> insert ( $query ) ;
echo "[i] " . $DB -> affected_rows . " e-mail added to stoplist\n " ;
}
/**
* Удаляем обработанное сообщение
*/
$POP3 -> dele ( $message_id ) ;
}
/**
* Очистка текста письма от заголовков и вложений, в том числе
* вложенных сообщений
*
* @param string $message_text
* @return string
*/
function message_cleanup( $message_text ) {
$parts = preg_split ( "/\r \n \r \n /" , $message_text , 2
) ;
/**
* Это не почтовое сообщение - возвращаем неизмененным
*/
if ( count ( $parts ) != 2
) { return $message_text ;
}
if ( isset ( $parts [ 0 ] [ 'content-type' ] ) && preg_match ( '/multipart.*boundary=\"(.*)\"/i' , $parts [ 0 ] [ 'content-type' ] , $match ) ) { $result = '' ;
echo "[i] == Multipart message. Boundary = " . $match [ 1 ] . "\n " ;
/**
* Отделяем заголовки от тела, если неудачно - игнорируем эту часть
*/
if ( count ( $splitted ) != 2
) { continue ;
}
/**
* Если тип части - text/*, то добавляем содержимое части к результату
* В другом случае (аттач, рисунокб сообщение) - игнорируем
*/
if ( isset ( $this_part [ 'headers' ] [ 'content-type' ] ) && preg_match ( '/text\//i' , $this_part [ 'headers' ] [ 'content-type' ] ) ) { $result .= $this_part [ 'body' ] . "\n " ;
}
}
return $result ;
} else {
/**
* Это не multipart сообщение - возвращаем его текст (без заголовков)
*/
return $parts [ 1] ;
}
}
?>
(Добавление)
Вот все что нашло по ключевому слову Sendmail, если где-то есть зацепка, то я выложу тот код. Еще раз спасибо.
CODE (
htmlphp ):
скопировать код в буфер обмена
Search "Sendmail" ( 99 hits in 25 files)
\
system \actions\admin\shop\send_confirm_order
. act
. php
( 3 hits
) Line 62: $Sendmail = new Sendmail( CMS_MAIL_ID, 'Подтверждение заказ на сайте' , $Template -> display ( ) ) ;
Line 62: $Sendmail = new Sendmail( CMS_MAIL_ID, 'Подтверждение заказ на сайте' , $Template -> display ( ) ) ;
Line 63
: $Sendmail -> send ( trim ( $order [ 'email' ] ) , true ) ; \
system \actions\site\cms\amnesia
. act
. php
( 3 hits
) Line 50: $Sendmail = new Sendmail( CMS_MAIL_ID, cms_message( 'CMS' , 'Восстановление пароля - ' . CMS_HOST) , $Template -> display ( ) ) ;
Line 50: $Sendmail = new Sendmail( CMS_MAIL_ID, cms_message( 'CMS' , 'Восстановление пароля - ' . CMS_HOST) , $Template -> display ( ) ) ;
Line 51: $Sendmail -> send ( $data [ 'email' ] , true ) ;
\
system \actions\site\cms\find_error
. act
. php
( 3 hits
) Line 26: $Sendmail = new Sendmail( CMS_MAIL_ID, 'Найдена новая ошибка на сайте' , $Template -> display ( ) ) ;
Line 26: $Sendmail = new Sendmail( CMS_MAIL_ID, 'Найдена новая ошибка на сайте' , $Template -> display ( ) ) ;
Line 27
: $Sendmail -> send ( trim ( $email ) , true ) ; \
system \actions\site\comment\add
. act
. php
( 3 hits
) Line 71: $Sendmail = new Sendmail( CMS_MAIL_ID, $Template -> title , $message ) ;
Line 71: $Sendmail = new Sendmail( CMS_MAIL_ID, $Template -> title , $message ) ;
Line 72: $Sendmail -> send ( $email ) ;
\
system \actions\site\faq\question
. act
. php
( 3 hits
) Line 52: $Sendmail = new Sendmail( CMS_MAIL_ID, cms_message( 'FAQ' , 'Часто задаваемый вопрос' ) , $Template -> display ( ) ) ;
Line 52: $Sendmail = new Sendmail( CMS_MAIL_ID, cms_message( 'FAQ' , 'Часто задаваемый вопрос' ) , $Template -> display ( ) ) ;
Line 53: $Sendmail -> send ( CMS_NOTIFY_EMAIL) ;
\
system \actions\site\form\order
. act
. php
( 6 hits
) Line 89: $Sendmail = new Sendmail( SHOPORDER_MAIL_ID_SEND_ADMIN, 'Сформирован новый заказ на сайте' , $Template -> display ( ) ) ;
Line 89: $Sendmail = new Sendmail( SHOPORDER_MAIL_ID_SEND_ADMIN, 'Сформирован новый заказ на сайте' , $Template -> display ( ) ) ;
Line 90
: $Sendmail -> send ( trim ( $email ) ) ; Line 95: $Sendmail = new Sendmail( SHOPORDER_MAIL_ID_SEND_CLIENT, 'Благодарим Вас за то, что стали нашим клиентом' , $TemplateComplete -> display ( ) ) ;
Line 95: $Sendmail = new Sendmail( SHOPORDER_MAIL_ID_SEND_CLIENT, 'Благодарим Вас за то, что стали нашим клиентом' , $TemplateComplete -> display ( ) ) ;
Line 96
: $Sendmail -> send ( trim ( $form_data [ 'email' ] ) , true ) ; \
system \actions\site\form\send
. act
. php
( 7 hits
) Line 90: $Sendmail = new Sendmail( CMS_MAIL_ID, $Form -> title , $content ) ;
Line 90: $Sendmail = new Sendmail( CMS_MAIL_ID, $Form -> title , $content ) ;
Line 93: $Sendmail -> attach ( $row ) ;
Line 95: $Sendmail -> send ( $email , true ) ;
Line 108: $Sendmail = new Sendmail( $from , 'Ваша заявка принята' , $form_reply [ 'autoreply' ] ) ;
Line 108: $Sendmail = new Sendmail( $from , 'Ваша заявка принята' , $form_reply [ 'autoreply' ] ) ;
Line 109: $Sendmail -> send ( $form_data [ 'email' ] , true ) ;
\
system \actions\site\shop\book_product
. act
. php
( 6 hits
) Line 38: $Sendmail = new Sendmail( CMS_MAIL_ID, '«аказано уведоление о наличии' , $Template -> display ( ) ) ;
Line 38: $Sendmail = new Sendmail( CMS_MAIL_ID, '«аказано уведоление о наличии' , $Template -> display ( ) ) ;
Line 39
: $Sendmail -> send ( trim ( $email ) , false ) ; Line 47: $Sendmail = new Sendmail( CMS_MAIL_ID, '«аказано уведоление о наличии' , $Template -> display ( ) ) ;
Line 47: $Sendmail = new Sendmail( CMS_MAIL_ID, '«аказано уведоление о наличии' , $Template -> display ( ) ) ;
Line 48
: $Sendmail -> send ( trim ( $data [ 'email' ] ) , false ) ; \
system \actions\site\shoporder\order
. act
. php
( 3 hits
) Line 147: $Sendmail = new Sendmail( CMS_MAIL_ID, 'Сформирован новый заказ на сайте' , $Template -> display ( ) ) ;
Line 147: $Sendmail = new Sendmail( CMS_MAIL_ID, 'Сформирован новый заказ на сайте' , $Template -> display ( ) ) ;
Line 148
: $Sendmail -> send ( trim ( $email ) , true ) ; \
system \actions\site\user\change
. act
. php
( 3 hits
) Line 419: $Sendmail = new Sendmail( CMS_MAIL_ID, "Запрос подтверждения внесенных изменений" , $TmplMail -> display ( ) ) ;
Line 419: $Sendmail = new Sendmail( CMS_MAIL_ID, "Запрос подтверждения внесенных изменений" , $TmplMail -> display ( ) ) ;
Line 420: if ( $Sendmail -> send ( $send_confirmation_to , true ) ) {
\
system \actions\site\user\notification
. inc
. php
( 3 hits
) Line 46: $Sendmail = new Sendmail( CMS_MAIL_ID, cms_message( 'CMS' , 'Регистрация на %s: подтверждение e-mail' , CMS_HOST) , $Template -> display ( ) ) ;
Line 46: $Sendmail = new Sendmail( CMS_MAIL_ID, cms_message( 'CMS' , 'Регистрация на %s: подтверждение e-mail' , CMS_HOST) , $Template -> display ( ) ) ;
Line 47: $Sendmail -> send ( $mailto , false ) ;
\
system \actions\site\user\register
. act
. php
( 3 hits
) Line 386: $Sendmail = new Sendmail( CMS_MAIL_ID, cms_message( 'CMS' , 'Регистрация на %s' , CMS_HOST) , $Template -> display ( ) ) ;
Line 386: $Sendmail = new Sendmail( CMS_MAIL_ID, cms_message( 'CMS' , 'Регистрация на %s' , CMS_HOST) , $Template -> display ( ) ) ;
Line 387: $Sendmail -> send ( CMS_NOTIFY_EMAIL, false ) ;
\
system \actions\site\user\send_code
. act
. php
( 3 hits
) Line 33: $Sendmail = new Sendmail( CMS_MAIL_ID, cms_message( 'CMS' , 'Регистрация на %s: подтверждение e-mail' , CMS_HOST) , $Template -> display ( ) ) ;
Line 33: $Sendmail = new Sendmail( CMS_MAIL_ID, cms_message( 'CMS' , 'Регистрация на %s: подтверждение e-mail' , CMS_HOST) , $Template -> display ( ) ) ;
Line 35: $Sendmail -> send ( $user [ 'email' ] , true ) ;
\
system \crontab\cms\mailq
. php
( 1 hit
) Line 44: $result = @ Sendmail:: delivery ( $message_id ) ;
\
system \crontab\maillist\control
. php
( 16 hits
) Line 105
: $Sendmail = new Sendmail
( MAILLIST_CONTROL_MAIL_ID
, 'Отчет по выполнению Вашего запроса' , nl2br ( $TmplReport -> display ( ) ) ) ; Line 105
: $Sendmail = new Sendmail
( MAILLIST_CONTROL_MAIL_ID
, 'Отчет по выполнению Вашего запроса' , nl2br ( $TmplReport -> display ( ) ) ) ; Line 109: $Sendmail -> attach ( "/tmp/$random_seed .eml" , 'your-request.eml' ) ;
Line 111: $Sendmail -> send ( $message_from , true ) ;
Line 137
: $Sendmail = new Sendmail
( MAILLIST_CONTROL_MAIL_ID
, 'Помощь по использованию рассылок на ' . CMS_HOST
, nl2br ( $Template -> display ( ) ) ) ; Line 137
: $Sendmail = new Sendmail
( MAILLIST_CONTROL_MAIL_ID
, 'Помощь по использованию рассылок на ' . CMS_HOST
, nl2br ( $Template -> display ( ) ) ) ; Line 138: $Sendmail -> send ( $message_from , true ) ;
Line 151
: $Sendmail = new Sendmail
( MAILLIST_CONTROL_MAIL_ID
, 'Напоминание пароля на ' . CMS_HOST
, nl2br ( $Template -> display ( ) ) ) ; Line 151
: $Sendmail = new Sendmail
( MAILLIST_CONTROL_MAIL_ID
, 'Напоминание пароля на ' . CMS_HOST
, nl2br ( $Template -> display ( ) ) ) ; Line 152: $Sendmail -> send ( $message_from , true ) ;
Line 169
: $Sendmail = new Sendmail
( MAILLIST_CONTROL_MAIL_ID
, 'Список рассылок на ' . CMS_HOST
, nl2br ( $Template -> display ( ) ) ) ; Line 169
: $Sendmail = new Sendmail
( MAILLIST_CONTROL_MAIL_ID
, 'Список рассылок на ' . CMS_HOST
, nl2br ( $Template -> display ( ) ) ) ; Line 170: $Sendmail -> send ( $message_from , true ) ;
Line 195
: $Sendmail = new Sendmail
( MAILLIST_CONTROL_MAIL_ID
, 'Список рассылок на ' . CMS_HOST
. ', на которые Вы подписаны' , nl2br ( $Template -> display ( ) ) ) ; Line 195
: $Sendmail = new Sendmail
( MAILLIST_CONTROL_MAIL_ID
, 'Список рассылок на ' . CMS_HOST
. ', на которые Вы подписаны' , nl2br ( $Template -> display ( ) ) ) ; Line 196: $Sendmail -> send ( $message_from , true ) ;
\
system \crontab\maillist\maillist
. php
( 5 hits
) Line 113: $Sendmail = new Sendmail( MAILLIST_MAIL_ID, $Maillist -> subject , $Template -> display ( ) ) ;
Line 113: $Sendmail = new Sendmail( MAILLIST_MAIL_ID, $Maillist -> subject , $Template -> display ( ) ) ;
Line 114
: $Sendmail -> addHeaders ( array ( Line 125: $Sendmail -> attach ( $row [ 'file' ] , $row [ 'name' ] ) ;
Line 128: $result = $Sendmail -> send ( $rcpt [ 'email' ] , true ) ;
\
system \crontab\maillist\pop3parser
. php
( 6 hits
) Line 93: $Sendmail = new Sendmail( CMS_MAIL_ID, 'Access denied' , $Template -> display ( ) ) ;
Line 93: $Sendmail = new Sendmail( CMS_MAIL_ID, 'Access denied' , $Template -> display ( ) ) ;
Line 94: $Sendmail -> send ( $message_from ) ;
Line 112: $Sendmail = new Sendmail( CMS_MAIL_ID, 'Max message size exceeded' , $Template -> display ( ) ) ;
Line 112: $Sendmail = new Sendmail( CMS_MAIL_ID, 'Max message size exceeded' , $Template -> display ( ) ) ;
Line 113: $Sendmail -> send ( $message_from ) ;
\
system \crontab\shop\book_product
. php
( 3 hits
) Line 53: $Sendmail = new Sendmail( CMS_MAIL_ID, 'Появился в наличии товар' , $Template -> display ( ) ) ;
Line 53: $Sendmail = new Sendmail( CMS_MAIL_ID, 'Появился в наличии товар' , $Template -> display ( ) ) ;
Line 54
: $Sendmail -> send ( trim ( $row [ 'email' ] ) ) ; \
system \crontab\users\register
. php
( 3 hits
) Line 140: $Sendmail = new Sendmail( CMS_MAIL_ID, cms_message( 'CMS' , 'Регистрация на %s' , CMS_HOST) , $Template -> display ( ) ) ;
Line 140: $Sendmail = new Sendmail( CMS_MAIL_ID, cms_message( 'CMS' , 'Регистрация на %s' , CMS_HOST) , $Template -> display ( ) ) ;
Line 141: $Sendmail -> send ( $user_email , true ) ;
\
system \libs\AuthOID
. class
. php
( 3 hits
) Line 608: $Sendmail = new Sendmail( CMS_MAIL_ID, cms_message( 'CMS' , 'Регистрация на %s' , CMS_HOST) , $Template -> display ( ) ) ;
Line 608: $Sendmail = new Sendmail( CMS_MAIL_ID, cms_message( 'CMS' , 'Регистрация на %s' , CMS_HOST) , $Template -> display ( ) ) ;
Line 609: $Sendmail -> send ( $user_email , true ) ;
\
system \libs\AuthOTP
. class
. php
( 3 hits
) Line 179: $Sendmail = new Sendmail( CMS_MAIL_ID, cms_message( 'CMS' , 'Двухэтапная авторизация на сайте %s отключена' , CMS_HOST) , $Template -> display ( ) ) ;
Line 179: $Sendmail = new Sendmail( CMS_MAIL_ID, cms_message( 'CMS' , 'Двухэтапная авторизация на сайте %s отключена' , CMS_HOST) , $Template -> display ( ) ) ;
Line 180: $Sendmail -> send ( $user [ 'email' ] , true ) ;
\
system \libs\Comment
. class
. php
( 3 hits
) Line 254: $Sendmail = new Sendmail( CMS_MAIL_ID, $Template -> title , $Template -> display ( ) ) ;
Line 254: $Sendmail = new Sendmail( CMS_MAIL_ID, $Template -> title , $Template -> display ( ) ) ;
Line 255: $Sendmail -> send ( $row [ 'email' ] ) ;
\
system \libs\misc
. class
. php
( 3 hits
) Line 590: $Sendmail = new Sendmail( CMS_MAIL_ID, $subject , $content ) ;
Line 590: $Sendmail = new Sendmail( CMS_MAIL_ID, $subject , $content ) ;
Line 591: $Sendmail -> send ( $email , $immediatly ) ;
\
system \libs\sendmail
. class
. php
( 1 hit
) Line 10: class Sendmail {
\
system \triggers\
default \auth_user\update_after
. act
. php
( 3 hits
) Line 14: $Sendmail = new Sendmail( CMS_MAIL_ID, cms_message( 'CMS' , 'Ваш аккаунт был проверен администратором' ) , $TmplMail -> display ( ) ) ;
Line 14: $Sendmail = new Sendmail( CMS_MAIL_ID, cms_message( 'CMS' , 'Ваш аккаунт был проверен администратором' ) , $TmplMail -> display ( ) ) ;
Line 15: $Sendmail -> send ( $this -> NEW [ 'email' ] ) ;
(Добавление)
dmaw пишет: У меня были похожие проблемы:
Исходящие письма с сайта site.by должны быть с емайлом, где после собаки имя site.by, если имя другое, то почтовый сервер куда Вы отправили письмо может не принять такое отправление, воспринять как спам и удалить. Не знаю как у вас, проверьте от какого имени Вы отправляете письма.
Отправляются от имени имяскрываю@eurozoo.in.ua порт 26
По настройке все отлично.(Отредактировано автором: 25 Августа, 2014 - 23:12:19)
savchenkoarts
Отправлено: 27 Августа, 2014 - 18:21:28
Новичок
Покинул форум
Сообщений всего: 13
Дата рег-ции: Авг. 2014
Помог: 0 раз(а)
OrmaJever пишет: окей, как тогда отправляються письма? что находиться в методе Sendmail::delivery($message_id); ?
Viper пишет: Вам же сказали - без дебага не смогут помочь. Конкретно нужно увидеть код Sendmail::delivery.
Нашел
PHP:
скопировать код в буфер обмена
$email_list = explode ( ',' , SHOPORDER_NOTIFY_EMAIL
) ;
while ( list ( , $email ) = each ( $email_list ) ) { $Sendmail = new Sendmail( CMS_MAIL_ID, 'Сформирован новый заказ на сайте' , $Template -> display ( ) ) ;
$Sendmail -> send ( trim ( $email ) , true ) ;
RickMan
Отправлено: 28 Августа, 2014 - 23:39:04
Участник
Покинул форум
Сообщений всего: 1033
Дата рег-ции: Май 2012
Помог: 30 раз(а)
https://mandrill[dot]com/ - юзай этот сервис. Там за бесплатно можно 12к писем в месяц слать. API на PHP есть. И письма такие будут проходить фильтр гугла всегда.
(Отредактировано автором: 28 Августа, 2014 - 23:39:26)
Поиск в теме | Версия для печати
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Напишите за меня, пожалуйста »
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
Powered by ExBB FM 1.0 RC1. InvisionExBB