* @link http://status.net/
*/
-if (!defined('STATUSNET') && !defined('LACONICA')) {
- exit(1);
-}
+if (!defined('GNUSOCIAL')) { exit(1); }
require_once 'Mail.php';
function mail_backend()
{
static $backend = null;
+ global $_PEAR;
if (!$backend) {
- $backend = Mail::factory(common_config('mail', 'backend'),
- (common_config('mail', 'params')) ?
- common_config('mail', 'params') :
- array());
- if (PEAR::isError($backend)) {
- common_server_error($backend->getMessage(), 500);
+ $mail = new Mail();
+ $backend = $mail->factory(common_config('mail', 'backend'),
+ common_config('mail', 'params') ?: array());
+ if ($_PEAR->isError($backend)) {
+ throw new EmailException($backend->getMessage(), $backend->getCode());
}
}
return $backend;
*/
function mail_send($recipients, $headers, $body)
{
- // XXX: use Mail_Queue... maybe
- $backend = mail_backend();
- if (!isset($headers['Content-Type'])) {
- $headers['Content-Type'] = 'text/plain; charset=UTF-8';
- }
- assert($backend); // throws an error if it's bad
- $sent = $backend->send($recipients, $headers, $body);
- if (PEAR::isError($sent)) {
- common_log(LOG_ERR, 'Email error: ' . $sent->getMessage());
+ global $_PEAR;
+
+ try {
+ // XXX: use Mail_Queue... maybe
+ $backend = mail_backend();
+
+ if (!isset($headers['Content-Type'])) {
+ $headers['Content-Type'] = 'text/plain; charset=UTF-8';
+ }
+
+ assert($backend); // throws an error if it's bad
+ $sent = $backend->send($recipients, $headers, $body);
+ if ($_PEAR->isError($sent)) {
+ throw new EmailException($sent->getMessage(), $sent->getCode());
+ }
+ return true;
+ } catch (PEAR_Exception $e) {
+ common_log(
+ LOG_ERR,
+ "Unable to send email - '{$e->getMessage()}'. "
+ . 'Is your mail subsystem set up correctly?'
+ );
return false;
}
- return true;
}
/**
*
* @return boolean success flag
*/
-function mail_to_user(&$user, $subject, $body, $headers=array(), $address=null)
+function mail_to_user($user, $subject, $body, $headers=array(), $address=null)
{
if (!$address) {
$address = $user->email;
$recipients = $address;
$profile = $user->getProfile();
+ $headers['Date'] = date("r", time());
$headers['From'] = mail_notify_from();
$headers['To'] = $profile->getBestName() . ' <' . $address . '>';
$headers['Subject'] = $subject;
return mail_send($recipients, $headers, $body);
}
-/**
- * Send an email to confirm a user's control of an email address
- *
- * @param User $user User claiming the email address
- * @param string $code Confirmation code
- * @param string $nickname Nickname of user
- * @param string $address email address to confirm
- *
- * @see common_confirmation_code()
- *
- * @return success flag
- */
-function mail_confirm_address($user, $code, $nickname, $address, $url=null)
-{
- if (empty($url)) {
- $url = common_local_url('confirmaddress', array('code' => $code));
- }
-
- // TRANS: Subject for address confirmation email.
- $subject = _('Email address confirmation');
-
- // TRANS: Body for address confirmation email.
- // TRANS: %1$s is the addressed user's nickname, %2$s is the StatusNet sitename,
- // TRANS: %3$s is the URL to confirm at.
- $body = sprintf(_("Hey, %1\$s.\n\n".
- "Someone just entered this email address on %2\$s.\n\n" .
- "If it was you, and you want to confirm your entry, ".
- "use the URL below:\n\n\t%3\$s\n\n" .
- "If not, just ignore this message.\n\n".
- "Thanks for your time, \n%2\$s\n"),
- $nickname,
- common_config('site', 'name'),
- $url);
-
- $headers = array();
-
- return mail_to_user($user, $subject, $body, $headers, $address);
-}
-
/**
* notify a user of subscription by another user
*
$name = $profile->getBestName();
- $long_name = ($other->fullname) ?
- ($other->fullname . ' (' . $other->nickname . ')') : $other->nickname;
+ $long_name = $other->getFancyName();
$recipients = $listenee->email;
$user = new User();
$UT = common_config('db','type')=='pgsql'?'"user"':'user';
+ $replies = $notice->getReplies();
$user->query('SELECT nickname, smsemail, incomingemail ' .
- "FROM $UT JOIN subscription " .
+ "FROM $UT LEFT OUTER JOIN subscription " .
"ON $UT.id = subscription.subscriber " .
- 'WHERE subscription.subscribed = ' . $notice->profile_id . ' ' .
+ 'AND subscription.subscribed = ' . $notice->profile_id . ' ' .
'AND subscription.subscribed != subscription.subscriber ' .
+ // Users (other than the sender) who `want SMS notices':
+ "WHERE $UT.id != " . $notice->profile_id . ' ' .
"AND $UT.smsemail IS NOT null " .
"AND $UT.smsnotify = 1 " .
- 'AND subscription.sms = 1 ');
+ // ... where either the user _is_ subscribed to the sender
+ // (any of the "subscription" fields IS NOT null)
+ // and wants to get SMS for all of this scribe's notices...
+ 'AND (subscription.sms = 1 ' .
+ // ... or where the user was mentioned in
+ // or replied-to with the notice:
+ ($replies ? sprintf("OR $UT.id in (%s)",
+ implode(',', $replies))
+ : '') .
+ ')');
while ($user->fetch()) {
common_log(LOG_INFO,
function mail_notify_message($message, $from=null, $to=null)
{
if (is_null($from)) {
- $from = User::staticGet('id', $message->from_profile);
+ $from = User::getKV('id', $message->from_profile);
}
if (is_null($to)) {
- $to = User::staticGet('id', $message->to_profile);
+ $to = User::getKV('id', $message->to_profile);
}
if (is_null($to->email) || !$to->emailnotifymsg) {
}
/**
- * Notify a user that one of their notices has been chosen as a 'fave'
- *
- * Doesn't check that the user has an email address nor if they
- * want to receive notification of faves. Maybe this happens higher
- * up the stack...?
+ * Notify a user that they have received an "attn:" message AKA "@-reply"
*
- * @param User $other The user whose notice was faved
- * @param User $user The user who faved the notice
- * @param Notice $notice The notice that was faved
+ * @param Profile $rcpt The Profile who recevied the notice, should be a local user
+ * @param Notice $notice The notice that was sent
*
* @return void
*/
-function mail_notify_fave($other, $user, $notice)
+function mail_notify_attn(Profile $rcpt, Notice $notice)
{
- if (!$user->hasRight(Right::EMAILONFAVE)) {
+ if (!$rcpt->isLocal()) {
return;
}
- $profile = $user->getProfile();
- if ($other->hasBlocked($profile)) {
- // If the author has blocked us, don't spam them with a notification.
+ $sender = $notice->getProfile();
+ if ($rcpt->sameAs($sender)) {
return;
}
- $bestname = $profile->getBestName();
-
- common_switch_locale($other->language);
-
- // TRANS: Subject for favorite notification e-mail.
- // TRANS: %1$s is the adding user's long name, %2$s is the adding user's nickname.
- $subject = sprintf(_('%1$s (@%2$s) added your notice as a favorite'), $bestname, $user->nickname);
-
- // TRANS: Body for favorite notification e-mail.
- // TRANS: %1$s is the adding user's long name, $2$s is the date the notice was created,
- // TRANS: %3$s is a URL to the faved notice, %4$s is the faved notice text,
- // TRANS: %5$s is a URL to all faves of the adding user, %6$s is the StatusNet sitename,
- // TRANS: %7$s is the adding user's nickname.
- $body = sprintf(_("%1\$s (@%7\$s) just added your notice from %2\$s".
- " as one of their favorites.\n\n" .
- "The URL of your notice is:\n\n" .
- "%3\$s\n\n" .
- "The text of your notice is:\n\n" .
- "%4\$s\n\n" .
- "You can see the list of %1\$s's favorites here:\n\n" .
- "%5\$s"),
- $bestname,
- common_exact_date($notice->created),
- common_local_url('shownotice',
- array('notice' => $notice->id)),
- $notice->content,
- common_local_url('showfavorites',
- array('nickname' => $user->nickname)),
- common_config('site', 'name'),
- $user->nickname) .
- mail_footer_block();
-
- $headers = _mail_prepare_headers('fave', $other->nickname, $user->nickname);
-
- common_switch_locale();
- mail_to_user($other, $subject, $body, $headers);
-}
-
-/**
- * Notify a user that they have received an "attn:" message AKA "@-reply"
- *
- * @param User $user The user who recevied the notice
- * @param Notice $notice The notice that was sent
- *
- * @return void
- */
-function mail_notify_attn($user, $notice)
-{
- if (!$user->email || !$user->emailnotifyattn) {
+ // See if the notice's author who mentions this user is sandboxed
+ if (!$sender->hasRight(Right::EMAILONREPLY)) {
return;
}
- $sender = $notice->getProfile();
-
- if ($sender->id == $user->id) {
+ // If the author has blocked the author, don't spam them with a notification.
+ if ($rcpt->hasBlocked($sender)) {
return;
}
- if (!$sender->hasRight(Right::EMAILONREPLY)) {
+ $user = $rcpt->getUser();
+ if (!$user->receivesEmailNotifications()) {
return;
}
- $bestname = $sender->getBestName();
-
common_switch_locale($user->language);
if ($notice->hasConversation()) {
$conversationUrl = common_local_url('conversation',
- array('id' => $notice->conversation)).'#notice-'.$notice->id;
+ array('id' => $notice->conversation)).'#notice-'.$notice->getID();
// TRANS: Line in @-reply notification e-mail. %s is conversation URL.
$conversationEmailText = sprintf(_("The full conversation can be read here:\n\n".
"\t%s"), $conversationUrl) . "\n\n";
}
// TRANS: E-mail subject for notice notification.
- // TRANS: %1$s is the sending user's long name, %2$s is the adding user's nickname.
- $subject = sprintf(_('%1$s (@%2$s) sent a notice to your attention'), $bestname, $sender->nickname);
+ // TRANS: %1$s is the "fancy name" for a profile.
+ $subject = sprintf(_('%1$s sent a notice to your attention'), $sender->getFancyName());
// TRANS: Body of @-reply notification e-mail.
// TRANS: %1$s is the sending user's name, $2$s is the StatusNet sitename,
$sender->getFancyName(),//%1
common_config('site', 'name'),//%2
common_local_url('shownotice',
- array('notice' => $notice->id)),//%3
- $notice->content,//%4
+ array('notice' => $notice->getID())),//%3
+ $notice->getContent(),//%4
$conversationEmailText,//%5
common_local_url('newnotice',
- array('replyto' => $sender->nickname, 'inreplyto' => $notice->id)),//%6
+ array('replyto' => $sender->getNickname(), 'inreplyto' => $notice->getID())),//%6
common_local_url('replies',
- array('nickname' => $user->nickname))) . //%7
+ array('nickname' => $rcpt->getNickname()))) . //%7
mail_footer_block();
- $headers = _mail_prepare_headers('mention', $user->nickname, $sender->nickname);
+ $headers = _mail_prepare_headers('mention', $rcpt->getNickname(), $sender->getNickname());
common_switch_locale();
mail_to_user($user, $subject, $body, $headers);
$admin = $group->getAdmins();
while ($admin->fetch()) {
// We need a local user for email notifications...
- $adminUser = User::staticGet('id', $admin->id);
+ $adminUser = User::getKV('id', $admin->id);
// @fixme check for email preference?
if ($adminUser && $adminUser->email) {
// use the recipient's localization
// TRANS: Subject of group join notification e-mail.
// TRANS: %1$s is the joining user's nickname, %2$s is the group name, and %3$s is the StatusNet sitename.
$headers['Subject'] = sprintf(_('%1$s has joined '.
- 'your group %2$s on %3$s.'),
+ 'your group %2$s on %3$s'),
$joiner->getBestName(),
$group->getBestName(),
common_config('site', 'name'));
$admin = $group->getAdmins();
while ($admin->fetch()) {
// We need a local user for email notifications...
- $adminUser = User::staticGet('id', $admin->id);
+ $adminUser = User::getKV('id', $admin->id);
// @fixme check for email preference?
if ($adminUser && $adminUser->email) {
// use the recipient's localization