htmlmail.module in HTML Mail 6
Same filename and directory in other branches
Send system emails in HTML
File
htmlmail.moduleView source
<?php
/**
* @file
* Send system emails in HTML
*/
/**
* Implementation of hook_help().
*/
function htmlmail_help($path, $arg) {
switch ($path) {
case 'admin/help#htmlmail':
case 'admin/settings/htmlmail':
$output = '<p>' . t("HTML Mail provides formatting and semantic markup capabilities in e-mail that are not available with plain text. All system emails are effected if this module is enabled.") . '</p>';
return $output;
}
}
/**
* Implementation of hook_menu().
*/
function htmlmail_menu() {
$items['admin/settings/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/settings/htmlmail/settings'] = array(
'title' => 'Settings',
'type' => MENU_DEFAULT_LOCAL_TASK,
'weight' => '-2',
);
$items['admin/settings/htmlmail/template'] = array(
'title' => 'Template',
'page callback' => 'drupal_get_form',
'page arguments' => array(
'htmlmail_template_settings',
),
'access arguments' => array(
'access administration pages',
),
'type' => MENU_LOCAL_TASK,
'weight' => '-1',
'file' => 'htmlmail.admin.inc',
);
$items['admin/settings/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;
}
/**
* Implementation of hook_mail_alter().
*/
function htmlmail_mail_alter(&$message) {
// Match plain exclusions settings
if ($plain_settings = variable_get('htmlmail_plain_settings', '')) {
$items = preg_split('/(\\r\\n?|\\n)/', $plain_settings);
$plain_match = FALSE;
foreach ($items as $item) {
if (!strncmp($message['id'], $item, strlen($item))) {
$plain_match = TRUE;
break;
}
}
// reverse $plain_match if type is include
if (variable_get('htmlmail_plain_type', 0)) {
$plain_match = !$plain_match;
}
}
if (!$plain_match) {
// All good, make mail html
$message['headers']['Content-Type'] = 'text/html; charset=UTF-8; format=flowed;';
// message body may be an array
$message['body'] = is_array($message['body']) ? implode("\n\n", $message['body']) : $message['body'];
// The paragraph an break stuff
if (variable_get('htmlmail_autop', '1')) {
$message['body'] = _filter_autop($message['body']);
}
if (variable_get('htmlmail_urlfilter', '1')) {
// defaults to 72 as there is no filter 0 -- make filters a configuration option?
$message['body'] = _filter_url($message['body'], 0);
}
// Theme from template htmlmail.tpl.php
$message['body'] = theme('htmlmail', $message['body'], $message['id']);
if (variable_get('htmlmail_emogrifier', '0')) {
$message['body'] = _htmlmail_emogrify($message);
}
// Convert relative urls to absolute if rel_to_abs is enabled.
if (module_exists('rel_to_abs') && variable_get('htmlmail_rel_to_abs', 1)) {
$message['body'] = rel_to_abs_filter('prepare', 0, -1, $message['body']);
}
// Send the message key in email for theme template suggestions
if (variable_get('htmlmail_debug', '0')) {
$message['body'] .= '<p> Message Key ID: ' . $message['id'] . '</p>';
}
}
}
/**
* Implementation of hook_theme().
*/
function htmlmail_theme() {
$items['htmlmail'] = array(
'template' => 'htmlmail',
'arguments' => array(
'body' => NULL,
'key' => NULL,
),
);
if (module_exists('token')) {
$items['htmlmail_token_help'] = array(
'arguments' => array(
'prefix' => '[',
'suffix' => ']',
),
);
}
return $items;
}
/**
* Token support
*/
function theme_htmlmail_token_help($prefix = '[', $suffix = ']') {
token_include();
$full_list = array_merge(token_get_list('user'), token_get_list('profile'));
$headers = array(
t('Token'),
t('Replacement value'),
);
$rows = array();
foreach ($full_list as $key => $category) {
$rows[] = array(
array(
'data' => drupal_ucfirst($key) . ' ' . t('tokens'),
'class' => 'region',
'colspan' => 2,
),
);
foreach ($category as $token => $description) {
$row = array();
$row[] = $prefix . $token . $suffix;
$row[] = $description;
$rows[] = $row;
}
}
$output = theme('table', $headers, $rows, array(
'class' => 'description',
));
return $output;
}
/**
* Process variables to format e-mail.
*
* @see htmlmail.tpl.php
*/
function template_preprocess_htmlmail(&$variables) {
$variables['path'] = url($variables['directory'], array(
'absolute' => TRUE,
));
if (module_exists('token') && variable_get('htmlmail_token', '0')) {
global $user;
$types = array(
'user' => $user,
'profile' => $user,
);
$variables['header'] = token_replace_multiple(variable_get('htmlmail_header', ''), $types);
$variables['footer'] = token_replace_multiple(variable_get('htmlmail_footer', ''), $types);
}
else {
$variables['header'] = variable_get('htmlmail_header', '');
$variables['footer'] = variable_get('htmlmail_footer', '');
}
$variables['css'] = variable_get('htmlmail_css', '');
$module = preg_replace('/_.*$/', '', $variables['key']);
$variables['template_files'][] = 'htmlmail-' . $module;
$variables['template_files'][] = 'htmlmail-' . $variables['key'];
}
/**
* Implementation of hook_mail().
*/
function htmlmail_mail($key, &$message, $params) {
switch ($key) {
case 'test':
$message['subject'] = $params['subject'];
$message['body'] = $params['body'];
break;
}
}
/**
* If the Emogrifier <http://www.pelagodesign.com/sidecar/emogrifier/> exists,
* the CSS styles inside the the $message['body'] are inserted into the other
* HTML tags within the same $message['body'] as inline style attributes,
* based on CSS selectors.
*
* This function is based on code in the simplenews_template module.
*
* This emogrifier differs from that of simplenews_template in that it permits
* modules or users to adjoin CSS into the $message['body'] using the HTML
* <style> tag. The function searches the entire body for style tags,
* concatenates them in order of appearance in the file, then sends them to
* the Emogrifier script.
*
* Note that the method modifies the $message['body'] directly, and the
* return value is the modified $message['body'] string as well.
*
* @param $message
* The message array to be sent. This function works directly
* on the $message['body'].
* @return $message['body']
* The modified message body string with inlined CSS applied.
*/
function _htmlmail_emogrify(&$message) {
$path = drupal_get_path('module', 'htmlmail') . '/emogrifier/emogrifier.php';
if (is_file($path)) {
$style = array();
// Pull out the contents of any style tags
if (preg_match_all("@<style[^>]*>(.*)</style>@Usi", $message['body'], $matches, PREG_PATTERN_ORDER)) {
$style = $matches[1];
}
// Emogrify can't handle several CSS rules on one line. As a precaution,
// we therefore insert LF after each closing bracket.
$style = preg_replace('/}\\s*/', "}\n", implode("\n", $style));
// Inline the CSS rules.
include_once $path;
// get and reset error levels so we dont get DOMDocument::loadHTML() errors
$errorlevel = error_reporting();
error_reporting(0);
$emogrifier = new Emogrifier($message['body'], $style);
$message['body'] = $emogrifier
->emogrify();
error_reporting($errorlevel);
}
return $message['body'];
}
Functions
Name | Description |
---|---|
htmlmail_help | Implementation of hook_help(). |
htmlmail_mail | Implementation of hook_mail(). |
htmlmail_mail_alter | Implementation of hook_mail_alter(). |
htmlmail_menu | Implementation of hook_menu(). |
htmlmail_theme | Implementation of hook_theme(). |
template_preprocess_htmlmail | Process variables to format e-mail. |
theme_htmlmail_token_help | Token support |
_htmlmail_emogrify | If the Emogrifier <http://www.pelagodesign.com/sidecar/emogrifier/> exists, the CSS styles inside the the $message['body'] are inserted into the other HTML tags within the same $message['body'] as inline style… |