echo "Send email messages\n"; $mail = new smtp(); $mail->subject = $eSubject; // заголовок письма $mail->message = $eMessage; // текст письма $mail->recipient = ''; // свойство 'получатель' оставляем пустым $spamid = $mail->send('text/html'); if (!$spamid) { die('Failed!'); } // с этого момента рассылка создана, но еще никому не отправлена! // допустим нам нужно получить список получателей с какого-либо запроса $i = 0; $mail->recipient = array(); $res = $DB->query($sql); while ($row = pg_fetch_assoc($res)) { $mail->recipient[] = array('email' => $row['email'], 'extra' => array('first_name' => $row['uname'], 'last_name' => $row['usurname'], 'USER_LOGIN' => $row['login'], 'UNSUBSCRIBE_KEY' => users::GetUnsubscribeKey($row['login']))); if (++$i >= 5000) { $mail->bind($spamid); $mail->recipient = array(); $i = 0; } ++$cnt; } if ($i) { $mail->bind($spamid); $mail->recipient = array(); } echo "OK. Total: {$cnt} users\n";
/** * Возвращаем данные подписчика * на новый проекты * * @global object $DB * @param int $uid * @return array */ public static function GetPrjRecp($uid) { global $DB; $row = $DB->row("\n SELECT \n f.reg_date, \n f.last_time, \n f.uname, \n f.usurname, \n f.login, \n f.email, \n f.mailer, \n f.mailer_str, \n usk.key AS unsubscribe_key, \n f.uid \n FROM freelancer AS f \n LEFT JOIN users_subscribe_keys AS usk ON f.uid = usk.uid \n WHERE \n f.mailer > 0 \n AND f.is_banned = '0' \n AND f.uid = ?i \n LIMIT 1", $uid); if ($row && !$row['unsubscribe_key']) { $row['unsubscribe_key'] = users::GetUnsubscribeKey($row['login']); } return $row; }
/** * Рассылка о новых проектах лицам, отсутствовавшим на сайте более суток и менее года. Вызывается раз в день из hourly.php. * * @param array &$uids - массив идентификаторов пользователей, подписанных на новые проекты но которым отправлено это уведомление * необходимо передать в smail::NewProj * * @return int количество получивших рассылку */ public function NewProjForMissingMoreThan24h(&$uids) { $projects = projects::GetNewProjectsWithBudjet($error); //сортировка по стоимости foreach ($projects as $key => $prj) { $prj['sort_cost'] = $prj['cost']; if ($prj['currency'] == 0) { $prj['sort_cost'] *= 30; //в данном случае точный курс не важен, важно отсортировать } if ($prj['currency'] == 1) { $prj['sort_cost'] *= 40; //в данном случае точный курс не важен, важно отсортировать } $projects[$key] = $prj; } $all_mirrored_specs = professions::GetAllMirroredProfsId(); $professions = professions::GetProfessionsAndGroup(); $professionsTree = array(); foreach ($professions as $k => $i) { if ($professionsTree[$i['gid']] === null) { $professionsTree[$i['gid']] = array('gid' => $i['gname']); if ($i['id'] !== null) { $professionsTree[$i['gid']][$i['id']] = $i['name']; } else { $professionsTree[$i['gid']] = $i['gname']; } } elseif (is_array($professionsTree[$i['gid']])) { $professionsTree[$i['gid']][$i['id']] = $i['name']; } } $page = 0; $count = 0; // total $countBs = 0; // БС $countCar = 0; // карусель $countPro = 0; // ПРО $countPayed = 0; // платные места $countVerify = 0; // верификация $this->subject = 'Новые проекты и конкурсы на FL.ru'; $pHost = $GLOBALS['host']; ob_start(); include $_SERVER['DOCUMENT_ROOT'] . '/masssending/tpl.missing_more_than_24h.php'; $this->message = ob_get_clean(); $this->recipient = ''; $massId = $this->masssend(); $dbStat = new DB('master'); while ($users = freelancer::GetMissingMoreThan24h($error, ++$page, 100)) { $this->recipient = array(); foreach ($users as $user) { if (!$user['unsubscribe_key']) { $user['unsubscribe_key'] = users::GetUnsubscribeKey($user['login']); } $unsubscribe_link = "{$pHost}/unsubscribe?ukey=" . $user['unsubscribe_key']; $advert_template = $this->getAdvertTemplate($user, $n); //номер рекламного блока 0 - БС, 1 - карусель, 2 - ПРО, 3 - платные места, 4 - верификация switch ($n) { case 0: $countBs++; break; case 1: $countCar++; break; case 2: $countPro++; break; case 3: $countPayed++; break; case 4: $countVerify++; break; } $pList = $this->getProjectsForUser($projects, $user, $all_mirrored_specs, $professionsTree); $length = count($pList); if ($length == 0) { continue; } for ($i = 0; $i < count($pList); ++$i) { for ($j = $i; $j < count($pList); ++$j) { $a = $pList[$i]; $b = $pList[$j]; if ($b['sort_cost'] > $a['sort_cost']) { $buf = $pList[$i]; $pList[$i] = $pList[$j]; $pList[$j] = $buf; } } } $pListHtml = ''; foreach ($pList as $p) { ob_start(); include $_SERVER['DOCUMENT_ROOT'] . '/masssending/tpl.missing_more_than_24h_list_item.php'; $pListHtml .= ob_get_clean(); } $str = 'Посмотрите пять самых свежих — они могут вам понравиться.'; switch ($length) { case 1: $str = 'Посмотрите самый свежий — он может вам понравиться.'; break; case 2: $str = 'Посмотрите два самых свежих — они могут вам понравиться.'; break; case 3: $str = 'Посмотрите три самых свежих — они могут вам понравиться.'; break; case 4: $str = 'Посмотрите четыре самых свежих — они могут вам понравиться.'; break; } ob_start(); include $_SERVER['DOCUMENT_ROOT'] . "/masssending/{$advert_template}"; $advHtml = ob_get_clean(); if ($user['subscr_new_prj'] == 't') { $uids[] = $user['uid']; } $recipient[] = array('email' => $user['uname'] . ' ' . $user['usurname'] . ' [' . $user['login'] . '] ' . ' <' . $user['email'] . '>', 'extra' => array('NAME' => (string) $user['uname'], 'EMAIL' => (string) $user['email'], 'LIST' => (string) $pListHtml, 'ADV' => (string) $advHtml, 'STR' => (string) $str, 'UNSUBSCRIBE_LINK' => (string) $unsubscribe_link)); ++$count; } $this->recipient = $recipient; $this->bind($massId); $recipient = array(); } $query = 'INSERT INTO subscribe_missing_24h_stat (date_subscribe, bs, carusel, pro, payed_places, verify) VALUES (?, ?i, ?i, ?i, ?i, ?i)'; $dbStat->query($query, date('Y-m-d'), $countBs, $countCar, $countPro, $countPayed, $countVerify); return $count; }
/** * Рассылка пользователям по емейлу, приводим массив в подабающий вид, вспомогательная функция * * @param array $a Переменная массива * @return type */ public function array2send($a) { $ulink = "{$GLOBALS['host']}/users/{$a['login']}"; return array('email' => $a['email'], 'extra' => array('USER_NAME' => $a['uname'], 'USER_SURNAME' => $a['usurname'], 'USER_LOGIN' => $a['login'], 'URL_PORTFOLIO' => '<a href="' . "{$ulink}/portfolio/" . '" target="_blank">' . "{$ulink}/portfolio/" . '</a>', 'URL_LK' => '<a href="' . "{$ulink}/" . '" target="_blank">' . "{$ulink}/" . '</a>', 'URL_BILL' => '<a href="' . "{$ulink}/bill/" . '" target="_blank">' . "{$ulink}/bill/" . '</a>', 'UNSUBSCRIBE_KEY' => users::GetUnsubscribeKey($a['login']))); }
/** * Формирует тело сообщения в формате HTML, в стиле сообщений от FL.ru. * * @param string $uname имя пользователя-получателя сообщения. * @param string $body исходный текст сообщения. * @param array $format можно расширять и использовать как угодно, например, задать так, чтобы не было приветствия. * @return string html-сообщение. */ public function GetHtml($uname, $body, $format = array('header' => 'default', 'footer' => 'default'), $params = null) { if (!empty($format) && !is_array($format)) { $format = array('header' => $format, 'footer' => $format); } $body = preg_replace('~(https?:/){[^}]+}/~', '$1/', $body); // чистим шаблоны гиперссылок. $html_header = ''; $html_footer = ''; if ($format['footer'] == 'frl_subscr_projects' || $format['footer'] == 'frl_simple_projects') { $format['footer'] = str_replace("frl_", "", $format['footer']); $role = 'заказчиком'; } else { $role = 'фрилансерами'; } if ($format['footer'] == 'sub_emp_projects') { $subscr = true; $format['footer'] = str_replace("sub_", "", $format['footer']); } else { $subscr = false; } if ($format['header'] == 'simple_with_add') { $html_header = ' <div style="font-size:10px; color:#7e7e7e;"> Чтобы не пропустить ни одного письма от команды <a style="font-size:10px; color:#006ed6" target="_blank" href="' . $GLOBALS['host'] . '">FL.ru</a>, добавьте наш адрес <a style="font-size:10px; color:#006ed6" target="_blank" href="mailto:no_reply@free-lance.ru">no_reply@free-lance.ru</a> в вашу адресную книгу. <a style="font-size:10px; color:#006ed6" target="_blank" href="https://feedback.fl.ru/topic/532678-instruktsiya-po-dobavleniyu-email-adresa-flru-v-spisok-kontaktov/">Инструкция</a> </div> <br/> <br/> '; $html_header .= "Здравствуйте" . ($uname ? ", {$uname}." : "!"); } elseif ($format['header'] == 'default' || $format['header'] == 'simple' || $format['header'] == 'info') { $html_header .= "Здравствуйте" . ($uname ? ", {$uname}." : "!"); } elseif ($format['header'] == 'noname') { $html_header .= "Здравствуйте!"; } elseif ($format['header'] == 'default_new') { $html_header .= "Здравствуйте, %USER_NAME%!"; } elseif ($format['header'] == 'subscribe') { $html_header .= "Здравствуйте" . ($uname ? ", {$uname}." : "!") . " "; $html_header .= "В " . ($params['type'] == 1 ? 'блоге' : 'топике ' . ($params['topic_title'] ? ' «' . $params['topic_title'] . '»' : '') . ' сообщества') . ($params['title'] ? ' «' . $params['title'] . '»' : '') . ", "; $html_header .= "на котор" . ($params['type'] == 1 ? 'ый' : 'ое') . " вы подписаны, появился новый комментарий."; } elseif ($format['header'] == 'subscribe_edit_comment') { $html_header .= "Здравствуйте" . ($uname ? ", {$uname}." : "!") . " <br/><br/>"; $html_header .= "В " . ($params['type'] == 1 ? 'блоге' : 'сообществе') . ($params['title'] ? ' «' . $params['title'] . '»' : '') . ", "; $html_header .= "на котор" . ($params['type'] == 1 ? 'ый' : 'ое') . " вы подписаны, отредактирован комментарий."; } elseif ($format['header'] == 'subscribe_edit_post') { $html_header .= "Здравствуйте" . ($uname ? ", {$uname}." : "!") . " <br/><br/>"; $html_header .= ($params['type'] == 1 ? 'В блоге' : 'Топик ' . ($params['topic_name'] ? ' «' . $params['topic_name'] . '»' : '') . ' сообщества') . ($params['title'] ? ' «' . $params['title'] . '»' : ''); $html_header .= ($params["to_subscriber"] ? ", на который вы подписаны," : "") . " отредактирован."; } elseif ($format['header'] == 'subscribe_delete_comment') { $html_header .= "Здравствуйте" . ($uname ? ", {$uname}." : "!") . " <br/><br/>"; $html_header .= "В " . ($params['type'] == 1 ? 'блоге' : 'сообществе') . ($params['title'] ? ' «' . $params['title'] . '»' : '') . ", "; $html_header .= "на котор" . ($params['type'] == 1 ? 'ый' : 'ое') . " вы подписаны, удален комментарий."; } elseif ($format['header'] == 'subscribe_delete_post') { $html_header .= "Здравствуйте" . ($uname ? ", {$uname}." : "!") . " <br/><br/>"; $html_header .= ($params['type'] == 1 ? 'Блог' : ($params['is_comment'] ? 'Комментарий в топике ' : 'Топик ') . ($params['topic_name'] ? ' «' . $params['topic_name'] . '»' : '') . ' сообщества ') . ($params['title'] ? ' «' . $params['title'] . '»' : '') . ", "; if (!$params['to_topicstarter']) { $html_header .= "на который вы подписаны, удален."; } else { $html_header .= "удален " . ($params["is_author"] ? "автором темы" : "модератором сообщества") . "."; } } if (!empty($params['login'])) { $lnk_setup_mail = "<a href='{$GLOBALS['host']}/unsubscribe?ukey=" . users::GetUnsubscribeKey($params['login']) . "'>на этой странице</a>"; } else { if (empty($params['target_footer'])) { $lnk_setup_mail = "на странице «Уведомления/Рассылка»"; } else { $lnk_setup_mail = "<a href='{$GLOBALS['host']}/unsubscribe?ukey=%UNSUBSCRIBE_KEY%'>на этой странице</a>"; } } if (!empty($params['utm_campaign'])) { $lnk_team = "<a href='{$GLOBALS['host']}/?utm_source=newsletter4&utm_medium=rassilka&utm_campaign={$params['utm_campaign']}{$this->_addUrlParams('b', '&')}'>FL.ru</a>"; } else { $lnk_team = "<a href='{$GLOBALS['host']}/{$this->_addUrlParams('b')}'>FL.ru</a>"; } if ($format['footer'] == 'default') { //$html_footer .= "Вы можете отключить уведомления {$lnk_setup_mail}."; //$html_footer .= "<br><br>"; //$html_footer .= "Команда FL.ru благодарит вас за участие в жизни нашего портала."; $html_footer .= "<br><br>"; $html_footer .= "Приятной работы,"; $html_footer .= "<br>"; $html_footer .= "команда {$lnk_team}"; } else { if ($format['footer'] == 'feedback_default') { $html_footer .= "По всем возникающим вопросам вы можете обращаться в нашу <a href='https://feedback.fl.ru/' taraget='_blank'>службу поддержки</a>. "; //$html_footer .= "<br/>Вы можете отключить уведомления {$lnk_setup_mail}."; //$html_footer .= "<br><br>"; //$html_footer .= "Команда FL.ru благодарит вас за участие в жизни нашего портала."; $html_footer .= "<br><br>"; $html_footer .= "Приятной работы,"; $html_footer .= "<br>"; $html_footer .= "команда {$lnk_team}"; } else { if ($format['footer'] == 'simple') { $html_footer .= "Приятной работы,"; $html_footer .= "<br>"; $html_footer .= "команда <a href='{$GLOBALS['host']}/{$this->_addUrlParams('b')}'>FL.ru</a>"; } else { if ($format['footer'] == 'info_robot') { $html_footer .= "Данное письмо отправлено почтовым роботом сервера FL.ru и не требует ответа."; $html_footer .= "<br>"; $html_footer .= "По всем возникающим вопросам вы можете обращаться в нашу <a href='https://feedback.fl.ru/{$this->_addUrlParams('b', '?')}'>службу поддержки</a>."; $html_footer .= "<br><br>"; $html_footer .= "Приятной работы,"; $html_footer .= "<br>"; $html_footer .= "команда <a href='{$GLOBALS['host']}/{$this->_addUrlParams('b')}'>FL.ru</a>"; } else { if ($format['footer'] == 'norisk_robot') { $html_footer .= "Данное письмо отправлено почтовым роботом FL.ru и не требует ответа."; $html_footer .= "<br>"; $html_footer .= "По всем возникающим вопросам вы можете обращаться в нашу <a href='https://feedback.fl.ru/{$this->_addUrlParams('b', '?')}'>службу поддержки</a>."; $html_footer .= "<br><br>"; $html_footer .= "Приятной работы,"; $html_footer .= "<br>"; $html_footer .= "команда <a href='{$GLOBALS['host']}/{$this->_addUrlParams('b')}'>FL.ru</a>"; } else { if ($format['footer'] == 'info') { $html_footer .= "Команда FL.ru"; $html_footer .= "<br>"; $html_footer .= "<a href='mailto:info@fl.ru'>info@fl.ru</a>"; $html_footer .= "<br>"; $html_footer .= "<a href='{$GLOBALS['host']}/{$this->_addUrlParams('b')}'>{$GLOBALS['host']}</a>"; } else { if ($format['footer'] == 'subscribe') { $html_footer .= "Чтобы отключить подобные уведомления, зайдите в " . ($params['type'] == 1 ? 'блог' : 'сообщество') . " и нажмите кнопку \"Отписаться\"."; //$html_footer .= "<br><br>"; //$html_footer .= "Команда FL.ru благодарит вас за участие в жизни нашего портала."; $html_footer .= "<br><br>"; $html_footer .= "Приятной работы,"; $html_footer .= "<br>"; $html_footer .= "команда <a href='{$GLOBALS['host']}/{$this->_addUrlParams('b')}'>FL.ru</a>"; } else { if ($format['footer'] == 'simple_norisk') { $html_footer .= "Если у вас есть какие-то вопросы по «Безопасной Сделке», обращайтесь к нашему менеджеру <a href='mailto:norisk@fl.ru'>norisk@fl.ru</a>"; $html_footer .= "<br><br>"; $html_footer .= "Команда FL.ru благодарит вас за участие в жизни нашего портала."; $html_footer .= "<br><br>"; $html_footer .= "Приятной работы,"; $html_footer .= "<br>"; $html_footer .= "команда <a href='{$GLOBALS['host']}/{$this->_addUrlParams('b')}'>FL.ru</a>"; } else { if ($format['footer'] == 'simple_projects') { $html_footer .= "В проекте вы выбрали способ оплаты - <strong>Прямая оплата исполнителю.</strong><br>"; $html_footer .= "В этом случае вы несете все риски, связанные с несвоевременным и/или некачественным выполнением работы. И не имеете возможности обратиться в Арбитраж."; $html_footer .= "<br><br>"; $html_footer .= "Предлагаем вам <strong><a href='{$GLOBALS['host']}/public/?step=1&public={$params['project']['id']}&choose_bs=1'>изменить способ оплаты на Безопасную сделку</a>.</strong><br>"; $html_footer .= "<a href='{$GLOBALS['host']}/promo/bezopasnaya-sdelka/'>Промо-страница Безопасной сделки</a>."; $html_footer .= "<br><br>"; $html_footer .= "Приятной работы,"; $html_footer .= "<br>"; $html_footer .= "команда <a href='{$GLOBALS['host']}/{$this->_addUrlParams('b')}'>FL.ru</a>"; } else { if ($format['footer'] == 'subscr_projects') { $html_footer .= "Чтобы минимизировать риски, возникающие в ходе сотрудничества с {$role}, рекомендуем воспользоваться «<a href='{$GLOBALS['host']}/promo/sbr/{$this->_addUrlParams('b')}'>Безопасной Сделкой</a>»."; $html_footer .= "<br><br>"; //$html_footer .= "Вы можете отключить уведомления {$lnk_setup_mail}."; //$html_footer .= "<br><br>"; $html_footer .= "Приятной работы,"; $html_footer .= "<br>"; $html_footer .= "команда <a href='{$GLOBALS['host']}/{$this->_addUrlParams('b')}'>FL.ru</a>"; } else { if ($format['footer'] == 'emp_projects') { if ($subscr) { //$html_footer .= "<br><br>"; //$html_footer .= "Вы можете отключить уведомления {$lnk_setup_mail}."; } $html_footer .= "<br><br>"; $html_footer .= "Приятной работы,"; $html_footer .= "<br>"; $html_footer .= "команда <a href='{$GLOBALS['host']}/{$this->_addUrlParams('b')}'>FL.ru</a>"; } else { if ($format['footer'] == 'simple_adv') { $html_footer .= "Владельцы «Аккаунта PRO» - это наиболее активная и профессиональная аудитория сайта. \n Хотим напомнить, что на каждого обладателя профессионального аккаунта приходится по 2 опубликованных проекта, \n а средний бюджет проекта для PRO составляет более 10 300 рублей. Продлить действие «Аккаунта PRO», \n а также ознакомиться с другими возможностями продвижения своего аккаунта на FL.ru можно <a href='{$GLOBALS['host']}/payed/{$this->_addUrlParams('b')}'>здесь</a>."; $html_footer .= "<br/><br/>"; $html_footer .= "Приятной работы,"; $html_footer .= "<br/><br/>"; $html_footer .= "команда <a href='{$GLOBALS['host']}/{$this->_addUrlParams('b')}'>FL.ru</a>"; } } } } } } } } } } } } ob_start(null, 0, true); ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru" lang="ru"> <head> <meta http-equiv="Content-Type" content="text/html; charset=windows-1251" /> </head> <style type="text/css"> a { color: #003399; text-decoration:underline; font-size:10pt; font-family:Tahoma; } body { margin:10px; background:#ffffff; color:#000000; font-size:10pt; font-family:Tahoma; } td { font-size:10pt; font-family:Tahoma; } </style> <body> <table cellspacing="0" border="0" cellpadding="0" width="100%"> <tbody> <tr> <td> <?php echo $html_header ? "{$html_header}<br><br>" : ""; echo $body; ?> <br><br><?php echo $html_footer; ?> </td> </tr> </tbody> </table> </body> </html> <?php $ret = ob_get_clean(); return $ret; }