public static function rpc_post_subscribe(Context $ctx) { $data = $ctx->post; if (empty($data['sections'])) { throw new InvalidArgumentException("Не выбраны разделы для подписки."); } if (false === strpos($data['email'], '@')) { throw new InvalidArgumentException(t('Введённый email не похож на email.')); } // В массиве могут быть и другие данные, поэтому мы // выбираем только то, что нам нужно завернуть. $bulk = array('email' => $data['email'], 'sections' => $data['sections']); $link = new url(array('args' => array('q' => 'subscription.rpc', 'action' => 'confirm', 'code' => base64_encode(serialize($bulk))))); $sections = Node::findXML(array('class' => 'tag', 'deleted' => 0, 'published' => 1, 'id' => $data['sections'], '#sort' => 'name'), $ctx->db, 'section'); if (empty($sections)) { throw new InvalidArgumentException("Выбраны несуществующие разделы для подписки."); } $xml = html::em('message', array('mode' => 'confirm', 'host' => MCMS_HOST_NAME, 'email' => $data['email'], 'base' => $ctx->url()->getBase($ctx), 'confirmLink' => $link->string()), html::em('sections', $sections)); $xsl = $ctx->config->get('modules/subscription/stylesheet', os::path('lib', 'modules', 'subscription', 'message.xsl')); if (false === ($body = xslt::transform($xml, $xsl, null))) { throw new RuntimeException(t('Возникла ошибка при форматировании почтового сообщения.')); } $subject = t('Подписка на новости сайта %host', array('%host' => MCMS_HOST_NAME)); // mcms::debug($data['email'], $subject, $body); BebopMimeMail::send(null, $data['email'], $subject, $body); }
/** * @mcms_message ru.molinos.cms.cron */ public static function taskRun(Context $ctx) { $types = $ctx->config->get('modules/subscription/types', array()); $xsl = $ctx->config->get('modules/subscription/stylesheet', os::path('lib', 'modules', 'subscription', 'message.xsl')); $sub = $ctx->config->get('modules/subscription/subject', 'Новости сайта %host'); if (empty($types)) { return; } $ctx->db->beginTransaction(); $users = Node::find(array('class' => 'subscription', 'deleted' => 0, 'published' => 1, '#sort' => 'name'), $ctx->db); // Обрабатываем активных пользователей. foreach ($users as $user) { $olast = $last = intval($user->last); if ($sections = (array) $user->tags) { list($sql, $params) = Query::build(array('class' => $types, 'tags' => $sections, 'published' => 1, 'deleted' => 0, 'id' => array('>' . ($olast + 1))))->getSelect(array('id', 'xml')); $nodes = $ctx->db->getResultsKV('id', 'xml', $sql, $params); // Отправляем документы. foreach ($nodes as $nid => $node) { $xml = html::em('message', array('mode' => 'regular', 'unsubscribe' => 'subscription.rpc?action=remove&name=' . urlencode($user->name) . '&id=' . $user->id, 'base' => $ctx->url()->getBase($ctx), 'host' => MCMS_HOST_NAME), $node); $body = xslt::transform($xml, $xsl, null); $subject = t($sub, array('%host' => $ctx->url()->host())); BebopMimeMail::send(null, $user->name, $subject, $body); $last = max($last, $nid); } // Запоминаем последнее отправленное сообщение. $user->last = $last; $user->save(); } } $ctx->db->commit(); }
protected function sendEmail($to, $mode) { if (empty($to)) { Logger::log($mode . ' not sent: email not found', 'cart'); return; } if (!($xslt = Context::last()->config->get("modules/cart/{$mode}_templates"))) { Logger::log($mode . ' not sent: XSLT file not set', 'cart'); return; } if ($html = xslt::process($this->getXML(), $xslt)) { $subject = t('Заказ на %host', array('%host' => MCMS_HOST_NAME)); BebopMimeMail::send(null, $to, $subject, $html); } }
/** * @mcms_message ru.molinos.cms.hook.node */ public static function hookNodeUpdate(Context $ctx, Node $node, $op) { $config = $ctx->config->get('modules/moderator'); if (!empty($config['skip_types']) and in_array($node->class, $config['skip_types'])) { return; } // Некоторые известные типы не модерируем. if (in_array($node->class, array('domain', 'widget', 'user', 'group', 'field', 'cronstats'))) { return; } // Пользователь сам себе публикатор. if ($ctx->user->hasAccess(ACL::PUBLISH, $node->class)) { return; } switch ($op) { case 'update': $prepend = 'Пользователь %user <strong>изменил</strong> документ типа «%type»:'; break; case 'create': $prepend = 'Пользователь %user <strong>создал</strong> документ типа «%type»:'; break; case 'delete': $prepend = 'Пользователь %user <strong>удалил</strong> (в корзину) документ типа «%type»:'; break; case 'restore': $prepend = 'Пользователь %user <strong>восстановил из корзины</strong> документ типа «%type»:'; break; case 'publish': $prepend = 'Пользователь %user просит <strong>опубликовать</strong> документ типа «%type»:'; $node->onSave("UPDATE `node` SET `published` = 0 WHERE `id` = %ID%"); break; case 'unpublish': $prepend = 'Пользователь %user просит <strong>скрыть</strong> документ типа «%type»:'; $node->onSave("UPDATE `node` SET `published` = 1 WHERE `id` = %ID%"); break; default: return; } $user = $ctx->user->getNode(); $body = '<p>' . t($prepend, array('%user' => $user ? $user->getName() : null, '%type' => isset($schema['title']) ? $schema['title'] : $node->class)) . '</p>' . self::getNodeBody($node); if (count($to = self::getRecipients($ctx))) { $rc = BebopMimeMail::send(null, $to, t('Редакторская активность на сайте %site', array('%site' => MCMS_HOST_NAME)), $body); } }
/** * @mcms_message ru.molinos.cms.cron */ public static function taskRun(Context $ctx) { $parts = array(); if (null !== ($message = self::checkAccessRights($ctx))) { $parts[] = $message; } if (class_exists('UpdateMenu') and $message = UpdateMenu::getMessage()) { $parts[] = $message; } if (null !== ($message = self::checkDbAccess($ctx))) { $parts[] = $message; } if (!empty($parts) and $email = self::getEmail($ctx)) { $subject = t('Отчёт о состоянии %host', array('%host' => MCMS_HOST_NAME)); $body = t('<p>Анализ сайта %host выявил следующие аномалии:</p>!list<p>!signature</p>', array('%host' => MCMS_HOST_NAME, '!list' => '<ol><li>' . join('</li><li>', $parts) . '</li></ol>', '!signature' => mcms::getSignature())); if (!BebopMimeMail::send(null, $email, $subject, $body)) { throw new RuntimeException(t('Не удалось отправить почту администратору сайта.')); } } }
/** * Восстановление пароля. * * @param Context $ctx * @param array $params * @return void * @mcms_message ru.molinos.cms.auth.process.basicpw */ public static function on_register(Context $ctx, array $params) { if (false === strpos($params['email'], '@')) { throw new BadRequestException(t('Неверно введён почтовый адрес.')); } $node = Node::load(array('class' => 'user', 'name' => $params['email'])); if ($node->deleted) { throw new ForbiddenException(t('Этот пользователь был удалён.')); } elseif (!$node->published) { throw new ForbiddenException(t('Этот пользователь заблокирован.')); } $salt = md5($_SERVER['REMOTE_ADDR'] . microtime(true) . $node->name . rand()); $node->otp = $salt; $ctx->db->beginTransaction(); $node->save(); $ctx->db->commit(); $xml = html::em('request', array('email' => $node->name, 'host' => MCMS_HOST_NAME, 'base' => $ctx->url()->getBase($ctx), 'link' => 'authbasic/restore.rpc?email=' . urlencode($node->name) . '&otp=' . urlencode($salt))); $xsl = $ctx->config->get('modules/authbasic/restoretpl', os::path('lib', 'modules', 'authbasic', 'restore.xsl')); $html = xslt::transform($xml, $xsl, null); BebopMimeMail::send(null, $node->name, t('Восстановление пароля'), $html); }
public function save() { if (empty($this->id)) { try { $dst = Node::load(array('class' => 'user', 'id' => $this->re)); if (!empty($dst->email)) { $email = $dst->email; } elseif (false !== strstr($dst->name, '@')) { $email = $dst->name; } if (!empty($email) and class_exists('BebopMimeMail')) { BebopMimeMail::send(null, $email, $this->name, $this->text); $this->data['sent'] = 1; } // Сохраняем в базе только если пользователь найден. // Чтобы можно было спокойно вызывать mcms::mail() для // любых объектов, не парясь с проверкой на class=user. return parent::save(); } catch (ObjectNotFoundException $e) { } } }
/** * Отправляет сообщение об ошибке куда следует. */ private static function send_error($message = "undefined", $extra = null) { Logger::trace($message); if (class_exists('BebopMimeMail')) { $message = wordwrap(strip_tags($message), 75, "\n "); $referer = empty($_SERVER['HTTP_REFERER']) ? null : "Referer: {$_SERVER['HTTP_REFERER']}\n"; $subject = "Error at " . MCMS_HOST_NAME; $content = "<pre>Message: {$message}\nMethod: {$_SERVER['REQUEST_METHOD']}\n" . "URL: http://" . MCMS_HOST_NAME . MCMS_REQUEST_URI . "\n{$extra}\n{$referer}" . "Backtrace follows.\n\n" . Logger::backtrace() . '</pre>'; BebopMimeMail::send(null, Context::last()->config->get('main/errors/mail'), $subject, $content); } }