diff --git a/README.md b/README.md index f8694443b..254114d83 100644 --- a/README.md +++ b/README.md @@ -49,7 +49,8 @@ TorrentPier - движок торрент-трекера, написанный ## Необходимые модули php - php5-tidy + intl + tidy Начиная с версии 2.0.9 (ревизия 592 в старой нумерации) данный модуль не является обязательным, но его установка крайне рекомендуется для повышения качества обработки html-кода тем и сообщений пользователей. ## Рекомендуемый способ запуска cron.php diff --git a/admin/admin_mass_email.php b/admin/admin_mass_email.php index 7ac3dde06..c344772d3 100644 --- a/admin/admin_mass_email.php +++ b/admin/admin_mass_email.php @@ -76,22 +76,21 @@ if (isset($_POST['submit'])) { "); } - require CLASS_DIR . '/emailer.php'; - foreach ($user_list as $i => $row) { - $emailer = new emailer($bb_cfg['smtp_delivery']); + /** @var TorrentPier\Legacy\Emailer() $emailer */ + $emailer = new TorrentPier\Legacy\Emailer(); - $emailer->from($bb_cfg['sitename'] . " <{$bb_cfg['board_email']}>"); - $emailer->email_address($row['username'] . " <{$row['user_email']}>"); - $emailer->use_template('admin_send_email'); + $emailer->set_from([$bb_cfg['board_email'] => $bb_cfg['sitename']]); + $emailer->set_to([$row['user_email'] => $row['username']]); + $emailer->set_subject($subject); + $emailer->set_template('admin_send_email'); $emailer->assign_vars(array( 'SUBJECT' => html_entity_decode($subject), 'MESSAGE' => html_entity_decode($message), )); $emailer->send(); - $emailer->reset(); } } } diff --git a/composer.json b/composer.json index 4dd94fc71..d2a3581fb 100644 --- a/composer.json +++ b/composer.json @@ -43,7 +43,9 @@ "require": { "php": "^5.3 || ^7.0", "gigablah/sphinxphp": "^2.0", - "google/recaptcha": "^1.0" + "google/recaptcha": "^1.0", + "roave/security-advisories": "dev-master", + "swiftmailer/swiftmailer": "^6.0" }, "autoload": { "psr-4": { diff --git a/group.php b/group.php index 0696b53ad..62a57df1d 100644 --- a/group.php +++ b/group.php @@ -213,14 +213,14 @@ if (!$group_id) { add_user_into_group($group_id, $userdata['user_id'], 1, TIMENOW); if ($bb_cfg['group_send_email']) { - require CLASS_DIR . '/emailer.php'; - $emailer = new emailer($bb_cfg['smtp_delivery']); + /** @var TorrentPier\Legacy\Emailer() $emailer */ + $emailer = new TorrentPier\Legacy\Emailer(); - $emailer->from($bb_cfg['sitename'] . " <{$bb_cfg['board_email']}>"); - $emailer->email_address($moderator['username'] . " <{$moderator['user_email']}>"); - - $emailer->use_template('group_request', $moderator['user_lang']); + $emailer->set_from([$bb_cfg['board_email'] => $bb_cfg['sitename']]); + $emailer->set_to([$moderator['user_email'] => $moderator['username']]); + $emailer->set_subject($lang['EMAILER_SUBJECT']['GROUP_REQUEST']); + $emailer->set_template('group_request', $moderator['user_lang']); $emailer->assign_vars(array( 'USER' => $userdata['username'], 'SITENAME' => $bb_cfg['sitename'], @@ -229,7 +229,6 @@ if (!$group_id) { )); $emailer->send(); - $emailer->reset(); } set_die_append_msg(false, false, $group_id); @@ -256,14 +255,14 @@ if (!$group_id) { add_user_into_group($group_id, $row['user_id']); if ($bb_cfg['group_send_email']) { - require CLASS_DIR . '/emailer.php'; - $emailer = new emailer($bb_cfg['smtp_delivery']); + /** @var TorrentPier\Legacy\Emailer() $emailer */ + $emailer = new TorrentPier\Legacy\Emailer(); - $emailer->from($bb_cfg['sitename'] . " <{$bb_cfg['board_email']}>"); - $emailer->email_address($row['username'] . " <{$row['user_email']}>"); - - $emailer->use_template('group_added', $row['user_lang']); + $emailer->set_from([$bb_cfg['board_email'] => $bb_cfg['sitename']]); + $emailer->set_to([$row['user_email'] => $row['username']]); + $emailer->set_subject($lang['EMAILER_SUBJECT']['GROUP_ADDED']); + $emailer->set_template('group_added', $row['user_lang']); $emailer->assign_vars(array( 'SITENAME' => $bb_cfg['sitename'], 'GROUP_NAME' => $group_info['group_name'], @@ -271,7 +270,6 @@ if (!$group_id) { )); $emailer->send(); - $emailer->reset(); } } else { if (((!empty($_POST['approve']) || !empty($_POST['deny'])) && !empty($_POST['pending_members'])) || (!empty($_POST['remove']) && !empty($_POST['members']))) { @@ -315,24 +313,23 @@ if (!$group_id) { bb_die('Could not get user email information'); } - require CLASS_DIR . '/emailer.php'; - $emailer = new emailer($bb_cfg['smtp_delivery']); - - $emailer->from($bb_cfg['sitename'] . " <{$bb_cfg['board_email']}>"); - foreach (DB()->fetch_rowset($sql_select) as $row) { - $emailer->use_template('group_approved', $row['user_lang']); - $emailer->email_address($row['username'] . " <{$row['user_email']}>"); + /** @var TorrentPier\Legacy\Emailer() $emailer */ + $emailer = new TorrentPier\Legacy\Emailer(); + + $emailer->set_from([$bb_cfg['board_email'] => $bb_cfg['sitename']]); + $emailer->set_to([$row['user_email'] => $row['username']]); + $emailer->set_subject($lang['EMAILER_SUBJECT']['GROUP_APPROVED']); + + $emailer->set_template('group_approved', $row['user_lang']); + $emailer->assign_vars(array( + 'SITENAME' => $bb_cfg['sitename'], + 'GROUP_NAME' => $group_info['group_name'], + 'U_GROUP' => make_url(GROUP_URL . $group_id), + )); + + $emailer->send(); } - - $emailer->assign_vars(array( - 'SITENAME' => $bb_cfg['sitename'], - 'GROUP_NAME' => $group_info['group_name'], - 'U_GROUP' => make_url(GROUP_URL . $group_id), - )); - - $emailer->send(); - $emailer->reset(); } } } diff --git a/library/config.php b/library/config.php index 6a4d69089..80b4beb75 100644 --- a/library/config.php +++ b/library/config.php @@ -98,7 +98,7 @@ $domain_name = (!empty($_SERVER['SERVER_NAME'])) ? $_SERVER['SERVER_NAME'] : $do // Version info $bb_cfg['tp_version'] = '2.1.6'; -$bb_cfg['tp_release_date'] = '**-02-2017'; +$bb_cfg['tp_release_date'] = '01-07-2017'; $bb_cfg['tp_release_state'] = 'STABLE'; // Database @@ -360,7 +360,7 @@ $page_cfg['show_sidebar2'] = array( ); // Cookie -$bb_cfg['cookie_domain'] = in_array($domain_name, array(getenv('SERVER_ADDR'), 'localhost')) ? '' : ".$domain_name"; +$bb_cfg['cookie_domain'] = in_array($domain_name, array(getenv('SERVER_ADDR'), 'localhost'), true) ? '' : ".$domain_name"; $bb_cfg['cookie_secure'] = (!empty($_SERVER['HTTPS']) ? 1 : 0); $bb_cfg['cookie_prefix'] = 'bb_'; // 'bb_' @@ -381,14 +381,17 @@ $bb_cfg['new_user_reg_restricted'] = false; // Ограничить ре $bb_cfg['reg_email_activation'] = true; // Требовать активацию учетной записи по email // Email -$bb_cfg['emailer_disabled'] = false; - -$bb_cfg['smtp_delivery'] = false; // send email via a named server instead of the local mail function -$bb_cfg['smtp_ssl'] = false; // use ssl connect -$bb_cfg['smtp_host'] = ''; // SMTP server host -$bb_cfg['smtp_port'] = 25; // SMTP server port -$bb_cfg['smtp_username'] = ''; // enter a username if your SMTP server requires it -$bb_cfg['smtp_password'] = ''; // enter a password if your SMTP server requires it +$bb_cfg['emailer'] = [ + 'enabled' => true, + 'smtp' => [ + 'enabled' => true, // send email via external SMTP server + 'host' => '', // SMTP server host + 'port' => 25, // SMTP server port + 'username' => '', // SMTP username (if server requires it) + 'password' => '', // SMTP password (if server requires it) + ], + 'ssl_type' => '', // SMTP ssl type (ssl or tls) +]; $bb_cfg['board_email'] = "noreply@$domain_name"; // admin email address $bb_cfg['board_email_form'] = false; // can users send email to each other via board @@ -532,7 +535,7 @@ $bb_cfg['user_not_active_days_keep'] = 180; // inactive users but only with $bb_cfg['group_members_per_page'] = 50; // Tidy -$bb_cfg['tidy_post'] = (!in_array('tidy', get_loaded_extensions())) ? false : true; +$bb_cfg['tidy_post'] = (!in_array('tidy', get_loaded_extensions(), true)) ? false : true; // Ads $bb_cfg['show_ads'] = false; @@ -554,7 +557,7 @@ $bb_cfg['ad_blocks'] = array( // Misc define('MEM_USAGE', function_exists('memory_get_usage')); -$bb_cfg['mem_on_start'] = (MEM_USAGE) ? memory_get_usage() : 0; +$bb_cfg['mem_on_start'] = MEM_USAGE ? memory_get_usage() : 0; $bb_cfg['translate_dates'] = true; // in displaying time $bb_cfg['use_word_censor'] = true; @@ -568,7 +571,7 @@ $bb_cfg['allow_change'] = array( 'dateformat' => true, ); -define('GZIP_OUTPUT_ALLOWED', (extension_loaded('zlib') && !ini_get('zlib.output_compression'))); +define('GZIP_OUTPUT_ALLOWED', extension_loaded('zlib') && !ini_get('zlib.output_compression')); $banned_user_agents = array( // Download Master diff --git a/library/includes/classes/emailer.php b/library/includes/classes/emailer.php deleted file mode 100644 index 722513e4c..000000000 --- a/library/includes/classes/emailer.php +++ /dev/null @@ -1,234 +0,0 @@ -reset(); - $this->from = $bb_cfg['board_email']; - $this->reply_to = $bb_cfg['board_email']; - $this->use_smtp = $use_smtp; /*!empty($bb_cfg['smtp_host']); - - $this->use_template($tpl_name); - $this->set_subject($sbj); - $this->email_address($to_address);*/ - } - - public function set_default_vars() - { - global $bb_cfg; - - $this->vars = array( - 'BOARD_EMAIL' => $bb_cfg['board_email'], - 'SITENAME' => $bb_cfg['board_email_sitename'], - 'EMAIL_SIG' => !empty($bb_cfg['board_email_sig']) ? "-- \n{$bb_cfg['board_email_sig']}" : '', - ); - } - - // Resets all the data (address, template file, etc etc to default - public function reset() - { - $this->addresses = array(); - $this->msg = $this->extra_headers = ''; - $this->set_default_vars(); - } - - // Sets an email address to send to - public function email_address($address) - { - $this->addresses['to'] = trim($address); - } - - public function cc($address) - { - $this->addresses['cc'][] = trim($address); - } - - public function bcc($address) - { - $this->addresses['bcc'][] = trim($address); - } - - public function replyto($address) - { - $this->reply_to = trim($address); - } - - public function from($address) - { - $this->from = trim($address); - } - - // set up subject for mail - public function set_subject($subject = '') - { - $this->subject = trim(preg_replace('#[\n\r]+#s', '', $subject)); - } - - // set up extra mail headers - public function extra_headers($headers) - { - $this->extra_headers .= trim($headers) . "\n"; - } - - public function use_template($template_file, $template_lang = '') - { - global $bb_cfg; - - if (!$template_lang) { - $template_lang = $bb_cfg['default_lang']; - } - - if (empty($this->tpl_msg[$template_lang . $template_file])) { - $tpl_file = LANG_ROOT_DIR . '/' . $template_lang . '/email/' . $template_file . '.html'; - - if (!file_exists($tpl_file)) { - $tpl_file = LANG_ROOT_DIR . '/' . $bb_cfg['default_lang'] . '/email/' . $template_file . '.html'; - - if (!file_exists($tpl_file)) { - bb_die('Could not find email template file :: ' . $template_file); - } - } - - if (!($fd = @fopen($tpl_file, 'rb'))) { - bb_die('Failed opening template file :: ' . $tpl_file); - } - - $this->tpl_msg[$template_lang . $template_file] = fread($fd, filesize($tpl_file)); - fclose($fd); - } - - $this->msg = $this->tpl_msg[$template_lang . $template_file]; - - return true; - } - - // assign variables - public function assign_vars($vars) - { - $this->vars = array_merge($this->vars, $vars); - } - - // Send the mail out to the recipients set previously in var $this->address - public function send($email_format = 'text') - { - global $bb_cfg, $userdata; - - if ($bb_cfg['emailer_disabled']) { - return; - } - - // Escape all quotes - $this->msg = str_replace("'", "\'", $this->msg); - $this->msg = preg_replace('#\{([a-z0-9\-_]*?)\}#is', "' . $\\1 . '", $this->msg); - - // Set vars - reset($this->vars); - foreach ($this->vars as $key => $val) { - $this->msg = preg_replace(sprintf('/\$\{?%s\}?/', $key), $val, $this->msg); - } - - // We now try and pull a subject from the email body ... if it exists, - // do this here because the subject may contain a variable - $drop_header = ''; - $match = []; - if (preg_match('#^(Subject:(.*?))$#m', $this->msg, $match)) { - $this->subject = (trim($match[2]) != '') ? trim($match[2]) : (($this->subject != '') ? $this->subject : 'No Subject'); - $drop_header .= '[\r\n]*?' . preg_quote($match[1], '#'); - } else { - $this->subject = (($this->subject != '') ? $this->subject : 'No Subject'); - } - - $this->encoding = trim($bb_cfg['lang'][$userdata['user_lang']]['encoding']); - $this->subject = $this->encode($this->subject); - - if ($drop_header != '') { - $this->msg = trim(preg_replace('#' . $drop_header . '#s', '', $this->msg)); - } - - $to = @$this->addresses['to']; - - $cc = (@count($this->addresses['cc'])) ? implode(', ', $this->addresses['cc']) : ''; - $bcc = (@count($this->addresses['bcc'])) ? implode(', ', $this->addresses['bcc']) : ''; - - // Build header - $type = ($email_format == 'html') ? 'html' : 'plain'; - $this->extra_headers = (($this->reply_to != '') ? "Reply-to: $this->reply_to\n" : '') . (($this->from != '') ? "From: $this->from\n" : "From: " . $bb_cfg['board_email'] . "\n") . "Return-Path: " . $bb_cfg['board_email'] . "\nMessage-ID: <" . md5(uniqid(TIMENOW, true)) . "@" . $bb_cfg['server_name'] . ">\nMIME-Version: 1.0\nContent-type: text/$type; charset=" . $this->encoding . "\nContent-transfer-encoding: 8bit\nDate: " . date('r', TIMENOW) . "\nX-Priority: 0\nX-MSMail-Priority: Normal\nX-Mailer: Microsoft Office Outlook, Build 11.0.5510\nX-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1441\nX-Sender: " . $bb_cfg['board_email'] . "\n" . $this->extra_headers . (($cc != '') ? "Cc: $cc\n" : '') . (($bcc != '') ? "Bcc: $bcc\n" : ''); - - // Send message - if ($this->use_smtp) { - if (!defined('SMTP_INCLUDED')) { - include INC_DIR . '/smtp.php'; - } - - $result = smtpmail($to, $this->subject, $this->msg, $this->extra_headers); - } else { - $to = ($to == '') ? ' ' : $to; - - $result = @mail($to, $this->subject, preg_replace("#(?msg), $this->extra_headers); - } - - // Did it work? - if (!$result) { - bb_die('Failed sending email :: ' . (($this->use_smtp) ? 'SMTP' : 'PHP') . ' :: ' . $result); - } - - return true; - } - - public function encode($str) - { - if ($this->encoding == '') { - return $str; - } - - // define start delimimter, end delimiter and spacer - $start = "=?$this->encoding?B?"; - $end = "?="; - - // encode the string and split it into chunks with spacers after each chunk - $str = base64_encode($str); - - return $start . $str . $end; - } -} diff --git a/library/includes/functions_post.php b/library/includes/functions_post.php index 26e75ad8c..14ba65cd8 100644 --- a/library/includes/functions_post.php +++ b/library/includes/functions_post.php @@ -331,9 +331,6 @@ function user_notification($mode, &$post_data, &$topic_title, &$forum_id, &$topi "); if ($watch_list) { - require CLASS_DIR . '/emailer.php'; - $emailer = new emailer($bb_cfg['smtp_delivery']); - $orig_word = $replacement_word = array(); obtain_word_list($orig_word, $replacement_word); @@ -345,10 +342,14 @@ function user_notification($mode, &$post_data, &$topic_title, &$forum_id, &$topi $unwatch_topic = make_url(TOPIC_URL . "$topic_id&unwatch=topic"); foreach ($watch_list as $row) { - $emailer->from($bb_cfg['sitename'] . " <{$bb_cfg['board_email']}>"); - $emailer->email_address($row['username'] . " <{$row['user_email']}>"); - $emailer->use_template('topic_notify', $row['user_lang']); + /** @var TorrentPier\Legacy\Emailer() $emailer */ + $emailer = new TorrentPier\Legacy\Emailer(); + $emailer->set_from([$bb_cfg['board_email'] => $bb_cfg['sitename']]); + $emailer->set_to([$row['user_email'] => $row['username']]); + $emailer->set_subject(sprintf($lang['EMAILER_SUBJECT']['TOPIC_NOTIFY'], $topic_title)); + + $emailer->set_template('topic_notify', $row['user_lang']); $emailer->assign_vars(array( 'TOPIC_TITLE' => html_entity_decode($topic_title), 'SITENAME' => $bb_cfg['sitename'], @@ -358,7 +359,6 @@ function user_notification($mode, &$post_data, &$topic_title, &$forum_id, &$topi )); $emailer->send(); - $emailer->reset(); $update_watched_sql[] = $row['user_id']; } diff --git a/library/includes/smtp.php b/library/includes/smtp.php deleted file mode 100644 index 16d1c009d..000000000 --- a/library/includes/smtp.php +++ /dev/null @@ -1,188 +0,0 @@ - 1) { - $headers = implode("\n", $headers); - } else { - $headers = $headers[0]; - } - } - $headers = rtrim($headers); - - // Make sure there are no bare linefeeds in the headers - $headers = preg_replace('#(?\r\n"); - server_parse($socket, "250", __LINE__); - - // Add an additional bit of error checking to the To field. - $mail_to = (trim($mail_to) == '') ? 'Undisclosed-recipients:;' : trim($mail_to); - if (preg_match('#[^ ]+\@[^ ]+#', $mail_to)) { - fwrite($socket, "RCPT TO: <$mail_to>\r\n"); - server_parse($socket, "250", __LINE__); - } - - if (!empty($bcc)) { - reset($bcc); - foreach ($bcc as $bcc_address) { - // Add an additional bit of error checking to bcc header... - $bcc_address = trim($bcc_address); - if (preg_match('#[^ ]+\@[^ ]+#', $bcc_address)) { - fwrite($socket, "RCPT TO: <$bcc_address>\r\n"); - server_parse($socket, "250", __LINE__); - } - } - } - - if (!empty($cc)) { - reset($cc); - foreach ($cc as $cc_address) { - // Add an additional bit of error checking to cc header - $cc_address = trim($cc_address); - if (preg_match('#[^ ]+\@[^ ]+#', $cc_address)) { - fwrite($socket, "RCPT TO: <$cc_address>\r\n"); - server_parse($socket, "250", __LINE__); - } - } - } - - // Ok now we tell the server we are ready to start sending data - fwrite($socket, "DATA\r\n"); - - // This is the last response code we look for until the end of the message. - server_parse($socket, "354", __LINE__); - - // Send the Subject Line... - fwrite($socket, "Subject: $subject\r\n"); - - // Now the To Header. - fwrite($socket, "To: $mail_to\r\n"); - - // Now any custom headers.... - fwrite($socket, "$headers\r\n\r\n"); - - // Ok now we are ready for the message... - fwrite($socket, "$message\r\n"); - - // Ok the all the ingredients are mixed in let's cook this puppy... - fwrite($socket, ".\r\n"); - server_parse($socket, "250", __LINE__); - - // Now tell the server we are done and close the socket... - fwrite($socket, "QUIT\r\n"); - fclose($socket); - - return true; -} diff --git a/library/includes/ucp/email.php b/library/includes/ucp/email.php index 1b89d4fa0..55b12eb56 100644 --- a/library/includes/ucp/email.php +++ b/library/includes/ucp/email.php @@ -56,54 +56,49 @@ if ($row = DB()->fetch_row($sql)) { $user_email = $row['user_email']; $user_lang = $row['user_lang']; - if (true || IS_ADMIN) { - // TRUE instead of missing user_opt "prevent_email" - if (isset($_POST['submit'])) { - $subject = trim(html_entity_decode($_POST['subject'])); - $message = trim(html_entity_decode($_POST['message'])); + if (isset($_POST['submit'])) { + $subject = trim(html_entity_decode($_POST['subject'])); + $message = trim(html_entity_decode($_POST['message'])); - if (!$subject) { - $errors[] = $lang['EMPTY_SUBJECT_EMAIL']; - } - if (!$message) { - $errors[] = $lang['EMPTY_MESSAGE_EMAIL']; - } - - if (!$errors) { - require CLASS_DIR . '/emailer.php'; - $emailer = new emailer($bb_cfg['smtp_delivery']); - - $emailer->from($userdata['username'] . " <{$userdata['user_email']}>"); - $emailer->email_address($username . " <$user_email>"); - - $emailer->use_template('profile_send_email', $user_lang); - $emailer->set_subject($subject); - - $emailer->assign_vars(array( - 'SITENAME' => $bb_cfg['sitename'], - 'FROM_USERNAME' => $userdata['username'], - 'TO_USERNAME' => $username, - 'MESSAGE' => $message, - )); - $emailer->send(); - $emailer->reset(); - - bb_die($lang['EMAIL_SENT']); - } + if (!$subject) { + $errors[] = $lang['EMPTY_SUBJECT_EMAIL']; + } + if (!$message) { + $errors[] = $lang['EMPTY_MESSAGE_EMAIL']; } - $template->assign_vars(array( - 'USERNAME' => profile_url($row), - 'S_HIDDEN_FIELDS' => '', - 'S_POST_ACTION' => "profile.php?mode=email&" . POST_USERS_URL . "=$user_id", - 'ERROR_MESSAGE' => ($errors) ? implode('
', array_unique($errors)) : '', - )); + if (!$errors) { + /** @var TorrentPier\Legacy\Emailer() $emailer */ + $emailer = new TorrentPier\Legacy\Emailer(); - print_page('usercp_email.tpl'); - } else { - bb_die($lang['USER_PREVENT_EMAIL']); + $emailer->set_from([$userdata['user_email'] => $userdata['username']]); + $emailer->set_to([$user_email => $username]); + $emailer->set_subject($subject); + + $emailer->set_template('profile_send_email', $user_lang); + $emailer->assign_vars(array( + 'SITENAME' => $bb_cfg['sitename'], + 'FROM_USERNAME' => $userdata['username'], + 'TO_USERNAME' => $username, + 'MESSAGE' => $message, + )); + + $emailer->send(); + + bb_die($lang['EMAIL_SENT']); + } } + + $template->assign_vars(array( + 'USERNAME' => profile_url($row), + 'S_HIDDEN_FIELDS' => '', + 'S_POST_ACTION' => "profile.php?mode=email&" . POST_USERS_URL . "=$user_id", + 'ERROR_MESSAGE' => ($errors) ? implode('
', array_unique($errors)) : '', + )); + + print_page('usercp_email.tpl'); + } else { bb_die($lang['USER_NOT_EXIST']); } diff --git a/library/includes/ucp/register.php b/library/includes/ucp/register.php index a4dbe5b30..44a8a9890 100644 --- a/library/includes/ucp/register.php +++ b/library/includes/ucp/register.php @@ -584,31 +584,31 @@ if ($submit && !$errors) { } else { if ($bb_cfg['reg_email_activation']) { $message = $lang['ACCOUNT_INACTIVE']; + $email_subject = sprintf($lang['EMAILER_SUBJECT']['USER_WELCOME_INACTIVE'], $bb_cfg['sitename']); $email_template = 'user_welcome_inactive'; } else { $message = $lang['ACCOUNT_ADDED']; + $email_subject = sprintf($lang['EMAILER_SUBJECT']['USER_WELCOME'], $bb_cfg['sitename']); $email_template = 'user_welcome'; } - require CLASS_DIR . '/emailer.php'; - $emailer = new emailer($bb_cfg['smtp_delivery']); + /** @var TorrentPier\Legacy\Emailer() $emailer */ + $emailer = new TorrentPier\Legacy\Emailer(); - $emailer->from($bb_cfg['sitename'] . " <{$bb_cfg['board_email']}>"); - $emailer->email_address($username . " <{$email}>"); - - $emailer->use_template($email_template, $user_lang); + $emailer->set_from([$bb_cfg['board_email'] => $bb_cfg['sitename']]); + $emailer->set_to([$email => $username]); + $emailer->set_subject($email_subject); + $emailer->set_template($email_template, $user_lang); $emailer->assign_vars(array( 'SITENAME' => $bb_cfg['sitename'], 'WELCOME_MSG' => sprintf($lang['WELCOME_SUBJECT'], $bb_cfg['sitename']), 'USERNAME' => html_entity_decode($username), 'PASSWORD' => $new_pass, - 'U_ACTIVATE' => make_url('profile.php?mode=activate&' . POST_USERS_URL . '=' . $new_user_id . '&act_key=' . $db_data['user_actkey']) )); $emailer->send(); - $emailer->reset(); } bb_die($message); @@ -625,21 +625,22 @@ if ($submit && !$errors) { $pr_data['user_actkey'] = $user_actkey; $db_data['user_actkey'] = $user_actkey; - require CLASS_DIR . '/emailer.php'; - $emailer = new emailer($bb_cfg['smtp_delivery']); + /** @var TorrentPier\Legacy\Emailer() $emailer */ + $emailer = new TorrentPier\Legacy\Emailer(); - $emailer->from($bb_cfg['sitename'] . " <{$bb_cfg['board_email']}>"); - $emailer->email_address($username . " <{$email}>"); - - $emailer->use_template('user_activate', $pr_data['user_lang']); + $emailer->set_from([$bb_cfg['board_email'] => $bb_cfg['sitename']]); + $emailer->set_to([$email => $username]); + $emailer->set_subject($subject); + $emailer->set_subject($lang['EMAILER_SUBJECT']['USER_ACTIVATE']); + $emailer->set_template('user_activate', $pr_data['user_lang']); $emailer->assign_vars(array( 'SITENAME' => $bb_cfg['sitename'], 'USERNAME' => html_entity_decode($username), 'U_ACTIVATE' => make_url("profile.php?mode=activate&u={$pr_data['user_id']}&act_key=$user_actkey"), )); + $emailer->send(); - $emailer->reset(); $message = $lang['PROFILE_UPDATED_INACTIVE']; $user->session_end(); diff --git a/library/includes/ucp/sendpasswd.php b/library/includes/ucp/sendpasswd.php index 3b5a63d4f..cd01317e9 100644 --- a/library/includes/ucp/sendpasswd.php +++ b/library/includes/ucp/sendpasswd.php @@ -63,22 +63,22 @@ if (isset($_POST['submit'])) { bb_die('Could not update new password information'); } - require CLASS_DIR . '/emailer.php'; - $emailer = new emailer($bb_cfg['smtp_delivery']); + /** @var TorrentPier\Legacy\Emailer() $emailer */ + $emailer = new TorrentPier\Legacy\Emailer(); - $emailer->from($bb_cfg['sitename'] . " <{$bb_cfg['board_email']}>"); - $emailer->email_address("$username <{$row['user_email']}>"); - - $emailer->use_template('user_activate_passwd', $row['user_lang']); + $emailer->set_from([$bb_cfg['board_email'] => $bb_cfg['sitename']]); + $emailer->set_to([$row['user_email'] => $username]); + $emailer->set_subject($lang['EMAILER_SUBJECT']['USER_ACTIVATE_PASSWD']); + $emailer->set_template('user_activate_passwd', $row['user_lang']); $emailer->assign_vars(array( 'SITENAME' => $bb_cfg['sitename'], 'USERNAME' => $username, 'PASSWORD' => $user_password, 'U_ACTIVATE' => make_url('profile.php?mode=activate&' . POST_USERS_URL . '=' . $user_id . '&act_key=' . $user_actkey) )); + $emailer->send(); - $emailer->reset(); bb_die($lang['PASSWORD_UPDATED']); } else { diff --git a/privmsg.php b/privmsg.php index 92f05ab74..985eda4e3 100644 --- a/privmsg.php +++ b/privmsg.php @@ -929,14 +929,14 @@ if ($mode == 'read') { cache_rm_user_sessions($to_userdata['user_id']); if (bf($to_userdata['user_opt'], 'user_opt', 'user_notify_pm') && $to_userdata['user_active'] && $bb_cfg['pm_notify_enabled']) { - require CLASS_DIR . '/emailer.php'; - $emailer = new emailer($bb_cfg['smtp_delivery']); + /** @var TorrentPier\Legacy\Emailer() $emailer */ + $emailer = new TorrentPier\Legacy\Emailer(); - $emailer->from($bb_cfg['sitename'] . " <{$bb_cfg['board_email']}>"); - $emailer->email_address($to_userdata['username'] . " <{$to_userdata['user_email']}>"); - - $emailer->use_template('privmsg_notify', $to_userdata['user_lang']); + $emailer->set_from([$bb_cfg['board_email'] => $bb_cfg['sitename']]); + $emailer->set_to([$to_userdata['user_email'] => $to_userdata['username']]); + $emailer->set_subject($lang['EMAILER_SUBJECT']['PRIVMSG_NOTIFY']); + $emailer->set_template('privmsg_notify', $to_userdata['user_lang']); $emailer->assign_vars(array( 'USERNAME' => html_entity_decode($to_username), 'NAME_FROM' => $userdata['username'], @@ -946,7 +946,6 @@ if ($mode == 'read') { )); $emailer->send(); - $emailer->reset(); } } diff --git a/src/Legacy/Emailer.php b/src/Legacy/Emailer.php new file mode 100644 index 000000000..4191820c9 --- /dev/null +++ b/src/Legacy/Emailer.php @@ -0,0 +1,279 @@ +reply = $bb_cfg['board_email']; + } + + /** + * Установка темы сообщения + * + * @param string $subject + */ + public function set_subject($subject) + { + $this->subject = $subject; + } + + /** + * Установка адреса получателя + * + * @param $address + */ + public function set_to($address) + { + $this->to = $address; + } + + /** + * Установка адреса отправителя + * + * @param $address + */ + public function set_from($address) + { + $this->from = $address; + } + + /** + * Установка адреса для ответа + * + * @param $address + */ + public function set_reply($address) + { + $this->reply = $address; + } + + /** + * Установка адреса для копии + * + * @param $address + */ + public function set_cc($address) + { + $this->cc = $address; + } + + /** + * Установка шаблона сообщения + * + * @param string $template_file имя шаблона + * @param string $template_lang язык шаблона + */ + public function set_template($template_file, $template_lang = '') + { + global $bb_cfg; + + if (!$template_lang) { + $template_lang = $bb_cfg['default_lang']; + } + + if (empty($this->tpl_msg[$template_lang . $template_file])) { + $tpl_file = LANG_ROOT_DIR . '/' . $template_lang . '/email/' . $template_file . '.html'; + + if (!file_exists($tpl_file)) { + $tpl_file = LANG_ROOT_DIR . '/' . $bb_cfg['default_lang'] . '/email/' . $template_file . '.html'; + + /** @noinspection NotOptimalIfConditionsInspection */ + if (!file_exists($tpl_file)) { + bb_die('Could not find email template file: ' . $template_file); + } + } + + if (!$fd = fopen($tpl_file, 'rb')) { + bb_die('Failed opening email template file: ' . $tpl_file); + } + + $this->tpl_msg[$template_lang . $template_file] = fread($fd, filesize($tpl_file)); + fclose($fd); + } + + $this->message = $this->tpl_msg[$template_lang . $template_file]; + } + + /** + * Отправка сообщения получателям через SwiftMailer + * + * @param string $email_format + * @return bool + */ + public function send($email_format = self::FORMAT_TEXT) + { + global $bb_cfg, $lang, $userdata; + + if (!$bb_cfg['emailer']['enabled']) { + return false; + } + + /** + * Escape message and set vars + */ + $this->message = str_replace("'", "\'", $this->message); + $this->message = preg_replace('#\{([a-z0-9\-_]*?)\}#is', "' . $\\1 . '", $this->message); + foreach ($this->vars as $key => $val) { + $this->message = preg_replace(sprintf('/\$\{?%s\}?/', $key), $val, $this->message); + } + + /** Set some variables */ + $this->subject = !empty($this->subject) ? $this->subject : $lang['EMAILER_SUBJECT']['EMPTY']; + $this->encoding = $bb_cfg['lang'][$userdata['user_lang']]['encoding']; + + /** Prepare message */ + if ($bb_cfg['emailer']['smtp']['enabled']) { + if (!empty($bb_cfg['emailer']['smtp']['host'])) { + if (empty($bb_cfg['emailer']['ssl_type'])) { + /** @var Swift_SmtpTransport $transport external SMTP without ssl */ + $transport = (new Swift_SmtpTransport( + $bb_cfg['emailer']['smtp']['host'], + $bb_cfg['emailer']['smtp']['port'] + )) + ->setUsername($bb_cfg['emailer']['smtp']['username']) + ->setPassword($bb_cfg['emailer']['smtp']['password']); + } else { + /** @var Swift_SmtpTransport $transport external SMTP with ssl */ + $transport = (new Swift_SmtpTransport( + $bb_cfg['emailer']['smtp']['host'], + $bb_cfg['emailer']['smtp']['port'], + $bb_cfg['emailer']['ssl_type'] + )) + ->setUsername($bb_cfg['emailer']['smtp']['username']) + ->setPassword($bb_cfg['emailer']['smtp']['password']); + } + } else { + /** @var Swift_SmtpTransport $transport local SMTP */ + $transport = new Swift_SmtpTransport('localhost', 25); + } + } else { + /** @var Swift_SendmailTransport $transport local SendMail */ + $transport = new Swift_SendmailTransport('/usr/sbin/sendmail -bs'); + } + + /** @var Swift_Mailer $mailer */ + $mailer = new Swift_Mailer($transport); + + /** @var Swift_Message $message */ + $message = (new Swift_Message()) + ->setSubject($this->subject) + ->setReturnPath($bb_cfg['board_email']) + ->setFrom($this->from) + ->setTo($this->to) + ->setReplyTo($this->reply) + ->setBody($this->message, $email_format) + ->setCharset($this->encoding); + + if (!empty($this->cc)) { + $message->setCc($this->cc); + } + + /** Send message */ + if (!$result = $mailer->send($message)) { + bb_die('Failed sending email: ' . $result); + } + + return true; + } + + /** + * Установка переменных шаблона сообщения + * + * @param $vars + */ + public function assign_vars($vars) + { + $this->set_default_vars(); + $this->vars = array_merge($this->vars, $vars); + } + + /** + * Задание стандартных переменных шаблонов сообщения + */ + public function set_default_vars() + { + global $bb_cfg; + + $this->vars = [ + 'BOARD_EMAIL' => $bb_cfg['board_email'], + 'SITENAME' => $bb_cfg['board_email_sitename'], + 'EMAIL_SIG' => !empty($bb_cfg['board_email_sig']) ? "-- \n{$bb_cfg['board_email_sig']}" : '', + ]; + } +}