}
/**
+ * Send a reminder and record doing so
*
- * @param type $object
- * @param type $subject
- * @param type $day
+ * @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)
{
- common_debug("QQQQQ sendReminder() enter ... ", __FILE__);
-
- $title = "{$type}-{$day}";
-
- common_debug("QQQQ title = {$title}", __FILE__);
+ // 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)) {
- common_debug("Recording reminder record for {$object->address}", __FILE__);
try {
Email_reminder::recordReminder($type, $object, $day);
} catch (Exception $e) {
}
}
- common_debug("QQQQQ sendReminder() exit ... ", __FILE__);
-
return true;
}
/**
+ * Send a real live email reminder
*
- * @param type $object
- * @param type $subject
- * @param type $title
- * @return type
+ * @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) {
+ static function sendReminderEmail($type, $object, $subject, $title = null) {
$sitename = common_config('site', 'name');
$recipients = array($object->address);
$template = DocFile::forTitle($title, DocFile::mailPaths());
- $body = $template->toHTML(
- array(
- 'confirmurl' => $confirmUrl,
- 'inviter' => $inviter,
- 'inviterurl' => $inviterUrl
- // @todo private invitation message
- )
- );
+ $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);
}
);
return true;
}
-
+
}
class Email_reminder extends Managed_DataObject
{
- const INVITE_REMINDER = 'invite'; // @todo Move this to the invite reminder handler
-
public $__table = 'email_reminder';
public $type; // type of reminder
}
/**
+ * Do we need to send a reminder?
*
- * @param type $type
- * @param type $confirm
- * @param type $day
- * @return type
+ * @param string $type type of reminder
+ * @param Object $object an object with a 'code' property
+ * (Confirm_address or Invitation)
+ * @param int $days Number of days after the code was created
+ * @return boolean true if any Email_reminder records were found
*/
- static function needsReminder($type, $confirm, $days) {
+ static function needsReminder($type, $object, $days = null) {
$reminder = new Email_reminder();
$reminder->type = $type;
- $reminder->code = $confirm->code;
- $reminder->days = $days;
-
- $result = $reminder->find(true);
+ $reminder->code = $object->code;
+ if (!empty($days)) {
+ $reminder->days = $days;
+ }
+ $result = $reminder->find();
- if (empty($result)) {
- return true;
+ if (!empty($result)) {
+ return false;
}
- return false;
+ return true;
}
/**
+ * Record a record of sending the reminder
*
- * @param type $type
- * @param type $confirm
- * @param type $day
- * @return type
+ * @param string $type type of reminder
+ * @param Object $object an object with a 'code' property
+ * (Confirm_address or Invitation)
+ * @param int $days Number of days after the code was created
+ * @return int $result row ID of the new reminder record
*/
- static function recordReminder($type, $confirm, $days) {
+ static function recordReminder($type, $object, $days) {
$reminder = new Email_reminder();
$reminder->type = $type;
- $reminder->code = $confirm->code;
+ $reminder->code = $object->code;
$reminder->days = $days;
$reminder->sent = $reminder->created = common_sql_now();
$result = $reminder->insert();
/**
* Handle the site
*
- * @param string $reminderType type of reminder to send
+ * @param array $remitem type of reminder to send and any special options
* @return boolean true on success, false on failure
*/
- function handle($reminderType)
+ function handle($remitem)
{
+ list($type, $opts) = $remitem;
+
$qm = QueueManager::get();
try {
- switch($reminderType) {
+ switch($type) {
case UserConfirmRegReminderHandler::REGISTER_REMINDER:
$confirm = new Confirm_address();
- $confirm->address_type = $object;
+ $confirm->address_type = $type;
$confirm->find();
while ($confirm->fetch()) {
try {
- $qm->enqueue($confirm, 'uregrem');
+ $qm->enqueue(array($confirm, $opts), 'uregrem');
} catch (Exception $e) {
common_log(LOG_WARNING, $e->getMessage());
continue;
$invitation->find();
while ($invitation->fetch()) {
try {
- $qm->enqueue($invitation, 'uinvrem');
+ $qm->enqueue(array($invitation, $opts), 'uinvrem');
} catch (Exception $e) {
common_log(LOG_WARNING, $e->getMessage());
continue;
*
* @todo abstract this bit further
*
- * @param Confirm_address $confirm
+ * @param array $regitem confirmation address and any special options
* @return boolean success value
*/
- function sendNextReminder($confirm)
+ function sendNextReminder($regitem)
{
+ list($confirm, $opts) = $regitem;
+
$regDate = strtotime($confirm->modified); // Seems like my best bet
$now = strtotime('now');
// Days since registration
$days = ($now - $regDate) / 86499; // 60*60*24 = 86499
+ // $days = ($now - $regDate) / 120; // Two mins, good for testing
+
+ if ($days > 7 && isset($opts['onetime'])) {
+ // Don't send the reminder if we're past the normal reminder window and
+ // we've already pestered her at all before
+ if (Email_reminder::needsReminder(self::REGISTER_REMINDER, $confirm)) {
+ common_log(LOG_INFO, "Sending one-time registration confirmation reminder to {$confirm->address}", __FILE__);
+ $subject = _m("One time reminder - please confirm your registration!");
+ return EmailReminderPlugin::sendReminder(
+ self::REGISTER_REMINDER,
+ $confirm,
+ $subject,
+ -1 // special one-time indicator
+ );
+ }
+ }
// Welcome to one of the ugliest switch statement I've ever written
self::REGISTER_REMINDER,
$confirm,
$subject,
- 1);
+ 1
+ );
} else {
return true;
}
*
* @todo Abstract this stuff further
*
- * @param Invitation $invitation
+ * @param array $invitem Invitation obj and any special options
* @return boolean success value
*/
- function sendNextReminder($invitation)
+ function sendNextReminder($invitem)
{
+ list($invitation, $opts) = $invitem;
+
$invDate = strtotime($invitation->created);
$now = strtotime('now');
-
+
// Days since first invitation was sent
$days = ($now - $invDate) / 86499; // 60*60*24 = 86499
+ // $days = ($now - $regDate) / 120; // Two mins, good for testing
$siteName = common_config('site', 'name');
+ if ($days > 7 && isset($opts['onetime'])) {
+ // Don't send the reminder if we're past the normal reminder window and
+ // we've already pestered her at all before
+ if (Email_reminder::needsReminder(self::INVITE_REMINDER, $invitation)) {
+ common_log(LOG_INFO, "Sending one-time invitation reminder to {$invitation->address}", __FILE__);
+ $subject = _m("One time reminder - you have been invited to join {$siteName}!");
+ return EmailReminderPlugin::sendReminder(
+ self::INVITE_REMINDER,
+ $invitation,
+ $subject,
+ -1 // special one-time indicator
+ );
+ }
+ }
+
switch($days) {
case ($days > 1 && $days < 2):
if (Email_reminder::needsReminder(self::INVITE_REMINDER, $invitation, 1)) {
common_log(LOG_INFO, "Sending one day invitation reminder to {$invitation->address}", __FILE__);
- $subject = _m("Reminder - You have been invited to join {$siteName}!");
+ $subject = _m("Reminder - you have been invited to join {$siteName}!");
return EmailReminderPlugin::sendReminder(
self::INVITE_REMINDER,
$invitation,
} else {
return true;
}
- break;
+ break;
}
return true;
}
--- /dev/null
+Special ONE TIME reminder...
+
+%%arg.inviter%% has invited you to join them on %%site.name%%.
+
+%%site.name%% is a micro-blogging service that lets you keep
+up-to-date with people you know and people who interest you.
+
+You can also share news about yourself, your thoughts, or your life
+online with people who know about you.
+
+It's great for meeting new people who share your interests.
+
+You can see %%arg.inviter%%'s profile page on %%site.name%% here:
+
+> [%%arg.inviterurl%%](%%arg.inviterurl%%)
+
+If you'd like to try the service, click on the link below to accept
+the invitation.
+
+> [%%arg.confirmurl%%](%%arg.confirmurl%%)
+
+If not, you can ignore this message. Thanks for your patience and your time.
+
+Sincerely,
+
+%%site.name%%
-Hey, it's been a whole day!
+Reminder:
Someone (probably you) has requested an account on %%site.name%% using this email address.
--- /dev/null
+Hi, this is a special ONE TIME reminder.
+
+Someone (probably you) has requested an account on %%site.name%% using this email address.
+
+To confirm the address, click the following URL or copy it into the address bar of your browser.
+
+> [%%arg.confirmurl%%](%%arg.confirmurl%%)
+
+If it was not you, you can safely ignore this message.
define('INSTALLDIR', realpath(dirname(__FILE__) . '/../../..'));
-$shortoptions = 't:e:au';
-$longoptions = array('type=', 'email=', 'all', 'universe');
+$shortoptions = 't:e:auo';
+$longoptions = array('type=', 'email=', 'all', 'universe', 'onetime');
$helptext = <<<END_OF_SENDEMAILREMINDER_HELP
sendemailreminder.php [options]
-e --email email address to send reminder to
-a --all send reminder to all addresses
-u --universe send reminder to all addresses on all sites
+ -o --onetime send one-time reminder to older addresses
END_OF_SENDEMAILREMINDER_HELP;
);
$type = null;
+$opts = array(); // special options like "onetime"
if (have_option('t', 'type')) {
$type = trim(get_option_value('t', 'type'));
exit(1);
}
+if (have_option('o', 'onetime')) {
+ $opts['onetime'] = true;
+ if (!$quiet) { print "Special one-time reminder mode.\n"; }
+}
+
$reminders = array();
switch($type) {
$qm = QueueManager::get();
foreach ($reminders as $reminder) {
extract($reminder);
- $qm->enqueue($type, 'siterem');
+ $qm->enqueue(array($type, $opts), 'siterem');
if (!$quiet) { print "Sent pending {$type} reminders to all unconfirmed addresses in the known universe.\n"; }
}
}
if (empty($result)) {
throw new Exception("No confirmation code found for {$address}.");
}
- $qm->enqueue($confirm, $utransport);
+ $qm->enqueue(array($confirm, $opts), $utransport);
if (!$quiet) { print "Sent all pending {$type} reminder to {$address}.\n"; }
}
} else if (have_option('a', 'all')) {
foreach ($reminders as $reminder) {
extract($reminder);
- $qm->enqueue($type, 'siterem');
+ $qm->enqueue(array($type, $opts), 'siterem');
if (!$quiet) { print "Sent pending {$type} reminders to all unconfirmed addresses on the site.\n"; }
}
} else {