Перейти к содержимому


Дубликаты при рассылке новостей

дубликаты новости

  • Вы не можете ответить в тему
Сообщений в теме: 16

#1 poloskun

    Продвинутый пользователь

  • Download User
  • PipPipPip
  • 30 сообщений
Репутация: 1
Начинающий

Отправлено 09 July 2013 - 08:45 PM

Рассылаю новости из Админ панели. Около 5000 подписчиков.
В процессе рассылки, примерно через 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
......

Пожалуйста, подскажите, если кто то встречал такой эффект и в какую сторону смотреть?
  • 0

#2 Dbus

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 1116 сообщений
Репутация: 174
Мастер
  • ГородОдесса

Отправлено 11 July 2013 - 01:15 PM

а в списке подписчиков email-ы не дублируются ? может тупо 2 регистрации на 1 мыло или спамерская авто-подписка...
  • 0
502 Bad Gateway

#3 poloskun

    Продвинутый пользователь

  • Download User
  • PipPipPip
  • 30 сообщений
Репутация: 1
Начинающий

Отправлено 12 July 2013 - 08:12 AM

Нет, дубликатов нет, проверено в БД. Спасибо за предположение.
Причем, дубликат приходит через 5 минут после первого письма...
  • 0

#4 Dbus

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 1116 сообщений
Репутация: 174
Мастер
  • ГородОдесса

Отправлено 12 July 2013 - 09:26 AM

ИМХО косяк все-таки в почтовом сервисе, что бы там хостер не говорил. Возможно из-за большого обьема он как-то криво обрабатывает очередь. Просто остальные клиенты такими кол-вами наверное не рассылают, поэтому и ошибок у них нет.

Для проверки я бы перебрал функцию отправки, чтоб она вместо рассылки записала все в файл для разбора. И если там дубликатов не будет, то или грузить хостера, или подключать внешние сервисы типа унисендера.
  • 0
502 Bad Gateway

#5 badisoft

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 5075 сообщений
Репутация: 786
Мастер

Отправлено 12 July 2013 - 11:01 AM

В news_function.php есть функция, которая и занимается рассылкой новостей:

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 они отправляются последовательно в цикле, а дальше провайдером письма обрабатываются асинхронно-параллельно в несколько потоков.
  • 0
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#6 R.Sergey

    Администратор

  • Администраторы
  • 2810 сообщений
Репутация: 332
Мастер

Отправлено 12 July 2013 - 11:57 AM

Ну начнем с того что отправку писем 5000 за 1 раз приравнивается к спаму и более-менее серьезный провайдер просто скажет "Разбивайте на несколько отправок".

И ограничения ставятся даже не на секунды а в час.
  • 0

#7 badisoft

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 5075 сообщений
Репутация: 786
Мастер

Отправлено 12 July 2013 - 12:18 PM

И ограничения ставятся даже не на секунды а в час.

У нашего предыдущего провайдера ограничение было 20 писем в час с одного IP. :) Собственно, из-за чего мы и перестали пользоваться SMTP-сервером провайдера - даже сообщений роботов о штатных событиях за час иногда набиралось больше.

Нормальный выход (из бесплатных) только один - делать свой почтовик. Т.е. прописывать домену MX/PTR-записи и устанавливать свой почтовый сервер, который будет принимать почту (свою) в любом объеме и рассылать уже целенаправленно по MX-ам адресатов, а не в одну кучу провайдеру. При наличии фиксированного внешнего IP это не сложно. Но придется один раз разобраться в вопросе, поставить и настроить.

PS. Про второй выход я уже писал - переписать эту часть ShopCMS используя Cc:, т.е. отправляя ОДНО тело письма и ОДИН энвелоуп со списком получателей. Наверное, там тоже есть свои подхвохи и тараканы, но изначально Cc: именно для таких фишек и придумано - рассылка одного контента куче пользователей.
  • 0
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#8 poloskun

    Продвинутый пользователь

  • Download User
  • PipPipPip
  • 30 сообщений
Репутация: 1
Начинающий

Отправлено 26 July 2013 - 08:34 AM

Спасибо за совет! Сделал задержку 2 сек между отправками, но дубликаты все равно пришли. Из изменений : вместо одного сообщения об ошибке (500) сервер выдает другое - 504 (см. вложения).

Строку функции цикла 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);
		    }
}

Прикрепленные файлы


  • 0

#9 R.Sergey

    Администратор

  • Администраторы
  • 2810 сообщений
Репутация: 332
Мастер

Отправлено 26 July 2013 - 09:16 AM

poloskun, убедительная просьба!!! используйте спец. теги для вставки кода.
В противном случае посты будут удаляться.
  • 0

#10 poloskun

    Продвинутый пользователь

  • Download User
  • PipPipPip
  • 30 сообщений
Репутация: 1
Начинающий

Отправлено 27 July 2013 - 09:51 AM

а в списке подписчиков email-ы не дублируются ? может тупо 2 регистрации на 1 мыло или спамерская авто-подписка...

нет, дубликатов нет, проверил
  • 0

#11 poloskun

    Продвинутый пользователь

  • Download User
  • PipPipPip
  • 30 сообщений
Репутация: 1
Начинающий

Отправлено 17 September 2013 - 08:57 AM

Очередной ответ от хостера после изучения MSG исходника самого письма рассылки и его дубликата, пришедшего на 16 минут позже.
У меня два магазина на этом хостере. В одном более 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

  • 0

#12 eugene_wb

    Продвинутый пользователь

  • Модераторы
  • 827 сообщений
Репутация: 167
Мастер

Отправлено 17 September 2013 - 09:21 AM

плагины браузера стоят, возможно они делают повтор отправки? ( например rds bar, повторно открывает одну и ту же страницу для определения парамтеров )
  • 0
Изображение Изображение Изображение

#13 poloskun

    Продвинутый пользователь

  • Download User
  • PipPipPip
  • 30 сообщений
Репутация: 1
Начинающий

Отправлено 26 September 2013 - 10:20 PM

Несколько последних рассылок делал таким образом: создал новость - нажал отправить - подождал 20 сек - закрыл окно браузера, чтобы у него не возникло желания "повторить" из-за ошибки сервера... В функции рассылки поставил задержку 2 сек между отправками (итого 1800 сообщений в час, у хостера лимит - 5000). Не помогло. Дубликаты пришли с 18 минутной задержкой (примерно) как обычно,...

Сегодня специально поставил еще один тестовый магазин на том же хостинге, чтобы проверить рассылку.
Внес 10 подписчиков (свои адреса) и сделал рассылку.
Все отлично, без ошибок сервера и дубликатов в итоге!
Стало быть - хостинг нормально обрабатывает команды движка....

Теперь возникают ряд закономерных вопросов:

1. у кого либо есть магазин на shopcms с базой подписчиков более 2000 адресов? (у меня еще один магаз 2000 подписчиков на том же хостинге тоже шлет дубликаты - через 20 мин)
2. если есть, происходит ли рассылка адекватно? (если все ок - подскажите хостера, на котором это все - ОК, попробую связаться с ним и уточнить параметры )
3. возможно, у shopcms есть какое то недокументированное максимальное кол-во подписчиков для адекватной рассылки новостей?
4. видит ли кто либо из проф. программистов решение вопроса в качестве доработки к движку? Разумеется, платное. (кроме перехода на выделенный сервер с последующими наворотами)

Огромное спасибо за ответы. Клиенты замучили просьбами об отписке...
  • 0

#14 Dbus

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 1116 сообщений
Репутация: 174
Мастер
  • ГородОдесса

Отправлено 27 September 2013 - 01:01 PM

я все-таки думаю что как-то криво обрабатывается очередь при большом количестве адресатов. и почти наверняка это проблема хостера. но проверить это можно только сменив последнего, возможно, на время. или например, сделав рассылку с поддомена, на другом хостинге находящемся, хотя тут велика вероятность все в спаме увидеть.
  • 0
502 Bad Gateway

#15 eugene_wb

    Продвинутый пользователь

  • Модераторы
  • 827 сообщений
Репутация: 167
Мастер

Отправлено 27 September 2013 - 01:04 PM

а если ввести волшебную строчку в гугл "PHPmailer duplicate email issue"
то явно проблема решится обновлением класса phpmailer
  • 0
Изображение Изображение Изображение

#16 Dbus

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 1116 сообщений
Репутация: 174
Мастер
  • ГородОдесса

Отправлено 27 September 2013 - 01:07 PM

а если ввести волшебную строчку в гугл "PHPmailer duplicate email issue" то явно проблема решится обновлением класса phpmailer

г, я думал это уже было сделано в самом начале :)
  • 0
502 Bad Gateway

#17 poloskun

    Продвинутый пользователь

  • Download User
  • PipPipPip
  • 30 сообщений
Репутация: 1
Начинающий

Отправлено 16 October 2013 - 09:29 AM

Всем спасибо за подсказки! Решилось таким образом:
1. обновил классы
2. поставил задержку 1 с
3. после нажатия "Сохранить" через 5 сек закрываю окно броузера, чтобы сервер не выдал ошибку и не пытался обновиться
  • 0