X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=lib%2Fmail.php;h=da22eb6715a1b2c333ae0cf60f6271f513e373f5;hb=6336248d718fa35bc6766d6fcf031bfd1f8457c2;hp=e8c5d3c4e7374446ab56639dfc7faa03ea18482f;hpb=e862dcdb8a9cfc21cf00513d76f40d20dd3b1b7a;p=quix0rs-gnu-social.git diff --git a/lib/mail.php b/lib/mail.php index e8c5d3c4e7..da22eb6715 100644 --- a/lib/mail.php +++ b/lib/mail.php @@ -30,9 +30,7 @@ * @link http://status.net/ */ -if (!defined('STATUSNET') && !defined('LACONICA')) { - exit(1); -} +if (!defined('GNUSOCIAL')) { exit(1); } require_once 'Mail.php'; @@ -47,14 +45,14 @@ 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; @@ -71,18 +69,30 @@ function mail_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; } /** @@ -143,6 +153,7 @@ function mail_to_user(&$user, $subject, $body, $headers=array(), $address=null) $recipients = $address; $profile = $user->getProfile(); + $headers['Date'] = date("r", time()); $headers['From'] = mail_notify_from(); $headers['To'] = $profile->getBestName() . ' <' . $address . '>'; $headers['Subject'] = $subject; @@ -240,14 +251,13 @@ function mail_subscribe_notify_profile($listenee, $other) $headers['To'] = $name . ' <' . $listenee->email . '>'; // TRANS: Subject of new-subscriber notification e-mail. // TRANS: %1$s is the subscribing user's nickname, %2$s is the StatusNet sitename. - $headers['Subject'] = sprintf(_('%1$s is now listening to '. - 'your notices on %2$s.'), + $headers['Subject'] = sprintf(_('%1$s is now following you on %2$s.'), $other->getBestName(), common_config('site', 'name')); // TRANS: Main body of new-subscriber notification e-mail. // TRANS: %1$s is the subscriber's long name, %2$s is the StatusNet sitename. - $body = sprintf(_('%1$s is now listening to your notices on %2$s.'), + $body = sprintf(_('%1$s is now following you on %2$s.'), $long_name, common_config('site', 'name')) . mail_profile_block($other) . @@ -433,14 +443,26 @@ function mail_broadcast_notice_sms($notice) $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, @@ -448,7 +470,8 @@ function mail_broadcast_notice_sms($notice) __FILE__); $success = mail_send_sms_notice_address($notice, $user->smsemail, - $user->incomingemail); + $user->incomingemail, + $user->nickname); if (!$success) { // XXX: Not sure, but I think that's the right thing to do common_log(LOG_WARNING, @@ -481,7 +504,8 @@ function mail_send_sms_notice($notice, $user) { return mail_send_sms_notice_address($notice, $user->smsemail, - $user->incomingemail); + $user->incomingemail, + $user->nickname); } /** @@ -493,10 +517,11 @@ function mail_send_sms_notice($notice, $user) * @param Notice $notice notice to send * @param string $smsemail email address to send to * @param string $incomingemail email address to set as 'from' + * @param string $nickname nickname to add to beginning * * @return boolean success flag */ -function mail_send_sms_notice_address($notice, $smsemail, $incomingemail) +function mail_send_sms_notice_address($notice, $smsemail, $incomingemail, $nickname) { $to = $nickname . ' <' . $smsemail . '>'; @@ -600,11 +625,11 @@ function mail_notify_nudge($from, $to) 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) { @@ -641,70 +666,7 @@ function mail_notify_message($message, $from=null, $to=null) } /** - * 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...? - * - * @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 - * - * @return void - */ -function mail_notify_fave($other, $user, $notice) -{ - if (!$user->hasRight(Right::EMAILONFAVE)) { - return; - } - - $profile = $user->getProfile(); - if ($other->hasBlocked($profile)) { - // If the author has blocked us, don't spam them with a notification. - 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" + * 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 @@ -713,7 +675,7 @@ function mail_notify_fave($other, $user, $notice) */ function mail_notify_attn($user, $notice) { - if (!$user->email || !$user->emailnotifyattn) { + if (!$user->receivesEmailNotifications()) { return; } @@ -723,10 +685,16 @@ function mail_notify_attn($user, $notice) return; } + // See if the notice's author who mentions this user is sandboxed if (!$sender->hasRight(Right::EMAILONREPLY)) { return; } + // If the author has blocked the author, don't spam them with a notification. + if ($user->hasBlocked($sender)) { + return; + } + $bestname = $sender->getBestName(); common_switch_locale($user->language); @@ -748,7 +716,7 @@ function mail_notify_attn($user, $notice) // TRANS: Body of @-reply notification e-mail. // TRANS: %1$s is the sending user's name, $2$s is the StatusNet sitename, // TRANS: %3$s is a URL to the notice, %4$s is the notice text, - // TRANS: %5$s is a URL to the full conversion if it exists (otherwise empty), + // TRANS: %5$s is the text "The full conversation can be read here:" and a URL to the full conversion if it exists (otherwise empty), // TRANS: %6$s is a URL to reply to the notice, %7$s is a URL to all @-replies for the addressed user, $body = sprintf(_("%1\$s just sent a notice to your attention (an '@-reply') on %2\$s.\n\n". "The notice is here:\n\n". @@ -810,7 +778,7 @@ function mail_notify_group_join($group, $joiner) $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 @@ -822,7 +790,7 @@ function mail_notify_group_join($group, $joiner) // 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')); @@ -857,7 +825,7 @@ function mail_notify_group_join_pending($group, $joiner) $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