Перейти к контенту

Рассылка на мейл из форума HTML с аттачем, решена проблема кодировок


Рекомендуемые сообщения

Работает на php5 с отключенным безопасным режимом, на четвертых не будет работать. Интерфейсы писать поленился, все ошибки вывел через die()...

 

Почтовый класс взят из http://phpforum.ru/index.php?showtopic=20824 и отредактирован: переведен в кодировку винкириллица, в коде кодировка utf-8 заменена на windows-1251, удалены вызовы функций в конце файла, оставлен только сам класс. Файл помещен в директорию sources.

 

Создал новый подфорум для рассылок. Права по желанию. :D

 

Дальше правил только post_new_post.php:

 

Найти:

<?php

и ниже добавить

// +FatCat Рассылка по группе из форума
define(ADMIN_MGROUP,'4'); // Какая группа из какого форума становится рассылающей
define(ADMIN_MAIL_FORUM,'139'); // Какой форум отдан под рассылку этой группе
// -FatCat Рассылка по группе из форума

Здесь нужно подставить свои цифры: айдишник админской группы (которая будет рассылать) и айдишник форума, который будет служить местом создания рассылки.

 

 

Найти:

		$db_string = $DB->compile_db_insert_string( $this->post );

	$DB->query("INSERT INTO ibf_posts (" .$db_string['FIELD_NAMES']. ") VALUES (". $db_string['FIELD_VALUES'] .")");

и добавить выше

//+FatCat Рассылка по группе из форума
	// Какая группа из какого форума становится рассылающей:
	if($class->forum['id'] == ADMIN_MAIL_FORUM and $ibforums->member['mgroup'] == ADMIN_MGROUP)
	{
		@set_time_limit(0);
		@ignore_user_abort(TRUE);
		include 'sources/IRB_Mailer.php';
		if(!stristr($this->topic['description'],":") or !stristr($this->topic['description'],"@") or !stristr($this->topic['description'],"."))
			die("Ошибка: в поле описания темы должны быть через двоеточие без пробелов указаны обратный мейл и затем через запятую список групп для рассылки!");
		$from = explode(":",trim($this->topic['description']));
		$to = explode(",",$from[1]);
		for($i=0;$i<count($to);$i++)if( $to[$i] != intval($to[$i]) )die("Ошибка: в поле описания темы должны номера групп указываются только цифрами через запятую без пробелов и иных символов.");
		$to = $from[1];
		$from = $from[0];
		$language = array(
			'no_text'		  => 'Нет текста письма', 
			'no_file'		  => 'Не указан путь до файла',					   
			'no_path'		  => 'Нет файла по указанному пути',
			'no_addresse'	  => 'Нет адреса получателя', 
			'not_correct'	  => 'E-mail указан некорректно', 
			'no_sender'		=> 'Нет отправителя',					
			'no_theme'		 => 'Нет темы письма', 
			'no_send'		  => 'По техническим причинам отправка письма в данный момент невозможна',
		);


		$DB->query("SELECT name, email FROM ibf_members WHERE mgroup IN(".$to.")");
		$counter = 0; $error_report = "";
		while ( $r = $DB->fetch_row() )
		{
			$file = "uploads/".$this->post['attach_id'];
			$mail = new IRB_Mailer($this->post['post'], $language);
			if($this->post['attach_id'])$mail -> attacheFile($file, $this->post['attach_file']);
			$mail -> setHtml();
			$mail -> createTo(trim($r['email']));   
			$mail -> createFrom($from);
			$mail -> createSubject($std->txt_stripslashes($this->topic['title']));
			$error = $mail -> sendMail();
			if($error)$error_report .= "<li><b>".$r['name']."</b> (".$r['email']."): ".$error."</li>";
			else $counter++;
		}
		$this->post['post'] = "<b>".$this->topic['title']."</b><br><br>".str_replace("\n","<br>",$this->post['post'])."<br><br><hr><b>Всего получателей:</b> ".$counter;
		if($error_report)$this->post['post'] .= "<h4>Ошибки при отправке:</h4><ol>".$error_report."</ol>";
	}
// -FatCat Рассылка по группе из форума

 

 

Найти

		//---------------------------------------
	// START TABLE
	//---------------------------------------

	$class->output .= $class->html->table_structure();

и добавить ниже

// +FatCat: рассылка из форума: берем список групп
	if($class->forum['id'] == ADMIN_MAIL_FORUM and $ibforums->member['mgroup'] == ADMIN_MGROUP)
	{
		if(!$topic_desc)
		{
			$r_groups = array();
			$DB->query("SELECT g_id FROM ibf_groups");
			while ( $r = $DB->fetch_row() )
			{
				$r_groups[] = $r['g_id'];
			}
			$topic_desc = "no@spam.me:".implode(",",$r_groups);
		}
	}
// -FatCat: рассылка из форума: берем список групп

 

Теперь для рассылки писем нужно в созданном подфоруме админом создать новую тему.

Заголовок темы станет заголовком письма.

В поле описания темы уже будет запись вида: "no@spam.me:1,2,3,4,5,6,7". Нужно вписать свой обратный мейл и оставить через запятые те группы, которым требуется рассылать мейлы.

 

Затем написать текст сообщения. Можно использовать коды форума - форматирование будет сохранено в рассылаемых письмах. Следует иметь в виду, что таблица стилей и джаваскрипты в письмо не внедрятся, поэтому не следует использовать те ББ-коды, которым нужны стили или джаваскрипт.

 

К сообщению можно приаттачить файл - он будет приаттачен к каждому письму.

 

Создание сообщения может занять довольно долгое время в зависимости от числа пользователей под рассылку и от скорости работы SMTP-сервера провайдера. Можно закрыть окно или даже браузер - рассылка будет продолжаться сервером сама собой.

 

НЕ СЛЕДУЕТ обновлять страницу в процессе рассылки - это приведет к повторной рассылке!!!

 

У хостеров типа джино-нет с убийством процессов из юникса по таймеру рассылка может быть прервана по таймеру юникса. Впрочем, для джино это не актуально, там все равно защищенный режим пхп, и класс мейлера работать не будет.

Ссылка на комментарий
Поделиться на других сайтах

Присоединиться к обсуждению

Вы можете ответить сейчас, а зарегистрироваться позже. Если у вас уже есть аккаунт, войдите, чтобы ответить от своего имени.

Гость
Ответить в этой теме...

×   Вы вставили отформатированный текст.   Удалить форматирование

  Допустимо не более 75 смайлов.

×   Ваша ссылка была автоматически заменена на медиа-контент.   Отображать как ссылку

×   Ваши публикации восстановлены.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

Зарузка...
×
×
  • Создать...

Важная информация

Находясь на нашем сайте, вы соглашаетесь на использование файлов cookie, а также с нашим положением о конфиденциальности Политика конфиденциальности и пользовательским соглашением Условия использования.