Неверный формат E-Mail при отправке инвайта

При попытке отправки инвайта на почту вида pochta@mysite.CENTER выдаёт ошибку «Неверный формат E-Mail». Где добавить в список допустимых доменов 1-го уровня ".center"?

Как вариант рассматриваю удалить из ActionSettings.class.php этот фрагмент:

/**
			 * Емайл корректен?
			 */
			if (!func_check(getRequestStr('invite_mail'),'mail')) {
				$this->Message_AddError($this->Lang_Get('settings_invite_mail_error'),$this->Lang_Get('error'));
				$bError=true;
			}

Плагин «Черный список» (обновление 27.10.2015)

Описание

Проверка E-Mail и IP пользователей на наличие в базах спамеров (stopforumspam.org, botscout.com, fspamlist.com). Проверка осуществляется при регистрации и авторизации пользователей.

GitHub: github.com/wasja1982/livestreet_blacklist

Читать дальше →

Email рассылка + LS 1.0.3

Доброго времени суток!
Подскажите кто знает решение следующей проблемы:
Имеется промо-страница (плагин), на этой странице (actions/ActionPromopage/index.tpl) разместил форму подписки на рассылку email сообщений. Код с формой
<script type='text/javascript'>
    var dateFormat="dd.mm.yyyy",us_msg={missing:'Не задано обязательное поле: "%s"',invalid:'Недопустимое значение поля: "%s"',email_or_phone:"Не задан ни email, ни телефон",email_absent:"Не указан электронный адрес",phone_absent:"Не указан телефон",no_list_ids:"Не выбрано ни одного списка рассылки"},us_emailRegexp=/^[a-zA-Z0-9_+=-]+[a-zA-Z0-9\._+=-]*@[a-zA-Z0-9][a-zA-Z0-9-]*(\.[a-zA-Z0-9]([a-zA-Z0-9-]*))*\.([a-zA-Z]{2,6})$/,us_phoneRegexp=/^\s*[\d +()-.]{7,32}\s*$/;
    if(typeof us_=="undefined")
    var us_=new function(){
        function i(a){
            var b=a.getElementsByTagName("input");
            for(var c=0;c<b.length;c++){
                var d=b[c];if(d.getAttribute("name")=="charset"){d.value==""&&(d.value=document.characterSet?document.characterSet:document.charset);
                return}
            }
        }
        function j(a){
            var b=document,c=b.createElement("div");
                c.style.position="absolute",c.style.width="auto",c=b.body.appendChild©,c.appendChild(a),a.style.display="",d.push©
            }
            function k(){
                var a=window,b=document,c=a.innerWidth?a.innerWidth:b.body.clientWidth,e=a.innerHeight?a.innerHeight:b.body.clientHeight;
                for(var f=0;f<d.length;f++){
                    var g=d[f],h=parseInt(g.offsetWidth+""),i=parseInt(g.offsetHeight+"");g.style.left=(c-h)/2+b.body.scrollLeft+f*10,g.style.top=(e-i)/2+b.body.scrollTop+f*10}
            }
            var a=!1,b=window.onload;window.onload=function(){
                us_.onLoad()};var c=null,d=[],e=!1,f=!1,g={},h=new Event("loadFormJavascript");window.addEventListener("loadFormJavascript",function(){us_.onLoad()},!1),this.onLoad=function(){
                    var d,e=document.getElementsByTagName("form"),f=[];for(d=0;d<e.length;d++)f.push(e[d]);for(d=0;d<f.length;d++){
                        var g=f[d],h=g.getAttribute("us_mode");
                        if(!h)continue;h=="popup"&&j(g),i(g)}k(),c=window.onresize,window.onresize=function(){
                            us_.onResize()},a=!0,b&&b();var l=document.getElementsByClassName("formdatepicker");
                            for(var d in l)var m=new Pikaday({field:l[d],format:dateFormat.toUpperCase()})},this.onResize=function(){k(),c&&c()},trim=function(a){
                                return a==null?"":a.replace(/^\s\s*/,"").replace(/\s\s*$/,"")},this.onSubmit=function(b){
                                    return a?(_hideErrorMessages(b),!_validateTextInputs(b)||!_validateCheckboxes(b)||!_validateRadios(b)?!1:!0):(alert("us_.onLoad() has not been called"),!1)},_validateTextInputs=function(a){
                                        var b=a.querySelectorAll("input[type=text]");
                                        if(b.length==0)return!0;
                                        for(var c=0;c<b.length;c++){var d=b[c];g[d.name]&&g[d.name].length>0?d.style["border-color"]=g[d.name]:g[d.name]=d.style["border-color"];
                                        var h=d.getAttribute("name");h==="email"&&(e=!0),h==="phone"&&(f=!0);
                                        var i=trim(d.value),j=i==="",k=d.getAttribute("_required")==="1";if(j){if(k){
                                            var l=us_msg.missing.replace("%s",d.getAttribute("_label"));
                                            return _showErrorMessage(l,d),d.style["border-color"]="#ff592d",d.focus(),!1}}
                                            else{
                                                function m(a){
                                                    var b=us_msg.invalid.replace("%s",a.getAttribute("_label"));_showErrorMessage(b,a),a.style["border-color"]="#ff592d",a.focus()}
                                                    var n=d.getAttribute("_validator"),o=null;
                                                    switch(n){case null:case"":case"string":case"number":case"text":break;
                                                    case"date":o=dateFormat.replace(/dd?/i,"([0-9]{1,2})"),o=o.replace(/mm?/i,"([0-9]{1,2})"),o=o.replace(/yy{1,3}/i,"([0-9]{2,4})"),o=new RegExp(o);
                                                    var p=o.exec(i);if(!(p&&p[1]&&p[2]&&p[3]))return m(d),!1;
                                                    var q=parseInt(p[1],10),r=parseInt(p[2],10),s=parseInt(p[3],10),t=new Date(s,r-1,q);
                                                    if(t.getFullYear()!=s||t.getMonth()+1!=r||t.getDate()!=q)return m(d),!1;break;case"email":o=us_emailRegexp;
                                                    break;
                                                    case"phone":o=us_phoneRegexp;
                                                    break;
                                                    case"float":o=/^[+\-]?\d+(\.\d+)?$/;
                                                    break;
                                                    default:return alert('Internal error: unknown validator "'+n+'"'),d.focus(),!1}if(o&&!o.test(i)&&n!="date")return m(d),!1}}return!0},_validateCheckboxes=function(a){
                                                        return _validateOptionsList(a,"checkbox")},_validateRadios=function(a){return _validateOptionsList(a,"radio")},_validateOptionsList=function(a,b){
                                                            function f(a){
                                                                return!a||a==document?null:a.parentNode.nodeName&&a.parentNode.nodeName.toLowerCase()==="ul"?a.parentNode:f(a.parentNode)}var c=a.querySelectorAll("input[type="+b+"]");
                                                                if(c.length==0)return!0;
                                                                var d=new Array,e="";
                                                                for(var g=0;g<c.length;g++)c[g].getAttribute("_required")==="1"&&(e=c[g].getAttribute("name").replace(/(:|\.|\[|\])/g,"\\$1"),d.indexOf(e)===-1&&d.push(e));
                                                                for(var h in d){var e=d[h],i=a.querySelectorAll("input[name="+e+"]:checked").length,j=a.querySelectorAll("input[name="+e+"]");
                                                                if(i===0){var k=f(j[0]),l=us_msg.missing.replace("%s",j[0].getAttribute("_label"));
                                                                return _showErrorMessage(l,k),!1}}return!0},_showErrorMessage=function(a,b){if(b){
                                                                    var c=b.parentNode.querySelector(".error-block");c.innerHTML=a,c.style.display="block"}},_hideErrorMessages=function(a){
                                                                        var b=a.querySelectorAll(".error-block");if(b.length==0)return;for(var c=0;c<b.length;c++){var d=b[c];d.innerHtml="",d.style.display="none"}}}</script>
                                                                        
<script type='text/javascript' src='http://cp.unisender.com/v5/template-editor-new/js/lib/moment/moment-with-langs.min.js'></script>
<script type='text/javascript' src='http://cp.unisender.com/v5/template-editor-new/js/lib/datepicker/pikaday.js'></script>
<link rel='stylesheet' media='all' href='http://cp.unisender.com/v5/template-editor-new/js/lib/datepicker/pikaday.css'>

<form method="POST" action="http://cp.unisender.com/ru/subscribe?hash=59qtg8hgfziqb6cmus6wpyxay4apeqzsgfrt91jy" name="subscribtion_form" onsubmit="return us_.onSubmit(this);" us_mode="embed">
    <input _label="E-mail" name="email" _validator="email" _required="1" type="text">

    <div class="error-block"></div>

    <button type="submit">Напомнить о событии</button>


    <input name="charset" value="" type="hidden">
    <input name="default_list_id" value="" type="hidden">
    <input name="overwrite" value="2" type="hidden">

</form>


Теперь после обновления страницы, вываливается на белом фоне такое сообщение
Fatal error: Uncaught exception 'SmartyCompilerException' with message 'Syntax Error in template "/var/www/vhosts/site.com/mysite/plugins/mainpage/templates/skin/simple/actions/ActionPromopage/index.tpl" on line 20 "<script type='text/javascript'>var dateFormat="dd.mm.yyyy",us_msg={missing:'Не задано обязательное поле: "%s"',invalid:'Недопустимое значение поля: "%s"',email_or_phone:"Не задан ни email, ни телефон",email_absent:"Не указан электронный адрес",phone_absent:"Не указан телефон",no_list_ids:"Не выбрано ни одного списка рассылки"},us_emailRegexp=/^[a-zA-Z0-9_+=-]+[a-zA-Z0-9\._+=-]*@[a-zA-Z0-9][a-zA-Z0-9-]*(\.[a-zA-Z0-9]([a-zA-Z0-9-]*))*\.([a-zA-Z]{2,6})$/,us_phoneRegexp=/^\s*[\d +()-.]{7,32}\s*$/;if(typeof us_=="undefined")var us_=new function(){function i(a){var b=a.getElementsByTagNam in /var/www/vhosts/site.com/mysite/engine/lib/external/Smarty/libs/sysplugins/smarty_internal_templatecompilerbase.php on line 627 


Подскажите что надо поправить, чтобы скрипт заработал…

Рассылка email. Что использовать ?

Всем привет!

Вопрос. К примеру в блоге есть 200 человек. Если я публикую новую запись в данный блог, е-мейл нотификация должна прийти всем двумстам пользователям. На сколько трудоемко для postfix'a отослать такое количество писем? Не забанят ли мой IP такие сервисы, как гугл, мэйл.ру и т.п.? Я так понимаю, что нагрузка на CPU в момент рассылки будет максимальная? А если пользователей 1000. Есть ли какие-то идеи, советы, рекомендации по данному вопросу?

Всем спасибо!

Отправитель письма при использовании sendmail

При отправки писем движком LiveStreet используя sendmail есть один нюанс, что отправителем письма (Return-Path) является какой-нибудь nobody@localhost или www-data@localhost или ещё что-то в подобном духе. (всё зависит от настроек сервера, но при виртуальном хостинге возможность исправить настройки сервера отсутствуют).

Изза чего письма могут оседать на некоторых спам фильтрах. или в некоторых webmailах или почтовых программах высвечиваться типа ваш@мейл On Behalf Of: nobody@localhost, что в принципе не кошерно.

Решение проблемы достаточно простое. (я думаю этот момент стоит внести в штатную сборку LiveStreet)

в файле engine/modules/mail/Mail.class.php

176 строка файла
в функции Init() находим
$this->oMailer->From=$this->sFrom;

и добавляем
$this->oMailer->Sender=$this->sFrom;


т.е. вот так выглядить функция после исправлений
	public function Init() {
		/**
		 * Настройки SMTP сервера для отправки писем
		 */
		$this->sHost     = Config::Get('sys.mail.smtp.host');
		$this->iPort     = Config::Get('sys.mail.smtp.port');
		$this->sUsername = Config::Get('sys.mail.smtp.user');
		$this->sPassword = Config::Get('sys.mail.smtp.password');
		$this->bSmtpAuth = Config::Get('sys.mail.smtp.auth');
		$this->sSmtpSecure = Config::Get('sys.mail.smtp.secure');
		/**
		 * Метод отправки почты
		 */
		$this->sMailerType=Config::Get('sys.mail.type');
		/**
		 * Кодировка писем
		 */
		$this->sCharSet=Config::Get('sys.mail.charset');
		/**
		 * Мыло от кого отправляется вся почта
		 */
		$this->sFrom=Config::Get('sys.mail.from_email');
		/**
		 * Имя от кого отправляется вся почта
		 */
		$this->sFromName=Config::Get('sys.mail.from_name');

		/**
		 * Создаём объект phpMailer и устанвливаем ему необходимые настройки
		 */
		$this->oMailer = new phpmailer();
		$this->oMailer->Host=$this->sHost;
		$this->oMailer->Port=$this->iPort;
		$this->oMailer->Username=$this->sUsername;
		$this->oMailer->Password=$this->sPassword;
		$this->oMailer->SMTPAuth=$this->bSmtpAuth;
		$this->oMailer->SMTPSecure=$this->sSmtpSecure;
		$this->oMailer->Mailer=$this->sMailerType;
		$this->oMailer->WordWrap=$this->iWordWrap;
		$this->oMailer->CharSet=$this->sCharSet;

		$this->oMailer->From=$this->sFrom;
		$this->oMailer->Sender=$this->sFrom; // 176 строка. фиксит return-path
		$this->oMailer->FromName=$this->sFromName;
	}

Тонкая настройка почты

Столкнулся с тем, что при добавлении топиков, происходят достаточно сильные тормоза. После проведённого анализа выяснилось, что проблема тормозов ПОЧТА. При публикации топика происходит рассылка по всем пользователям, которые имеют отношение к блогу, в который происходит размещение материала.

При включении отложенной рассылки, всё приходит в порядок, но есть один очень не маловажный момент. Письма о регистрации, активации аккаунта или напоминания пароля, должны приходить незамедлительно.
Предлагаю к вашему вниманию следующий фикс.

В конфиге config/config.local.php добавляем следующие настройки

// Указывает на необходимость использовать режим отложенной рассылки сообщений на email
$config['module']['notify']['delayed'] = true;
// Если опция установлена в true, систему будет собирать записи заданий удаленной публикации, для вставки их в базу единым INSERT
$config['module']['notify']['insert_single'] = true;
// Количество отложенных заданий, обрабатываемых одним крон-процессом
$config['module']['notify']['per_process'] = 10;


Далее исправляем файл classes/modules/notify/Notify.class.php

Находим в нём функцию

public function Send($oUserTo,$sTemplate,$sSubject,$aAssign=array(),$sPluginName=null) {


В этой функции находим строчку

if(Config::Get('module.notify.delayed')) {


И заменяем её на

$isNotifyDelayed = Config::Get('module.notify.delayed');
if (($sTemplate == "notify.registration_activate.tpl") || ($sTemplate == "notify.registration.tpl") || ($sTemplate == "notify.reactivation.tpl") || ($sTemplate == "notify.reminder_code.tpl") || ($sTemplate == "notify.reminder_password.tpl")) { $isNotifyDelayed = false; }
if($isNotifyDelayed) {


PS: Возможно разместил топик не в тот блог, но в другие писать к сожалению не могу. Видимо не хватает рейтинга или силы.

Небольшое дополнение:
Кто-то может забыть, поэтому напоминаю, что необходимо по крону запускать скрипт include/cron/notify.php

есть 2 варианта запуска.

1. используя HTTP.

для этого необходимо поправить .htaccess в папке include/cron/
содержание должно быть

Order Deny,Allow
Deny from all
Allow from XXX.XXX.XXX.XXX


вместо XXX.XXX.XXX.XXX укажите IP, с которого будет производиться HTTP запрос.
и в крон можно внести следующую запись

*/5 * * * *   wget -O- http://www.livestreet.ru/include/cron/notify.php >> /dev/null


2. либо из консоли.

и в крон можно внести следующую запись

*/5 * * * *   /usr/bin/php /vhosts/site.ru/www/include/cron/notify.php


Пути указывайте в соответствии с настройками вашего сервера.

ПОСТ по EMAIL. НАписать и отправить ПОСТ по электронной почте для публикации на сайте livestreet

Как написать и отправить пост по электронной почте для публикации на сайте.
Как опубликовать пост через ваш email.
Суть в том, чтобы помощью этой опции можно отправлять сообщения на сайты Livestreet, не заходя на сам livestreet. Достаточно просто написать пост в виде электронного письма, отправить его на специальный адрес — и он появится в вашем блоге. Зачем это нужно? Ну, всякое ведь бывает. К примеру, у вас может отсутствовать доступ к РС по каким--либо причинам. А руки чешутся опубликовать новый пост :) Тогда это можно сделать с любого доступного мобильного устройства. Еще один вариант применения — если вы пишете пост не сразу, а постепенно, придумывая по предложению в час — можно все пришедшие в голову идеи не записывать на бумажках и разбрасывать по всему столу/офису/..., а отправлять письмами в черновики на livestreet. А потом зайдете в панельку изменения сообщений, перечитаете все черновые записи и сделаете из них супер пост :)

Да мало ли для чего еще. Iphone-веды и ipad-воды страдают не могут добавить со своих любимых айфончиков и айпадиков фотки и видео на сайты livestreet. Почтовые приложения и большинство программ на ipad позволяют вставлять и отправлять текст, фото и видео по почте. Как вариант написать и отправить пост по электронной почте для публикации на сайте. Вопрос в том, какой плагин должен позволить сайту принять email — распознать и опубликовать. Это прибавило бы дополнительную аудиторию на Ваши проекты.

Возможно ли разработать такой плагин и цена вопроса будьте добры в студию)

Warning: Smarty error: unable to read resource: "notify/russian/notify.talk_new.tpl"

При отправке сообщения из админки рядовому пользователю в тексте письма на email приходит ошибка вида
Warning: Smarty error: unable to read resource: "notify/russian/notify.talk_new.tpl" in .../www/engine/lib/external/Smarty-2.6.19/libs/Smarty.class.php on line 1092 

1. Перезалил файл talk_new.tpl — не помогло
2. Очистил кеш через /admin/site/reset/ — не помогло
3. Установил $config['path']['offset_request_url'] = '1'; (было 0) — совсем сломал уже работающий сайт (404), вернул обратно
4. Обновил aceAdminPanel до актуальной на 17.07.2011 версии 176 — не помогло
Поиском решения пока не нашел.
Думаю, что связано с aceAdminPanel.

Защита Email от спам-ботов

На Хабре была в свое время подробная статья по защите Email, опубликованных на сайте, от спамботов. Было бы очень полезно оформить какой-то (или несколько) из этих вариантов в качестве плагина.