#1
Отправлено 09 July 2013 - 08:45 PM
В процессе рассылки, примерно через 5 минут, сервер выдает сообщение об ошибке (несмотря на это сообщение, все отлично рассылается).
Некоторое время назад (примерно 3 месяца) начали приходить сообщения от клиентов, что новостные письма дублируются.
Обсуждение с хостером выявило следующее (1 в начале строки - ушло 1 сообщение, 2 - пошел дубликат, дубликатов примерно 15%):
A: Здравствуйте.
Мы выполнили рассылку и при присмотре почтовой очереди видно, что у Вас большая часть сообщений проходит без дублирования, но так же мы наблюдаем и дублирующиеся сообщения. Ниже приведен способ вычисления, количества писем для каждого email адреса рассылки и если бы проблемы были на сервере, то письма дублировались бы все и не только у Вас. Вероятнее всего проблема в настройках Вашей CMS и Вам следует обратиться за помощью к разработчикам данного программного обеспечения.
----------------------------------------------
[root@mail4 ~]# for i in $msges ; do qmqtool -w -v $i|grep 'To:'|grep -v '?windows-1251?B?'|awk '{print $2}' >>file.txt;done
[root@mail4 ~]# cat file.txt |sort |uniq -c|sort -n
1 0673829131@mail.ru
1 093gdab1@mail.ru
1 111@poloskun.od.ua
1 111@sdrfs.com
1 150576ols@mail.ru
...... (сокращаю, чтобы не приводить весь список)
1 zowamadocah@gmail.com
1 zzz@poloskun.od.ua
2 adamson@wvruralhealthpolicy.org
2 adoramand6673306@mail.ru
2 adorazar1462853@mail.ru
......
Пожалуйста, подскажите, если кто то встречал такой эффект и в какую сторону смотреть?
#2
Отправлено 11 July 2013 - 01:15 PM
#3
Отправлено 12 July 2013 - 08:12 AM
Причем, дубликат приходит через 5 минут после первого письма...
#4
Отправлено 12 July 2013 - 09:26 AM
Для проверки я бы перебрал функцию отправки, чтоб она вместо рассылки записала все в файл для разбора. И если там дубликатов не будет, то или грузить хостера, или подключать внешние сервисы типа унисендера.
#5
Отправлено 12 July 2013 - 11:01 AM
function newsSendNews($newsid)
{
$q = db_query( "select add_date, title, textToMail from ".NEWS_TABLE." where NID=".(int)$newsid );
$news = db_fetch_row( $q );
$news["add_date"]=dtConvertToStandartForm($news["add_date"]);
$q = db_query( "select Email from ".MAILING_LIST_TABLE );
while( $subscriber = db_fetch_row($q) ) xMailTxtHTMLDATA($subscriber["Email"], EMAIL_NEWS_OF." - ".CONF_SHOP_NAME, $news["title"]."<br><br>".$news["textToMail"]);
}
т.е. берется из таблицы новость с заданным NewsID и рассылается по очереди каждому подписчику (отдельным письмом!), используя функцию xMailTxtHTMLDATA. Эта функция просто создает объект класса PHPmailer (из стандартной, общеиспользуемой и даже не для ShopCMS написанной библиотеки), заполняет его свойствами (адрес, текст...) и выполняет отправку письма методом этого же класса. Причем метод возвращает true/false (получилось отправить или нет), но в newsSendNews это никак не обрабатывается. Не отправилось - ну и фиг с ним, отправляем следующее.
Ошибиться тут негде, тем более, что у всех эта рассылка вполне работает. Хотя, конечно, правильнее бы было отправлять ОДНО письмо со списком получателей либо в To:, либо вообще в Cc: (класс все это позволяет), но так уж написан ShopCMS.
Дальше (в классе PHPmailer) используется функция mail(), ответственность за которую несет уже провайдер.
Не исключено, что у провайдера стоит антиспамовое ограничение на отправку количества писем в интервал времени, но не совсем отлаженное, отсюда и глюки. Попробуйте вставитьв функции newsSendNews в цикл while паузу на секунду-две и проверить, не исчезло ли доблирование писем. Также можно поставить более новую версию PHPmailer (в ShopCMS штатная довольно старая), но врядли это поможет.
PS. На отмазку провайдера "у остальных не дублируется" можно встречно спросить: "Ребята, а у вас много клиентов, которые пытаются максимально быстро друг за другом без пауз отправить 5тыс писем?"
Причем, как я понимаю, это для ShopCMS они отправляются последовательно в цикле, а дальше провайдером письма обрабатываются асинхронно-параллельно в несколько потоков.
#6
Отправлено 12 July 2013 - 11:57 AM
И ограничения ставятся даже не на секунды а в час.
#7
Отправлено 12 July 2013 - 12:18 PM
У нашего предыдущего провайдера ограничение было 20 писем в час с одного IP. Собственно, из-за чего мы и перестали пользоваться SMTP-сервером провайдера - даже сообщений роботов о штатных событиях за час иногда набиралось больше.И ограничения ставятся даже не на секунды а в час.
Нормальный выход (из бесплатных) только один - делать свой почтовик. Т.е. прописывать домену MX/PTR-записи и устанавливать свой почтовый сервер, который будет принимать почту (свою) в любом объеме и рассылать уже целенаправленно по MX-ам адресатов, а не в одну кучу провайдеру. При наличии фиксированного внешнего IP это не сложно. Но придется один раз разобраться в вопросе, поставить и настроить.
PS. Про второй выход я уже писал - переписать эту часть ShopCMS используя Cc:, т.е. отправляя ОДНО тело письма и ОДИН энвелоуп со списком получателей. Наверное, там тоже есть свои подхвохи и тараканы, но изначально Cc: именно для таких фишек и придумано - рассылка одного контента куче пользователей.
#8
Отправлено 26 July 2013 - 08:34 AM
Строку функции цикла function newsSendNews($newsid) из news_function.php изменил так, все ли верно?
while( $subscriber = db_fetch_row($q) ) { xMailTxtHTMLDATA($subscriber["Email"], EMAIL_NEWS_OF." - ".CONF_SHOP_NAME, $news["title"]."<br><br>".$news["textToMail"]); flush(); usleep(2000000); }
в итоге вся функция выглядит так:
function newsSendNews($newsid) { $q = db_query( "select add_date, title, textToMail from ".NEWS_TABLE." where NID=".(int)$newsid ); $news = db_fetch_row( $q ); $news["add_date"]=dtConvertToStandartForm($news["add_date"]); $q = db_query( "select Email from ".MAILING_LIST_TABLE ); while( $subscriber = db_fetch_row($q) ) { xMailTxtHTMLDATA($subscriber["Email"], EMAIL_NEWS_OF." - ".CONF_SHOP_NAME, $news["title"]."<br><br>".$news["textToMail"]); flush(); usleep(2000000); } }
Прикрепленные файлы
#10
Отправлено 27 July 2013 - 09:51 AM
нет, дубликатов нет, проверила в списке подписчиков email-ы не дублируются ? может тупо 2 регистрации на 1 мыло или спамерская авто-подписка...
#11
Отправлено 17 September 2013 - 08:57 AM
У меня два магазина на этом хостере. В одном более 5 тыс подписчиков, в другом - около 2 тыс. Оба высылают с дубликатами.
Задержку отправки ставил и 2 сек и 5 сек (код приведен выше) - но это не помогает.
Подскажите, может у кого то появились соображения на этот счет?
A: Здравствуйте.
Увеличьте задержки между письмами у нас есть ограничение в 5 тыс. сообщений/час мы видим большое количество предупреждений о превышении этого лимита.
2013-09-16 18:58:31 H=localhost (vh18.hosting.ua) [127.0.0.1] F=<> rejected RCPT <poloskun@vh18.hosting.ua>: Sender rate SMTP overlimit - 5000.8 / 1h
2013-09-16 18:58:31 H=localhost (vh18.hosting.ua) [127.0.0.1] F=<> rejected RCPT <poloskun@vh18.hosting.ua>: Sender rate SMTP overlimit - 5000.7 / 1h
Но это не является причиной появления дубликатов. В заголовках сообщения указано время вызова команды sendmail из скриптов и время вызова отличается на минуты, тогда как, если бы дублирование сообщений было на сервере время бы было идентичным или отличалось бы на несколько секунд. ID сообщений также различно, что свидетельствует о нескольких вызовах команды sendmail
Received: (from poloskun@localhost)
by vh18.hosting.ua (8.13.8/8.13.8/Submit) id r8GFj7I9026786;
Mon, 16 Sep 2013 18:45:07 +0300
Received: (from poloskun@localhost)
by vh18.hosting.ua (8.13.8/8.13.8/Submit) id r8GFdwTI012889;
Mon, 16 Sep 2013 18:39:58 +0300
#13
Отправлено 26 September 2013 - 10:20 PM
Сегодня специально поставил еще один тестовый магазин на том же хостинге, чтобы проверить рассылку.
Внес 10 подписчиков (свои адреса) и сделал рассылку.
Все отлично, без ошибок сервера и дубликатов в итоге!
Стало быть - хостинг нормально обрабатывает команды движка....
Теперь возникают ряд закономерных вопросов:
1. у кого либо есть магазин на shopcms с базой подписчиков более 2000 адресов? (у меня еще один магаз 2000 подписчиков на том же хостинге тоже шлет дубликаты - через 20 мин)
2. если есть, происходит ли рассылка адекватно? (если все ок - подскажите хостера, на котором это все - ОК, попробую связаться с ним и уточнить параметры )
3. возможно, у shopcms есть какое то недокументированное максимальное кол-во подписчиков для адекватной рассылки новостей?
4. видит ли кто либо из проф. программистов решение вопроса в качестве доработки к движку? Разумеется, платное. (кроме перехода на выделенный сервер с последующими наворотами)
Огромное спасибо за ответы. Клиенты замучили просьбами об отписке...
#14
Отправлено 27 September 2013 - 01:01 PM
#16
Отправлено 27 September 2013 - 01:07 PM
г, я думал это уже было сделано в самом началеа если ввести волшебную строчку в гугл "PHPmailer duplicate email issue" то явно проблема решится обновлением класса phpmailer
#17
Отправлено 16 October 2013 - 09:29 AM
1. обновил классы
2. поставил задержку 1 с
3. после нажатия "Сохранить" через 5 сек закрываю окно броузера, чтобы сервер не выдал ошибку и не пытался обновиться