'Advanced mail reroute rules',
'description' => t('Configure which mail will be allowed through, blocked or rerouted'),
'page callback' => 'drupal_get_form',
'page arguments' => array('advanced_mail_reroute_settings_form'),
'access arguments' => array('administer advanced mail reroute')
);
$items['admin/reports/advanced_mail_reroute_log'] = array(
'title' => 'Advanced mail reroute log',
'description' => t('View which mail was allowed through, blocked or rerouted'),
'page callback' => 'advanced_mail_reroute_log',
'access arguments' => array('administer site configuration'),
);
return $items;
}
/**
* Implementation of hook_help()
*/
function advanced_mail_reroute_help($section='') {
$output = '';
switch ($section) {
case "admin/help#advanced_mail_reroute":
$output = '
'. t("Used to reroute all mail or specific mail based on their mail id.") .'
';
break;
}
return $output;
}
/**
* Implementation of hook_theme
*/
function advanced_mail_reroute_theme($existing, $type, $theme, $path) {
return array(
'advanced_mail_reroute_table' => array(
'arguments' => array('element' => NULL),
)
);
}
/**
* Implementation of hook_perm()
*/
function advanced_mail_reroute_perm() {
return array('administer advanced mail reroute');
}
/**
* Implementation of hook_elements()
*/
function advanced_mail_reroute_elements() {
return array(
'advanced_mail_reroute_table' => array(
'#input' => TRUE,
'#process' => array('advanced_mail_reroute_table_process'),
'#element_validate' => array('advanced_mail_reroute_table_validate')
)
);
}
/**
* Implementation of hook_mail_alter()
*/
function advanced_mail_reroute_mail_alter(&$message) {
$num_rows = db_result(db_query("SELECT COUNT(*) FROM {advanced_mail_reroute_rules} WHERE mailkey='%s'", $message['id']));
// fetch or create new rule
if ($num_rows > 0) {
$result = db_query("SELECT reroute_rule, email FROM {advanced_mail_reroute_rules} WHERE mailkey='%s'", $message['id']);
$rule = db_fetch_array($result);
}
else {
$rule = array(
'reroute_rule' => variable_get('advanced_mail_reroute_default_rule', ADVANCED_MAIL_REROUTE_ALLOW),
'email' => ''
);
db_query("INSERT INTO {advanced_mail_reroute_rules} (mailkey, reroute_rule, email) VALUES ('%s', %d, '')", $message['id'], $rule['reroute_rule']);
}
// apply override rule
$reroute_override_rule = variable_get('advanced_mail_reroute_override', ADVANCED_MAIL_REROUTE_OVERRIDE_DISABLED);
if ($reroute_override_rule != ADVANCED_MAIL_REROUTE_OVERRIDE_DISABLED) {
$rule['reroute_rule'] = $reroute_override_rule;
if ($rule['reroute_rule'] == ADVANCED_MAIL_REROUTE_REROUTE) {
$rule['email'] = variable_get('advanced_mail_reroute_primary_email', variable_get('site_mail', NULL));
}
}
else if ($rule['reroute_rule'] == ADVANCED_MAIL_REROUTE_REROUTE && empty($rule['email'])) {
$rule['email'] = variable_get('advanced_mail_reroute_primary_email', variable_get('site_mail', NULL));
}
// log message
if (variable_get('advanced_mail_reroute_log_enabled', TRUE)) {
_advanced_mail_reroute_log($message['id'], $message['from'], $message['to'], $rule['reroute_rule'], $rule['email']);
}
// perform action
switch ($rule['reroute_rule']) {
case ADVANCED_MAIL_REROUTE_ALLOW:
break;
case ADVANCED_MAIL_REROUTE_BLOCK:
$message['to'] = NULL;
// Remove warning about Drupal being unable to send email.
$warnings = drupal_get_messages('warning');
foreach($warnings['warning'] as $warning) {
if($error != 'Unable to send e-mail') {
drupal_set_message($warning, 'warning');
}
}
break;
case ADVANCED_MAIL_REROUTE_REROUTE:
_advanced_mail_reroute_reroute($message, $rule['email']);
break;
}
}
//=============================================================================
// Callback Functions
//=============================================================================
function advanced_mail_reroute_settings_form() {
drupal_add_js(drupal_get_path('module', 'advanced_mail_reroute') .'/advanced_mail_reroute.js');
$override_value_to_index = array(
ADVANCED_MAIL_REROUTE_OVERRIDE_DISABLED => 0,
ADVANCED_MAIL_REROUTE_ALLOW => 1,
ADVANCED_MAIL_REROUTE_BLOCK => 2,
ADVANCED_MAIL_REROUTE_REROUTE => 3
);
$override_value = variable_get('advanced_mail_reroute_override', ADVANCED_MAIL_REROUTE_OVERRIDE_DISABLED);
$form['#tree'] = TRUE;
$form['main_settings'] = array(
'#type' => 'fieldset',
'#title' => t('Main settings'),
'#collapsible' => TRUE
);
$form['main_settings']['override'] = array(
'#type' => 'select',
'#title' => t('Override rule'),
'#options' => array(t('- Disabled -'), t('Allow all emails through'), t('Block all emails'), t('Redirect all emails to primary email address')),
'#default_value' => $override_value_to_index[$override_value],
'#description' => t('This will override any settings in the Mailkey rules table')
);
$form['main_settings']['primary_email'] = array(
'#type' => 'textfield',
'#title' => t('Primary E-mail'),
'#default_value' => variable_get('advanced_mail_reroute_primary_email', variable_get('site_mail', '')),
'#description' => t('By default all E-mails will be sent to this address'),
);
$form['main_settings']['enable_logging'] = array(
'#type' => 'checkbox',
'#title' => t('Enable logging'),
'#default_value' => variable_get('advanced_mail_reroute_enable_logging', TRUE),
);
$mailkey_rules_description = t('This table is automatically updated as new mailkeys are discovered.');
if (variable_get('advanced_mail_reroute_override', ADVANCED_MAIL_REROUTE_OVERRIDE_DISABLED) != ADVANCED_MAIL_REROUTE_OVERRIDE_DISABLED) {
$mailkey_rules_description .= ' '. t('Override is currently enabled. All rules below will be ignored.') .'
';
}
$form['mailkey_rules'] = array(
'#type' => 'fieldset',
'#title' => t('Reroute rules'),
'#collapsible' => TRUE,
'#description' => $mailkey_rules_description,
);
$form['mailkey_rules']['default_rule'] = array(
'#type' => 'select',
'#title' => t('Default rule for new mailkeys'),
'#options' => array('Allow', 'Block', 'Reroute'),
'#default_value' => variable_get('advanced_mail_reroute_default_rule', ADVANCED_MAIL_REROUTE_DEFAULT_RULE),
);
$form['mailkey_rules']['table'] = array(
'#type' => 'advanced_mail_reroute_table'
);
$form['new_rule'] = array(
'#type' => 'fieldset',
'#title' => t('New rule'),
'#collapsible' => TRUE,
'#collapsed' => TRUE
);
$form['new_rule']['mailkey'] = array(
'#type' => 'textfield',
'#title' => t('Mailkey')
);
$form['new_rule']['rule'] = array(
'#type' => 'select',
'#title' => t('Rule'),
'#options' => array('Allow', 'Block', 'Reroute'),
'#default_value' => variable_get('advanced_mail_reroute_default_rule', ADVANCED_MAIL_REROUTE_DEFAULT_RULE),
'#attributes' => array('class' => 'advanced-mail-reroute-rule')
);
$form['new_rule']['email'] = array(
'#type' => 'textfield',
'#title' => t('E-mail'),
'#description' => t("When reroute is selected you may enter an optional email if"),
'#attributes' => array('class' => 'advanced-mail-reroute-email')
);
$form['submit'] = array(
'#type' => 'submit',
'#value' => t('Save'),
);
return $form;
}
function advanced_mail_reroute_settings_form_validate($form_id, $form_values) {
if (!valid_email_address($form_values['values']['main_settings']['primary_email'])) {
form_set_error('main_settings][primary_email', t('Invalid email entered for primary email'));
}
$new_rule = $form_values['values']['new_rule'];
if (!empty($new_rule['mailkey']) && $new_rule['rule'] == ADVANCED_MAIL_REROUTE_REROUTE &&
!empty($new_rule['email']) && !valid_email_address($new_rule['email'])) {
form_set_error('new_rule][email', t('Invalid email entered for new mailkey rule'));
}
}
function advanced_mail_reroute_settings_form_submit($form_id, $form_state) {
$override_index_to_value = array(
0 => ADVANCED_MAIL_REROUTE_OVERRIDE_DISABLED,
1 => ADVANCED_MAIL_REROUTE_ALLOW,
2 => ADVANCED_MAIL_REROUTE_BLOCK,
3 => ADVANCED_MAIL_REROUTE_REROUTE
);
$override_index = $form_state['values']['main_settings']['override'];
variable_set('advanced_mail_reroute_override', $override_index_to_value[$override_index]);
variable_set('advanced_mail_reroute_primary_email', $form_state['values']['main_settings']['primary_email']);
variable_set('advanced_mail_reroute_enable_logging', $form_state['values']['main_settings']['enable_logging']);
variable_set('advanced_mail_reroute_default_rule', $form_state['values']['mailkey_rules']['default_rule']);
$new_rule = $form_state['values']['new_rule'];
if (!empty($new_rule['mailkey'])) {
$email = ($new_rule['rule'] == ADVANCED_MAIL_REROUTE_REROUTE ? $new_rule['email'] : '');
db_query("INSERT INTO {advanced_mail_reroute_rules} (mailkey, reroute_rule, email) VALUES ('%s', %d, '%s')",
$new_rule['mailkey'], $new_rule['rule'], $new_rule['email']);
}
$table = $form_state['values']['mailkey_rules']['table']['mailkeys'];
if (!empty($table)) {
foreach ($table as $key => $value) {
if ($value['remove']) {
db_query("DELETE FROM {advanced_mail_reroute_rules} WHERE mailkey ='%s'", $value['mailkey']);
}
else {
$email = ($value['rule'] == ADVANCED_MAIL_REROUTE_REROUTE ? $value['email'] : '');
db_query("UPDATE {advanced_mail_reroute_rules} SET reroute_rule = %d, email = '%s' WHERE mailkey = '%s'", $value['rule'], $email, $value['mailkey']);
}
}
}
}
function advanced_mail_reroute_table_process($element, $form_state) {
$result = db_query('SELECT mailkey, reroute_rule, email FROM {advanced_mail_reroute_rules}');
while ($row = db_fetch_object($result)) {
$element['mailkeys']['M'. $row->mailkey] = array( // prefix with 'M' so mailkeys which begin with a '#' won't get discarded in the theme function
'mailkey' => array(
'#type' => 'hidden',
'#value' => $row->mailkey,
),
'rule' => array(
'#type' => 'select',
'#options' => array('Allow', 'Block', 'Reroute'),
'#default_value' => $row->reroute_rule,
'#attributes' => array('class' => 'advanced-mail-reroute-rule')
),
'email' => array(
'#type' => 'textfield',
'#default_value' => $row->email,
'#size' => 25,
'#attributes' => array('class' => 'advanced-mail-reroute-email')
),
'remove' => array(
'#type' => 'checkbox',
'#default_value' => 0
)
);
}
return $element;
}
function advanced_mail_reroute_table_validate($element, $form_state) {
if (!empty($form_state['values']['new_rule']['mailkey'])) {
$num_rows = db_result(db_query("SELECT COUNT(*) FROM {advanced_mail_reroute_rules} WHERE mailkey='%s'", $form_state['values']['new_rule']['mailkey']));
if ($num_rows > 0) {
form_set_error('new_rule][mailkey', t('Mailkey for new rule already exists'));
}
}
if (!empty($form_state['values']['mailkey_rules']['table']['mailkeys'])) {
foreach ($form_state['values']['mailkey_rules']['table']['mailkeys'] as $key => $value) {
if ($value['rule'] == ADVANCED_MAIL_REROUTE_REROUTE &&
!empty($value['email']) &&
!$value['remove'] &&
!valid_email_address($value['email'])) {
form_set_error($key, t("Invalid email entered for mailkey rule '". substr($key, 1) ."'"));
}
}
}
}
function theme_advanced_mail_reroute_table($element) {
if (isset($element['mailkeys'])) {
foreach ($element['mailkeys'] as $mailkey => $row) {
if ($mailkey[0] == 'M') { // drupal inserts a lot of other stuff beginning with '#' so we want to skip past that.
$rows[] = array(
$row['mailkey']['#value'],
theme('select', $row['rule']),
theme('textfield', $row['email']),
theme('checkbox', $row['remove'])
);
}
}
}
if (!isset($rows)) {
$rows[] = array(array('data' => t('No rules available.'), 'colspan' => 5));
}
$header = array(t('Mailkey'), t('Rule'), t('E-mail'), t('Remove'));
$output = theme('table', $header, $rows);
return $output;
}
/*
function advanced_mail_reroute_log() {
$actions = array('Allowed', 'Blocked', 'Rerouted');
$header = array(
array('data' => t('Time'), 'field' => 'timestamp', 'sort' => 'desc'),
array('data' => t('Mailkey'), 'field' => 'mailkey'),
array('data' => t('From'), 'field' => 'from_email'),
array('data' => t('To'), 'field' => 'to_email'),
array('data' => t('Action'), 'field' => 'reroute_rule')
);
$result = pager_query("SELECT timestamp, mailkey, from_email, to_email, reroute_rule, reroute_email FROM {advanced_mail_reroute_log}"
. tablesort_sql($header), 30, 0, "SELECT COUNT(id) FROM {advanced_mail_reroute_log}");
while ($row = db_fetch_object($result)) {
$action_taken = $actions[$row->reroute_rule];
if ($row->reroute_rule == ADVANCED_MAIL_REROUTE_REROUTE) {
$action_taken .= ' to '. $row->reroute_email;
}
$rows[] = array(date('Y-m-d H:i:s', $row->timestamp), $row->mailkey, $row->from_email, $row->to_email, $action_taken);
}
if (!$rows) {
$rows[] = array(array('data' => t('No log messages available.'), 'colspan' => 5));
}
$content = theme('table', $header, $rows);
$content .= theme('pager', NULL, 30, 0);
return $content;
}*/
function advanced_mail_reroute_log() {
//if ($node = node_load(arg(1))) {
$header = array(
array('data' => t('Time'), 'field' => 'timestamp', 'sort' => 'desc'),
array('data' => t('Mailkey'), 'field' => 'mailkey'),
array('data' => t('From'), 'field' => 'from_email'),
array('data' => t('To'), 'field' => 'to_email'),
array('data' => t('Action'), 'field' => 'reroute_rule')
);
$query = db_select('advanced_mail_reroute_log', 'amr', array('target' => 'slave'))->extend('PagerDefault')->extend('TableSort');
$query
->fields('amr', array('timestamp', 'mailkey', 'from_email', 'to_email', 'reroute_rule', 'reroute_email'))
->limit(30)
->orderByHeader($header);
$result = $query->execute();
$rows = array();
foreach ($result as $log) {
$rows[] = array(
array('data' => format_date($log->timestamp, 'short'), 'class' => array('nowrap')),
);
}
//drupal_set_title($node->title);
$build['advanced_mail_reroute_table'] = array(
'#theme' => 'table',
'#header' => $header,
'#rows' => $rows,
'#empty' => t('No logs available.'),
);
$build['advanced_mail_reroute_pager'] = array('#theme' => 'pager');
return $build;
//}
//else {
// drupal_not_found();
//}
}
//=============================================================================
// Private Functions
//=============================================================================
function _advanced_mail_reroute_log($mailkey, $from, $to, $reroute_rule, $reroute_email = '') {
db_query("INSERT INTO {advanced_mail_reroute_log} (timestamp, mailkey, from_email, to_email, reroute_rule, reroute_email)
VALUES (%d, '%s', '%s', '%s', %d, '%s')", time(), $mailkey, $from, $to, $reroute_rule, $reroute_email);
}
function _advanced_mail_reroute_reroute(&$message, $reroute_to) {
$message['body'] = is_array($message['body']) ? implode("\n\n", $message['body']) : $message['body'];
global $base_url;
$message['subject'] = 'Rerouted email: '. $message['subject'];
// Format copied from reroute_email module: http://drupal.org/project/reroute_email
$body_header = "This email was rerouted.\n";
$body_header .= "Web site: @site\n";
$body_header .= "Mail key: @key\n";
$body_header .= "Originally to: <@to>\n";
$body_header .= "-----------------------\n";
$body_header = t($body_header, array('@site' => $base_url, '@to' => $message['to'], '@key' => $message['id']));
$message['body'] = $body_header . (is_array($message['body']) ? implode("\n\n", $message['body']) : $message['body']);
$message['to'] = $reroute_to;
}