Add ability to send special one-time reminders

This commit is contained in:
Zach Copley 2011-06-20 12:58:14 -07:00
parent 96b9ecaf07
commit aebab2742a
9 changed files with 155 additions and 65 deletions

View File

@ -114,22 +114,25 @@ class EmailReminderPlugin extends Plugin
} }
/** /**
* Send a reminder and record doing so
* *
* @param type $object * @param string $type type of reminder
* @param type $subject * @param mixed $object Confirm_address or Invitation object
* @param type $day * @param string $subject subjct of the email reminder
* @param int $day number of days
*/ */
static function sendReminder($type, $object, $subject, $day) static function sendReminder($type, $object, $subject, $day)
{ {
common_debug("QQQQQ sendReminder() enter ... ", __FILE__); // XXX: -1 is a for the special one-time reminder (maybe 30) would be
// better? Like >= 30 days?
$title = "{$type}-{$day}"; if ($day == -1) {
$title = "{$type}-onetime";
common_debug("QQQQ title = {$title}", __FILE__); } else {
$title = "{$type}-{$day}";
}
// Record the fact that we sent a reminder // Record the fact that we sent a reminder
if (self::sendReminderEmail($type, $object, $subject, $title)) { if (self::sendReminderEmail($type, $object, $subject, $title)) {
common_debug("Recording reminder record for {$object->address}", __FILE__);
try { try {
Email_reminder::recordReminder($type, $object, $day); Email_reminder::recordReminder($type, $object, $day);
} catch (Exception $e) { } catch (Exception $e) {
@ -138,19 +141,21 @@ class EmailReminderPlugin extends Plugin
} }
} }
common_debug("QQQQQ sendReminder() exit ... ", __FILE__);
return true; return true;
} }
/** /**
* Send a real live email reminder
* *
* @param type $object * @todo This would probably be better as two or more sep functions
* @param type $subject *
* @param type $title * @param string $type type of reminder
* @return type * @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'); $sitename = common_config('site', 'name');
$recipients = array($object->address); $recipients = array($object->address);
@ -177,14 +182,15 @@ class EmailReminderPlugin extends Plugin
$template = DocFile::forTitle($title, DocFile::mailPaths()); $template = DocFile::forTitle($title, DocFile::mailPaths());
$body = $template->toHTML( $blankfillers = array('confirmurl' => $confirmUrl);
array(
'confirmurl' => $confirmUrl, if ($type == UserInviteReminderHandler::INVITE_REMINDER) {
'inviter' => $inviter, $blankfillers['inviter'] = $inviter;
'inviterurl' => $inviterUrl $blankfillers['inviterurl'] = $inviterUrl;
// @todo private invitation message // @todo private invitation message?
) }
);
$body = $template->toHTML($blankfillers);
return mail_send($recipients, $headers, $body); return mail_send($recipients, $headers, $body);
} }
@ -205,5 +211,5 @@ class EmailReminderPlugin extends Plugin
); );
return true; return true;
} }
} }

View File

@ -28,8 +28,6 @@
class Email_reminder extends Managed_DataObject class Email_reminder extends Managed_DataObject
{ {
const INVITE_REMINDER = 'invite'; // @todo Move this to the invite reminder handler
public $__table = 'email_reminder'; public $__table = 'email_reminder';
public $type; // type of reminder public $type; // type of reminder
@ -56,40 +54,45 @@ class Email_reminder extends Managed_DataObject
} }
/** /**
* Do we need to send a reminder?
* *
* @param type $type * @param string $type type of reminder
* @param type $confirm * @param Object $object an object with a 'code' property
* @param type $day * (Confirm_address or Invitation)
* @return type * @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 = new Email_reminder();
$reminder->type = $type; $reminder->type = $type;
$reminder->code = $confirm->code; $reminder->code = $object->code;
$reminder->days = $days; if (!empty($days)) {
$reminder->days = $days;
}
$result = $reminder->find();
$result = $reminder->find(true); if (!empty($result)) {
return false;
if (empty($result)) {
return true;
} }
return false; return true;
} }
/** /**
* Record a record of sending the reminder
* *
* @param type $type * @param string $type type of reminder
* @param type $confirm * @param Object $object an object with a 'code' property
* @param type $day * (Confirm_address or Invitation)
* @return type * @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 = new Email_reminder();
$reminder->type = $type; $reminder->type = $type;
$reminder->code = $confirm->code; $reminder->code = $object->code;
$reminder->days = $days; $reminder->days = $days;
$reminder->sent = $reminder->created = common_sql_now(); $reminder->sent = $reminder->created = common_sql_now();
$result = $reminder->insert(); $result = $reminder->insert();

View File

@ -60,22 +60,24 @@ class SiteConfirmReminderHandler extends QueueHandler
/** /**
* Handle the site * 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 * @return boolean true on success, false on failure
*/ */
function handle($reminderType) function handle($remitem)
{ {
list($type, $opts) = $remitem;
$qm = QueueManager::get(); $qm = QueueManager::get();
try { try {
switch($reminderType) { switch($type) {
case UserConfirmRegReminderHandler::REGISTER_REMINDER: case UserConfirmRegReminderHandler::REGISTER_REMINDER:
$confirm = new Confirm_address(); $confirm = new Confirm_address();
$confirm->address_type = $object; $confirm->address_type = $type;
$confirm->find(); $confirm->find();
while ($confirm->fetch()) { while ($confirm->fetch()) {
try { try {
$qm->enqueue($confirm, 'uregrem'); $qm->enqueue(array($confirm, $opts), 'uregrem');
} catch (Exception $e) { } catch (Exception $e) {
common_log(LOG_WARNING, $e->getMessage()); common_log(LOG_WARNING, $e->getMessage());
continue; continue;
@ -87,7 +89,7 @@ class SiteConfirmReminderHandler extends QueueHandler
$invitation->find(); $invitation->find();
while ($invitation->fetch()) { while ($invitation->fetch()) {
try { try {
$qm->enqueue($invitation, 'uinvrem'); $qm->enqueue(array($invitation, $opts), 'uinvrem');
} catch (Exception $e) { } catch (Exception $e) {
common_log(LOG_WARNING, $e->getMessage()); common_log(LOG_WARNING, $e->getMessage());
continue; continue;

View File

@ -64,16 +64,34 @@ class UserConfirmRegReminderHandler extends UserReminderHandler {
* *
* @todo abstract this bit further * @todo abstract this bit further
* *
* @param Confirm_address $confirm * @param array $regitem confirmation address and any special options
* @return boolean success value * @return boolean success value
*/ */
function sendNextReminder($confirm) function sendNextReminder($regitem)
{ {
list($confirm, $opts) = $regitem;
$regDate = strtotime($confirm->modified); // Seems like my best bet $regDate = strtotime($confirm->modified); // Seems like my best bet
$now = strtotime('now'); $now = strtotime('now');
// Days since registration // Days since registration
$days = ($now - $regDate) / 86499; // 60*60*24 = 86499 $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 // Welcome to one of the ugliest switch statement I've ever written
@ -86,7 +104,8 @@ class UserConfirmRegReminderHandler extends UserReminderHandler {
self::REGISTER_REMINDER, self::REGISTER_REMINDER,
$confirm, $confirm,
$subject, $subject,
1); 1
);
} else { } else {
return true; return true;
} }

View File

@ -62,24 +62,42 @@ class UserInviteReminderHandler extends UserReminderHandler {
* *
* @todo Abstract this stuff further * @todo Abstract this stuff further
* *
* @param Invitation $invitation * @param array $invitem Invitation obj and any special options
* @return boolean success value * @return boolean success value
*/ */
function sendNextReminder($invitation) function sendNextReminder($invitem)
{ {
list($invitation, $opts) = $invitem;
$invDate = strtotime($invitation->created); $invDate = strtotime($invitation->created);
$now = strtotime('now'); $now = strtotime('now');
// Days since first invitation was sent // Days since first invitation was sent
$days = ($now - $invDate) / 86499; // 60*60*24 = 86499 $days = ($now - $invDate) / 86499; // 60*60*24 = 86499
// $days = ($now - $regDate) / 120; // Two mins, good for testing
$siteName = common_config('site', 'name'); $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) { switch($days) {
case ($days > 1 && $days < 2): case ($days > 1 && $days < 2):
if (Email_reminder::needsReminder(self::INVITE_REMINDER, $invitation, 1)) { if (Email_reminder::needsReminder(self::INVITE_REMINDER, $invitation, 1)) {
common_log(LOG_INFO, "Sending one day invitation reminder to {$invitation->address}", __FILE__); 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( return EmailReminderPlugin::sendReminder(
self::INVITE_REMINDER, self::INVITE_REMINDER,
$invitation, $invitation,
@ -102,7 +120,7 @@ class UserInviteReminderHandler extends UserReminderHandler {
} else { } else {
return true; return true;
} }
break; break;
} }
return true; return true;
} }

View File

@ -0,0 +1,26 @@
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%%

View File

@ -1,4 +1,4 @@
Hey, it's been a whole day! Reminder:
Someone (probably you) has requested an account on %%site.name%% using this email address. Someone (probably you) has requested an account on %%site.name%% using this email address.

View File

@ -0,0 +1,9 @@
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.

View File

@ -20,8 +20,8 @@
define('INSTALLDIR', realpath(dirname(__FILE__) . '/../../..')); define('INSTALLDIR', realpath(dirname(__FILE__) . '/../../..'));
$shortoptions = 't:e:au'; $shortoptions = 't:e:auo';
$longoptions = array('type=', 'email=', 'all', 'universe'); $longoptions = array('type=', 'email=', 'all', 'universe', 'onetime');
$helptext = <<<END_OF_SENDEMAILREMINDER_HELP $helptext = <<<END_OF_SENDEMAILREMINDER_HELP
sendemailreminder.php [options] sendemailreminder.php [options]
@ -31,6 +31,7 @@ Send an email summary of the inbox to users
-e --email email address to send reminder to -e --email email address to send reminder to
-a --all send reminder to all addresses -a --all send reminder to all addresses
-u --universe send reminder to all addresses on all sites -u --universe send reminder to all addresses on all sites
-o --onetime send one-time reminder to older addresses
END_OF_SENDEMAILREMINDER_HELP; END_OF_SENDEMAILREMINDER_HELP;
@ -55,6 +56,7 @@ $types = array(
); );
$type = null; $type = null;
$opts = array(); // special options like "onetime"
if (have_option('t', 'type')) { if (have_option('t', 'type')) {
$type = trim(get_option_value('t', 'type')); $type = trim(get_option_value('t', 'type'));
@ -67,6 +69,11 @@ if (have_option('t', 'type')) {
exit(1); exit(1);
} }
if (have_option('o', 'onetime')) {
$opts['onetime'] = true;
if (!$quiet) { print "Special one-time reminder mode.\n"; }
}
$reminders = array(); $reminders = array();
switch($type) { switch($type) {
@ -91,7 +98,7 @@ if (have_option('u', 'universe')) {
$qm = QueueManager::get(); $qm = QueueManager::get();
foreach ($reminders as $reminder) { foreach ($reminders as $reminder) {
extract($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 (!$quiet) { print "Sent pending {$type} reminders to all unconfirmed addresses in the known universe.\n"; }
} }
} }
@ -111,13 +118,13 @@ if (have_option('u', 'universe')) {
if (empty($result)) { if (empty($result)) {
throw new Exception("No confirmation code found for {$address}."); 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"; } if (!$quiet) { print "Sent all pending {$type} reminder to {$address}.\n"; }
} }
} else if (have_option('a', 'all')) { } else if (have_option('a', 'all')) {
foreach ($reminders as $reminder) { foreach ($reminders as $reminder) {
extract($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"; } if (!$quiet) { print "Sent pending {$type} reminders to all unconfirmed addresses on the site.\n"; }
} }
} else { } else {