Хак: рассылка инвайтов

В ситуации когда нужно отослать 10 или 20 или 100 инвайтов, после ввода N адреса почты, хочется залесть в код и исправить чтоб можно было вводить кучу адресов, например через точку запятую, а не по одному. Собственно так и родился данный хак.
Итак приступим:
Версия LS 0.3.1
1. Находим файл classes/actions/ActionSettings.class.php
И в нем метод:
protected function EventInvite() {		
		if (!USER_USE_INVITE) {
			return parent::EventNotFound();
		}
		
		$this->sMenuItemSelect='invite';
		$this->sMenuSubItemSelect='';		
		$this->Viewer_AddHtmlTitle($this->Lang_Get('settings_menu_invite'));		
		
		if (isset($_REQUEST['submit_invite'])) {
			$this->Security_ValidateSendForm();
			$bError=false;
			if (!$this->ACL_CanSendInvite($this->oUserCurrent) and !$this->oUserCurrent->isAdministrator()) {
				$this->Message_AddError($this->Lang_Get('settings_invite_available_no'),$this->Lang_Get('error'));		
				$bError=true;		
			}
			if (!func_check(getRequest('invite_mail'),'mail')) {
				$this->Message_AddError($this->Lang_Get('settings_invite_mail_error'),$this->Lang_Get('error'));		
				$bError=true;		
			}
			if (!$bError) {
				$oInvite=$this->User_GenerateInvite($this->oUserCurrent);
				$this->Notify_SendInvite($this->oUserCurrent,getRequest('invite_mail'),$oInvite);
				$this->Message_AddNoticeSingle($this->Lang_Get('settings_invite_submit_ok'));
			}
		}
		
		$this->Viewer_Assign('iCountInviteAvailable',$this->User_GetCountInviteAvailable($this->oUserCurrent));
		$this->Viewer_Assign('iCountInviteUsed',$this->User_GetCountInviteUsed($this->oUserCurrent->getId()));		
	}


И заменяем следующим:
protected function EventInvite() {		
		if (!USER_USE_INVITE) {
			return parent::EventNotFound();
		}
		
		$this->sMenuItemSelect='invite';
		$this->sMenuSubItemSelect='';		
		$this->Viewer_AddHtmlTitle($this->Lang_Get('settings_menu_invite'));		
		
		if (isset($_REQUEST['submit_invite'])) {
			$this->Security_ValidateSendForm();
			$bError=false;
			if (!$this->ACL_CanSendInvite($this->oUserCurrent) and !$this->oUserCurrent->isAdministrator()) {
				$this->Message_AddError($this->Lang_Get('settings_invite_available_no'),$this->Lang_Get('error'));		
				$bError=true;		
			}
			$mails = explode(';',getRequest('invite_mail'));
			foreach ($mails as $mail) {
				if (!func_check($mail,'mail')) {
					$this->Message_AddError($this->Lang_Get('settings_invite_mail_error'),$this->Lang_Get('error'));		
					$bError=true;		
				}
			}
			if (!$bError) {
				foreach ($mails as $mail) {
					$oInvite=$this->User_GenerateInvite($this->oUserCurrent);
					$this->Notify_SendInvite($this->oUserCurrent,$mail,$oInvite);				
				}
				$this->Message_AddNoticeSingle($this->Lang_Get('settings_invite_submit_ok'));
			}
		}
		
		$this->Viewer_Assign('iCountInviteAvailable',$this->User_GetCountInviteAvailable($this->oUserCurrent));
		$this->Viewer_Assign('iCountInviteUsed',$this->User_GetCountInviteUsed($this->oUserCurrent->getId()));		
	}


2. Косметическая правка
Файл templates/language/russian.php (Это может быть и другой язык)

Строку:
'settings_invite_mail_notice' => 'На этот e-mail будет высланно приглашение для регистрации',

Заменяем: Строку:
'settings_invite_mail_notice' => 'Вы можете указать несколько e-mail адресов разделенных символом ";"',


3. Не паримся при массовой рассылке инвайтов. (PROFIT)

7 комментариев

avatar
ne srabotal, cant read the format xxx@xxx.com;xxx@xxx.com ;xxx@xxx.com :(
avatar
Пробел между вторым адресом и; уберите будет работать
avatar
Отличный хак, то что доктор прописал ;)
avatar
Собственно поправил для 1.0.2 версии:
		if (isPost('submit_invite')) {
			$this->Security_ValidateSendForm();

			$bError=false;
			/**
			 * Есть права на отправку инфайтов?
			 */
			if (!$this->ACL_CanSendInvite($this->oUserCurrent) and !$this->oUserCurrent->isAdministrator()) {
				$this->Message_AddError($this->Lang_Get('settings_invite_available_no'),$this->Lang_Get('error'));
				$bError=true;
			}
			/**
			 * Емайл корректен?
			 */
			$mails = explode(';',getRequestStr('invite_mail'));
			foreach ($mails as $mail) {
				if (!func_check($mail,'mail')) {
					$this->Message_AddError($this->Lang_Get('settings_invite_mail_error'),$this->Lang_Get('error'));
					$bError=true;
				}
			}
			/**
			 * Запускаем выполнение хуков
			 */
			$this->Hook_Run('settings_invate_send_before', array('oUser'=>$this->oUserCurrent));
			/**
			 * Если нет ошибок, то отправляем инвайт
			 */
			if (!$bError) {
				foreach ($mails as $mail) {
					$oInvite=$this->User_GenerateInvite($this->oUserCurrent);
					$this->Notify_SendInvite($this->oUserCurrent,$mail,$oInvite);
				}
				$this->Message_AddNoticeSingle($this->Lang_Get('settings_invite_submit_ok'));
				$this->Hook_Run('settings_invate_send_after', array('oUser'=>$this->oUserCurrent));
			}
		}
avatar
Есть шанс, что письмо попадёт в папку Спам?
avatar
Случайно отправил 1500 инвайтов, сервер завис… обновил строку браузера ))) Оказалось второй раз разлетелись… В спам не попало не одно )))
avatar
Народ, хочу предупредить, все же мой сервер попал под спам-фильтры многих почтовиков. Пришлось вылазить! Какое именно кол-во я не знаю. Сейчас вылезли из всех, кроме гугла. Ошибка была в том, что не была настроена обратка (PTR запись), dkim, exim, spf… Мало в этом шарю, сисадмин сейчас разбирается и вытаскиваем сервер.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.