<?
CLASS Sendmail {
/*****************************************************************
** Класс по рассылке новостей, приему сообщений об **
** отписке и т.д. **
******************************************************************
** Версии: **
** 1.0 от 16/03/2003 **
*****************************************************************/
var $smtp_ip = "sendmail"; // "127.0.0.1"; // "sendmail" - и будет посылать почту через mail()
var $smtp_port = 25;
var $smtp_helo = 'a';
var $smtp_sp; // Socket pointer
var $from; // Адрес отправителя
var $tb_subscribers; // Таблица рассылки новостей
var $maillist_flags; // Массив полей или через запятую, которые показывают что рассылать
function Sendmail($from, $tb_subscribers, $maillist_flags) {
/*****************************************************************
** Конструктор оъекта **
*****************************************************************/
global $Logs;
IF(!is_object($Logs)) user_error('Для запуска объекта News необходимо предварительно запустить объект Logs');
IF(empty($from)) $Logs->log_error(__FILE__, __LINE__, 'Не определено обязательное поле from');
$this->from = $from;
$this->tb_subscribers = $tb_subscribers;
IF(!is_array($maillist_flags)) $maillist_flags = explode(',', $maillist_flags);
$this->maillist_flags = $maillist_flags;
}
FUNCTION get_answer($param = '') {
/*****************************************************************
** Принимает ответ от SMTP сервера через Socket **
*****************************************************************/
global $Logs;
static $zx;
$zx++;
$str = chop(@fgets($this->smtp_sp, 1024));
if ((intval($str)!= 220) && (intval($str)!= 250) && (intval($str)!= 354)) {
@fclose ($this->smtp_sp);
$Logs->log_error(__FILE__, __LINE__, "Немогу работать с SMTP. Возвращает сообщение : $str. \nПредыдущее: $param");
return FALSE;
}
else {
// echo "\nLine send to server: $param; answer: $str\n";
return TRUE;
}
}
FUNCTION send($to, $from='', $subject='', $message='', $headers='') {
/*****************************************************************
** Отсылает почту и возвращает true или false **
*****************************************************************/
IF(empty($headers)) $headers = "Content-Type: text/plain; charset=Windows-1251\n";
// Если подключение идет через Socket
IF($this->smtp_ip != 'sendmail') {
// Соединяемся с SMTP
IF(!$this->smtp_sp = @fsockopen ($this->smtp_ip, $this->smtp_port)) {
$Logs->log_error(__FILE__, __LINE__, 'Невозможно открыть Socket для отправки почты. SMTP:'.$this->smtp_ip.' Port: '.$this->smtp_port);
return FALSE;
}
// Подключаемся
IF(!$this->get_answer('Connect')) return FALSE;
// Пишем 'helo'
@fputs ($this->smtp_sp, 'helo '.$this->smtp_helo."\r\n");
IF(!$this->get_answer('helo '.$this->smtp_helo)) return FALSE;
// Пишем от кого почта
@fputs ($this->smtp_sp, 'mail from: '.$from."\r\n");
IF(!$this->get_answer('mail from: '.$from)) return FALSE;
// Пишем кому почта
@fputs ($this->smtp_sp, 'rcpt to: '.$to."\r\n");
IF(!$this->get_answer('rcpt to: '.$to)) return FALSE;
// Пишем что дальше идет тело сообщения
@fputs ($this->smtp_sp, "data\r\n");
IF(!$this->get_answer("data")) return FALSE;
// Отсылаем заголовки
IF (!empty($headers)) {
$headers = chop($headers);
@fputs ($this->smtp_sp, "$headers\r\n");
}
// Пишем тело сообщения
$body = "From: ".$from."\r\nTo: ".$to."\r\nSubject: ".$this->subject."\r\n\r\n$message\r\n.\r\n";
@fputs ($this->smtp_sp, $m);
IF(!$this->get_answer("sent data:\r\n$body")) return FALSE;
// Выходим
@fputs ($this->smtp_sp, "quit\r\n");
// $this->get_answer('quit');
@fclose ($this->smtp_sp);
}
// Отсылаем через встроенную в PHP ф-ю mail
ELSE {
@mail ($to, $subject, $message, "From: $from\n".$headers);
}
return TRUE;
}
FUNCTION reset_maillist() {
/*****************************************************************
** Сбрасывает флаг отосланного сообщения на false **
*****************************************************************/
global $Logs;
$query = "UPDATE ".$this->tb_subscribers." SET sent='false'";
mysql_query($query) or die($Logs->log_error(__FILE__, __LINE__, mysql_error(), $query));
}
FUNCTION maillist($subject, $message) {
/*****************************************************************
** Рассылает новости подписчикам и записывает об этом в БД **
******************************************************************
** $flag_columns - если в этих колонках стоит true то отсылаем **
*****************************************************************/
global $Logs;
IF(!empty($this->maillist_flags[0])) {
while(list($key, $val) = each($this->maillist_flags)) {
$maillist_flags[$key] = $val."='true'";
}
$maillist_flags = implode (' AND ', $maillist_flags).' AND ';
}
$query = "
SELECT * FROM ".$this->tb_subscribers." WHERE ".$maillist_flags." sent!='true'";
$result = mysql_query($query) or die($Logs->log_error(__FILE__, __LINE__, mysql_error(), $query));
$rows = mysql_num_rows($result);
while($list = mysql_fetch_assoc($result)) {
set_time_limit(4);
IF($this->send($list['email'], $this->from, $subject, $message)) {
$had_sent[] = $list['id'];
}
ELSE {
break 1;
}
}
set_time_limit(5);
// Вносим в БД информацию о тех пользователях, которым было отправлено сообщение
IF(is_array($had_sent)) {
$query = "UPDATE ".$this->tb_subscribers." SET sent='true' WHERE id IN (".implode(',', $had_sent).")";
mysql_query($query) or die($Logs->log_error(__FILE__, __LINE__, mysql_error(), $query));
}
// Всем пользователям было разослано сообщение
IF($rows == count($had_sent) && $rows != 0) return TRUE;
// Если значение rows == 0, значит что не обнулили поле sent
ELSEIF($rows == 0) return FALSE;
// Если не всем пользователям было разослано сообщение то возвращаем только количество отосланых
ELSE return count($had_sent);
}
FUNCTION phone2mail($operator, $phone) {
// Преобразует номер мобильного телефона в адрес электронной почты для
// отправки SMS
SWITCH($operator) {
CASE '050': // UMC
return $phone."@sms.umc.com.ua";
break;
CASE '067': // KyivStar
IF(eregi('^[7]+', $phone)) // ACE&BASE
return "38067".$phone."@2sms.kyivstar.net";
ELSE
return "38067".$phone."@sms.kyivstar.net";
break;
CASE '068': // WellCome
return "38068".$phone."@sms.welcome2well.com";
break;
CASE '044': // Golden Telecom
return "38044".$phone."@sms.gt.kiev.ua";
break;
DEFAULT:
return FALSE;
break;
}
}
} // End of Class Sendmail
// $Sendmail = new Sendmail("[email protected]", "", "Subject test", "test");
// $Sendmail->send("[email protected]");
?>