123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233 |
- <?php
- /**
- * @file
- * Sends system emails in HTML.
- */
- /**
- * Implements hook_permission().
- *
- * Defines a permission for setting the per-user plaintext option.
- */
- function htmlmail_permission() {
- $args = array(
- '!htmlmail' => url('http://drupal.org/project/htmlmail'),
- '%htmlmail' => 'HTML Mail',
- );
- return array(
- 'choose htmlmail_plaintext' => array(
- 'title' => t('Choose to receive plaintext emails via %htmlmail', $args),
- 'description' => t(
- 'Granting this permission allows users to choose whether to receive all their emails in plaintext, rather than the default format provided by the <a href="!htmlmail">%htmlmail</a> module.', $args
- ),
- ),
- );
- }
- /**
- * Implements hook_help().
- */
- function htmlmail_help($path, $arg) {
- switch ($path) {
- case 'admin/config/system/htmlmail':
- return '<h2>' . t('Theming') . '</h2><p>' . t('The email message goes through three transformations before sending:') . '</p>';
- case 'admin/help#htmlmail':
- return '<p>'
- . t('<a href="!htmlmail">HTML Mail</a> lets you theme your messages the same way you theme the rest of your website.',
- array('!htmlmail' => 'http://drupal.org/project/htmlmail')
- ) . '</p>';
- default:
- return '';
- }
- }
- /**
- * Implements hook_menu().
- */
- function htmlmail_menu() {
- $items['admin/config/system/htmlmail'] = array(
- 'title' => 'HTML Mail',
- 'description' => 'Configure HTML Mail system-wide settings.',
- 'page callback' => 'drupal_get_form',
- 'page arguments' => array('htmlmail_admin_settings'),
- 'access arguments' => array('administer site configuration'),
- 'file' => 'htmlmail.admin.inc',
- );
- $items['admin/config/system/htmlmail/settings'] = array(
- 'title' => 'Settings',
- 'type' => MENU_DEFAULT_LOCAL_TASK,
- 'weight' => '-2'
- );
- $items['admin/config/system/htmlmail/test'] = array(
- 'title' => 'Send Test',
- 'page callback' => 'drupal_get_form',
- 'page arguments' => array('htmlmail_test_form'),
- 'access arguments' => array('access administration pages'),
- 'type' => MENU_LOCAL_TASK,
- 'file' => 'htmlmail.admin.inc',
- );
- return $items;
- }
- /**
- * Implements hook_theme().
- *
- * Auto-detects htmlmail template files in the selected theme and in the
- * htmlmail module directory.
- */
- function htmlmail_theme() {
- $items = array();
- $module_path = drupal_get_path('module', 'htmlmail');
- $pattern = '/^htmlmail.*\.tpl\.php$/';
- $files = file_scan_directory($module_path, $pattern, array('key' => 'name'));
- if ($theme = htmlmail_get_selected_theme()) {
- $theme_path = drupal_get_path('theme', $theme);
- $files = array_merge($files,
- file_scan_directory($theme_path, $pattern, array('key' => 'name'))
- );
- }
- else {
- $theme_path = $module_path;
- }
- ksort($files);
- foreach ($files as $file) {
- $path = dirname($file->uri);
- $template = substr($file->name, 0, -4);
- $suggestion = str_replace('--', '__', $template);
- $items[$suggestion] = array(
- 'variables' => array('message' => array()),
- 'template' => $template,
- 'path' => $path,
- 'theme path' => $theme_path,
- );
- }
- return $items;
- }
- /**
- * Process variables to format email messages.
- *
- * @see htmlmail.tpl.php
- */
- function template_preprocess_htmlmail(array &$variables) {
- $variables['debug'] = variable_get('htmlmail_debug', '0');
- $variables['theme'] = htmlmail_get_selected_theme($variables);
- $variables['module_path'] = drupal_get_path('module', 'htmlmail');
- if (empty($variables['theme'])) {
- $variables['theme'] = 'no theme';
- $variables['theme_path'] = $variables['module_path'];
- }
- else {
- $variables['theme_path'] = drupal_get_path('theme', $variables['theme']);
- }
- $variables['theme_url'] = url(
- $variables['theme_path'], array('absolute' => TRUE)
- );
- $variables['message_id'] = $variables['module'] . '_' . $variables['key'];
- $suggestion = 'htmlmail__' . $variables['module'];
- $variables['theme_hook_suggestions'][] = $suggestion;
- $suggestion .= '__' . $variables['key'];
- $variables['theme_hook_suggestions'][] = $suggestion;
- }
- /**
- * Implements hook_mail().
- */
- function htmlmail_mail($key, &$message, $params) {
- $message['module'] = 'htmlmail';
- $message['key'] = $key;
- $message['subject'] = $params['subject'];
- $message['body'] = explode(
- MAIL_LINE_ENDINGS . MAIL_LINE_ENDINGS,
- $params['body']
- );
- return $message;
- }
- /**
- * Implements hook_form_FORM_ID_alter().
- */
- function htmlmail_form_user_profile_form_alter(&$form, &$form_state) {
- if ($form['#user_category'] != 'account') {
- return;
- }
- if (!(user_access('choose htmlmail_plaintext') || user_access('administer users'))) {
- return;
- }
- $account = $form['#user'];
- $mail = $form['account']['mail'];
- $form['account']['mail'] = array(
- 'mail' => $mail,
- 'htmlmail_plaintext' => array(
- '#type' => 'checkbox',
- '#title' => t('Plaintext-only emails'),
- '#default_value' => empty($account->data['htmlmail_plaintext']) ? 0 : 1,
- '#description' => t('The %htmlmail module can send emails with fonts, styles, and other HTML formatting. If you prefer to receive all your emails in unformatted plain text, select this option.',
- array('%htmlmail' => 'HTML Mail')
- ),
- ),
- );
- }
- /**
- * Implements hook_user_presave().
- */
- function htmlmail_user_presave(&$edit, $account, $category) {
- if (user_access('choose htmlmail_plaintext') || user_access('administer users')) {
- $edit['data']['htmlmail_plaintext'] = empty($edit['htmlmail_plaintext']) ? 0 : 1;
- unset($edit['htmlmail_plaintext']);
- }
- }
- /**
- * Returns an associative array of allowed themes. The keys are the
- * machine-readable names and the values are the .info file names.
- * Based on code from the og_theme module.
- */
- function &htmlmail_get_allowed_themes() {
- $allowed = &drupal_static(__FUNCTION__);
- if (!isset($allowed)) {
- $allowed = array('' => t('No theme'));
- $themes = list_themes();
- module_load_include('inc', 'system', 'system.admin');
- uasort($themes, 'system_sort_modules_by_info_name');
- foreach ($themes as $key => $value) {
- if ($value->status) {
- $allowed[$key] = check_plain($value->info['name']);
- }
- }
- }
- return $allowed;
- }
- /**
- * Returns the selected theme to use for outgoing emails.
- */
- function htmlmail_get_selected_theme(&$message = array()) {
- $selected = isset($message['theme'])
- ? $message['theme'] : variable_get('htmlmail_theme', '');
- if ($selected) {
- // Make sure the selected theme is allowed.
- $themes = &htmlmail_get_allowed_themes();
- if (empty($themes[$selected])) {
- $selected = '';
- }
- }
- return $selected;
- }
- /**
- * Checks whether a given recipient email prefers plaintext-only messages.
- *
- * @param $email
- * The recipient email address.
- *
- * @return
- * FALSE if the recipient prefers plaintext-only messages; otherwise TRUE.
- */
- function htmlmail_is_allowed($email) {
- return !($recipient = user_load_by_mail($email))
- || empty($recipient->data['htmlmail_plaintext']);
- }
|