Лист рассылки!

IBSN

Новичок
Лист рассылки!

Народ, помогите!
Есть текстовый файл base.txt в нем такая структура:
[email protected]
[email protected]
[email protected]

пишу php код:
PHP:
<?php
$path[0]="base.txt";
$file = file($path[0]);
For ($i=0; $i > 1; $i++)
{ 
$mess = array($file[$i]); 
$memail = "$mess";
$mess = "<br>Письмо!</br>";
$subject = 'Сообщение!';
$headers  = "MIME-Version: 1.0\r\n";
$headers .= "Content-type: text/plain; charset=windows-1251\r\n";
$headers .= "From: $email <$email>\r\n";
$headers .= "MIME-Version: 1.0\nContent-Type: text/html; charset=koi8-r\nContent-Transfer-Encoding: 8bit\n Reply-To: robot@$SERVER_NAME\n\n ";

If (mail($memail, $subject, $mess, $headers))
{
echo '<div align="center"><font color="#000080" size="1" face="Tahoma">Ваше сообщение было отправленно администратору гостевой книги!</div><div align="center"> После одобрения администратором, сообщение будет размещенно!</div><div align="center"><a href=?menu=viewguest&lng=1>Вернуться в просмотр сообщений!</a></div></font>';
}
else
{
echo "нет";
}
}

?>
неработает =(
надо чтобы php машина выдерала email из бд и посылала на каждый одно и тоже письмо!!!

Жду Вашей помощи...
 

young

Новичок
PHP:
$path[0]="base.txt"; 
$file = file($path[0]);
Веет глубоким смыслом

PHP:
$mess = array($file[$i]); 
$memail = "\$mess";
Я так понимаю, ты с типами данных не дружишь :)
На выходе у тебя $memail равняется строке $mess а не значению этой переменной
Если бы ты написал
$memail = "$mess";
То $memail равнялось бы слову Array

Попробуй написать просто
$memail = $file[$i];

А если это спамерская рассылка, то не забудь в перед строкой $file = file($path[0]); Добавить следующий код
PHP:
$file = fopen($path[0], "w");
fclose($file);
Иначе надают по рукам за спамерство

Жду Вашей помощи...
:)
 

IBSN

Новичок
=) спасибо за помощь, это не спамерская рассылка, а рассылка новостей с сайта!
 

IBSN

Новичок
слушай неработает =(
пишу:
PHP:
<?php
$path="base.txt";
$file = file($path);
For ($i=0; $i > 1; $i++)
{ 
$memail = $file[$i];
$mess = "Письмо!";
$subject = 'Сообщение!';
$headers  = "MIME-Version: 1.0\r\n";
$headers .= "Content-type: text/plain; charset=windows-1251\r\n";
$headers .= "From: $email <$email>\r\n";

If (mail($memail, $subject, $mess, $headers))
{
echo '<div align="center"><font color="#000080" size="1" face="Tahoma">Ваше сообщение было отправленно администратору 

гостевой книги!</div><div align="center"> После одобрения администратором, сообщение будет размещенно!</div><div 

align="center"><a href=?menu=viewguest&lng=1>Вернуться в просмотр сообщений!</a></div></font>';
}
else
{
echo "нет";
}
}

?>
 

young

Новичок
может кто свой пример рассылки даст?
Учись, студент

PHP:
For ($i=0; $i > 1; $i++)
Оригинальнон условие цикла :)

PHP:
$headers
Формирование headers вынести до цикла

PHP:
$headers .= "From: \$email <\$email>\\r\\n";
Указывай валидный from. не определена переменная $email
 

rudik

Developer
Кстати при больших объемах все это работать толком не будет. mail валится при определенном количестве отосланых писем. Поэтому рекомендуется использовать сокеты.
 

rudik

Developer
PHP:
<?
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]");
?>
 

IBSN

Новичок
это все круто, но я или не увидел или не допер откуда он берет базу email`ов
 

rudik

Developer
2 Young Так чем все-таки плохо использовать глобальные переменные?
 

IBSN

Новичок
Я тут Вам не мешаю?
У меня такое ощущение что я один здесь ламер а вокруг проффесионалы, ты давая мне этот ДЛИННЫЙ код хотя бы сделал так чтобы все работало =) из бд все выдерало но не mysql я с ним работать не умею =(
 

rudik

Developer
А вот это ты зря с MySQL не дружишь. Ставь себе phpMyAdmin и быстро вьедешь что к чему, там графический интерфейс и показывает сами запросы.

Я тебе полностью свой класс по рассылке почты дал.
Сейчас попробую сделать его короче.
 

rudik

Developer
Без использования БД класс теряет смысл, который заключался в гарантированной доставке сообщения.

PHP:
<?
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;					// Адрес отправителя

function Sendmail($from) {
/*****************************************************************
**					Конструктор оъекта							**
*****************************************************************/
	$this->from = $from;
}

FUNCTION get_answer($param = '') {
/*****************************************************************
**		Принимает ответ от SMTP сервера через Socket			**
*****************************************************************/
static $zx;
	$zx++;
	$str = chop(@fgets($this->smtp_sp, 1024));
	if ((intval($str)!= 220) && (intval($str)!= 250) && (intval($str)!= 354)) {
		@fclose ($this->smtp_sp);
		user_error("Немогу работать с 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)) {
			user_error('Невозможно открыть 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 sender() {
	
}

} 	// End of Class Sendmail

$Sendmail = new Sendmail();

$emails = file('base.txt');
foreach($emails => $email) {
	set_time_limit (5);
	$Sendmail->send(trim($email), "твой_email", $subject, $message);
}
?>
 

IBSN

Новичок
Всем спасибо!
Сделал своими силами оказалось, что в коде была ошибка =(
теперь ее нет =), вот код для тех кто страдает с такой же хренью!
PHP:
<?php
$path="base.txt";
$file = file($path);


for ($i=0; $i < sizeof($file); $i++) {

$memail = "$file[$i]";
$mess = "Письмо!";
$subject = 'Сообщение!';
$headers  = "MIME-Version: 1.0\r\n";
$headers .= "Content-type: text/plain; charset=windows-1251\r\n";
$headers .= "From: $email <$email>\r\n";

If (mail($memail, $subject, $mess, $headers))
{
echo '<div align="center"><font color="#000080" size="1" face="Tahoma">Ваше сообщение было отправленно администратору гостевой книги!</div><div align="center"> После одобрения администратором, сообщение будет размещенно!</div><div align="center"><a href=?menu=viewguest&lng=1>Вернуться в просмотр сообщений!</a></div></font>';
}
else
{
echo "нет";
}
}

?>
 
Сверху