Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <?php
- /**
- * Author: Aego
- * E-mail: alexkondrashin4@gmail.com
- * Date: 19.09.12
- * Time: 11:14
- */
- include_once('DaemonClass.php');
- include_once('htmlMimeMail.php');
- /**
- * Класс работает с очередью писем из ЛК
- */
- class UsoftMailQueueDaemon extends DaemonPHP
- {
- const PRO_CONN_STR = 'mysql:host=89.111.180.221;dbname=lk_usoft_ru';
- const DB_USER = '';
- const DB_PASS = '';
- const WAIT_TIME = 60; //Две минуты - время, сколько демон пробудет в sleep
- const MAIL_PER_TRY = 30; //Сколько писем брать за итерацию
- /**
- * @var null|PDO
- */
- public $PDO = null;
- /**
- * @var array
- */
- public $mailsPack = array();
- public function run()
- {
- $this->connectToDb();
- while ( true ) {
- $this->getMailsPack();
- $this->processMailsPack();
- $slpTime = self::WAIT_TIME;
- if ( date('G') > 19 || date('G') < 9 ) {
- $slpTime = 60 * 30; //30 mins
- }
- sleep(self::WAIT_TIME);
- }
- }
- /**
- * Устанавливает соединение с базой
- */
- public function connectToDb()
- {
- $this->PDO = new PDO(self::PRO_CONN_STR, self::DB_USER, self::DB_PASS);
- }
- /**
- * Достает из базы набор писем.
- */
- public function getMailsPack()
- {
- $cnt = self::MAIL_PER_TRY;
- if ( date('G') > 19 || date('G') < 9 ) {
- $cnt = 100;
- }
- $sql = "SELECT *
- FROM `mail_queue`
- WHERE `is_sended` = 0
- ORDER BY `id` ASC
- LIMIT $cnt";
- $state = $this->PDO->prepare($sql);
- $state->execute();
- if ( $state->rowCount() > 0 ) {
- $ids = array();
- while ( $entry = $state->fetch(PDO::FETCH_ASSOC) ) {
- $ids[] = $entry['id'];
- $this->mailsPack[] = $entry;
- }
- $this->markEntriesAsSended($ids);
- }
- }
- /**
- * Помечает письма как отправленные. Делаем это до отправки,
- * чтобы случайно не отправить одно письмо несколько раз.
- *
- * @param array $ids
- */
- public function markEntriesAsSended(array $ids)
- {
- $inString = implode(',', $ids);
- $now = time();
- $sql = "UPDATE `mail_queue`
- SET
- `is_sended` = 1,
- `send_time` = $now
- WHERE `id` IN ($inString)";
- $this->PDO->query($sql);
- }
- /**
- * Соственно отсылает письма.
- *
- * @return mixed
- */
- public function processMailsPack()
- {
- if ( sizeof($this->mailsPack) <= 0 ) {
- return;
- }
- foreach ($this->mailsPack as $email) {
- $mailer = new htmlMimeMail();
- $recipients = unserialize($email['recipients']);
- $mailer->setFrom($email['from']);
- $mailer->setSubject($email['subject']);
- if ( $email['content_type'] == 'html' ) {
- $mailer->setHtml($email['content']);
- } elseif ( $email['content_type'] == 'text' ) {
- $mailer->setText($email['content']);
- }
- if ( $this->prepCcOrBss($email['cc']) ) {
- $mailer->setCc($this->prepCcOrBss($email['cc']));
- }
- if ( $this->prepCcOrBss($email['ncc']) ) {
- $mailer->setCc($this->prepCcOrBss($email['ncc']));
- }
- if ( !is_null($email['file_name']) && !is_null($email['file_data']) ) {
- $mailer->addAttachment($email['file_data'], $email['file_name']);
- }
- foreach ($recipients as $recipient) {
- $mailer->send(array($recipient));
- }
- unset($mailer);
- }
- $this->mailsPack = array(); //Unsetting mails list
- }
- /**
- * Работает с копией и скрытой копией, которых может не быть
- *
- * @param array $ccOrBcc
- * @return array|bool|mixed|string
- */
- public function prepCcOrBss($ccOrBcc)
- {
- if ( is_null($ccOrBcc) ) {
- return false;
- }
- $ccOrBcc = unserialize($ccOrBcc);
- if ( sizeof($ccOrBcc) == 1 ) {
- return $ccOrBcc;
- } else {
- return implode(';', $ccOrBcc);
- }
- }
- }
- $daemon = new UsoftMailQueueDaemon();
- $daemon->handle($argv);
- $daemon->run();
Add Comment
Please, Sign In to add comment