234 lines
6.9 KiB
Plaintext
234 lines
6.9 KiB
Plaintext
<?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']);
|
|
}
|