. * * @category OnDemand * @package StatusNet * @author Zach Copley * @copyright 2011 StatusNet, Inc. * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 * @link http://status.net/ */ if (!defined('STATUSNET')) { // This check helps protect against security problems; // your code file can't be executed directly from the web. exit(1); } /** * Email reminder plugin * * @category Plugin * @package StatusNet * @author Zach Copley * @copyright 2011 StatusNet, Inc. * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 * @link http://status.net/ */ class EmailReminderPlugin extends Plugin { /** * Set up email_reminder table * * @see Schema * @see ColumnDef * * @return boolean hook value; true means continue processing, false means stop. */ function onCheckSchema() { $schema = Schema::get(); $schema->ensureTable('email_reminder', Email_reminder::schemaDef()); return true; } /** * Load related modules when needed * * @param string $cls Name of the class to be loaded * * @return boolean hook value; true means continue processing, false * means stop. */ function onAutoload($cls) { $base = dirname(__FILE__); $lower = strtolower($cls); $files = array("$base/classes/$cls.php", "$base/lib/$lower.php"); if (substr($lower, -6) == 'action') { $files[] = "$base/actions/" . substr($lower, 0, -6) . ".php"; } foreach ($files as $file) { if (file_exists($file)) { include_once $file; return false; } } return true; } /** * Register our queue handlers * * @param QueueManager $qm Current queue manager * * @return boolean hook value */ function onEndInitializeQueueManager($qm) { $qm->connect('siterem', 'SiteConfirmReminderHandler'); $qm->connect('uregrem', 'UserConfirmRegReminderHandler'); $qm->connect('uinvrem', 'UserInviteReminderHandler'); return true; } function onEndDocFileForTitle($title, $paths, &$filename) { if (empty($filename)) { $filename = dirname(__FILE__) . '/mail-src/' . $title; return false; } return true; } /** * Send a reminder and record doing so * * @param string $type type of reminder * @param mixed $object Confirm_address or Invitation object * @param string $subject subjct of the email reminder * @param int $day number of days */ static function sendReminder($type, $object, $subject, $day) { // XXX: -1 is a for the special one-time reminder (maybe 30) would be // better? Like >= 30 days? if ($day == -1) { $title = "{$type}-onetime"; } else { $title = "{$type}-{$day}"; } // Record the fact that we sent a reminder if (self::sendReminderEmail($type, $object, $subject, $title)) { try { Email_reminder::recordReminder($type, $object, $day); } catch (Exception $e) { // oh noez common_log(LOG_ERR, $e->getMessage(), __FILE__); } } return true; } /** * Send a real live email reminder * * @todo This would probably be better as two or more sep functions * * @param string $type type of reminder * @param mixed $object Confirm_address or Invitation object * @param string $subject subjct of the email reminder * @param string $title title of the email reminder * @return boolean true if the email subsystem doesn't explode */ static function sendReminderEmail($type, $object, $subject, $title = null) { $sitename = common_config('site', 'name'); $recipients = array($object->address); $inviter = null; $inviterurl = null; if ($type == UserInviteReminderHandler::INVITE_REMINDER) { $user = User::staticGet($object->user_id); if (!empty($user)) { $profile = $user->getProfile(); $inviter = $profile->getBestName(); $inviterUrl = $profile->profileurl; } } $headers['From'] = mail_notify_from(); $headers['To'] = trim($object->address); // TRANS: Subject for confirmation e-mail. // TRANS: %s is the StatusNet sitename. $headers['Subject'] = $subject; $headers['Content-Type'] = 'text/html; charset=UTF-8'; $confirmUrl = common_local_url('register', array('code' => $object->code)); $template = DocFile::forTitle($title, DocFile::mailPaths()); $blankfillers = array('confirmurl' => $confirmUrl); if ($type == UserInviteReminderHandler::INVITE_REMINDER) { $blankfillers['inviter'] = $inviter; $blankfillers['inviterurl'] = $inviterUrl; // @todo private invitation message? } $body = $template->toHTML($blankfillers); return mail_send($recipients, $headers, $body); } /** * * @param type $versions * @return type */ function onPluginVersion(&$versions) { $versions[] = array( 'name' => 'EmailReminder', 'version' => STATUSNET_VERSION, 'author' => 'Zach Copley', 'homepage' => 'http://status.net/wiki/Plugin:EmailReminder', 'rawdescription' => _m('Send email reminders for various things.') ); return true; } }