The 2007 version when somebody clicks on Send the email, it doesn't show anything and the 2008 version shows a page not found when people click on the email contact form link.

I have to say the 2007 version works better than the one of 2008

Please revise (filename: email.module):

====2008 version====


// $Id: email.module,v 1.9.2.8 2008/04/15 11:56:09 mh86 Exp $

/**
 * Implementation of hook_help().
 */
function email_help($section) {
  switch ($section) {
    case 'admin/modules#description':
      return t('Defines a field type for email addresses. <em>Note: Requires content.module.</em>');
  }
}


/**
 * Implementation of hook_field_info().
 */
function email_field_info() {
  return array(
    'email' => array('label' => t('E-Mail')),
   );
}


/**
 * Implementation of hook_field_settings().
 */
function email_field_settings($op, $field) {
  switch ($op) {
    case 'database columns':
      $columns = array(
        'email' => array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => "''"),
      );
      return $columns;
  }
}


/**
 * Implementation of hook_field_formatter_info().
 *
 */
function email_field_formatter_info() {
  $formats = array(
    'default' => array(
      'label' => 'Default Email-Link',
      'field types' => array('email'),
    ),
    'contact' => array(
      'label' => 'Email-Contact Form',
      'field types' => array('email'),
    ),
  );
  
  if (module_exists('invisimail')) {
    $formats['invisi'] = array(
      'label' => 'Email-Invisimail',
      'field types' => array('email'),
    );
  }
  return $formats;
}

function email_field_formatter($field, $item, $formatter, $node) {
  if (empty($item['email'])) {
    return '';
  }
  else {
    if ($formatter == 'contact') {
      $mailto = l(t('Email Contact Form'), 'email/'.$node->nid.'/'.$field['field_name']);
    }
    elseif ($formatter == 'invisi' && module_exists('invisimail')) {
      $format = $GLOBALS['invisimail_format'];
      if (!(variable_get('invisimail_link_'.$format, TRUE))) {     
        variable_set('invisimail_link_'.$format, TRUE);
        variable_set('invisimail_js_'.$format, TRUE);
      }
      $mailto = invisimail_ascii_encode($item['email']);
    }
    else {
      $mailto =  '<a href="mailto:'. $item['email']. '">'. check_plain($item['email']) .'</a>';
    }
    return $mailto;
  }
}


/**
 * Implementation of hook_widget_info().
 */
function email_widget_info() {
  return array(
    'email' => array(
      'label' => t('Textfield'),
      'field types' => array('email'),
    ),
  );
}


/**
 * Implementation of hook_widget_settings().
 */
function email_widget_settings($op, $widget) {
  switch ($op) {
    case 'form':
      $form = array();
      $form['size'] = array(
        '#type' => 'textfield',
        '#title' => t('Size'),
        '#default_value' => isset($widget['size']) ? $widget['size'] : 60,
        '#required' => FALSE,
        '#description' => t('Size of textfield'),
      );
      
      return $form;
      
    case 'validate':
      if (!empty($widget['size']) && (!is_numeric($widget['size']) || intval($widget['size']) != $widget['size'] || $widget['size'] <= 0)) {
        form_set_error('size', t('"Size" must be a positive integer.'));
      }
      break;

    case 'save':
      return array('size');
  }
}


/**
 * Implementation of hook_widget().
 */
function email_widget($op, &$node, $field, &$node_field) {
  switch ($op) {   
    case 'form':
      $form = array();
      $form[$field['field_name']] = array(
        '#tree' => TRUE, 
        '#weight' => $field['widget']['weight'],
      );
      
      if ($field['multiple']) {
        $form[$field['field_name']]['#type'] = 'fieldset';
        $form[$field['field_name']]['#title'] = t($field['widget']['label']);
        foreach (range(0,2) as $delta) {
          $default_value = "";
          if (isset($field['widget']['default_value'][$delta]['email'])) {
            $default_value = $field['widget']['default_value'][$delta]['email'];
          }
          $form[$field['field_name']][$delta]['email'] = array(
            '#type' => 'textfield',
            '#title' => '',
            '#default_value' => isset($node_field[$delta]['email']) ? $node_field[$delta]['email'] : $default_value,
            '#required' => $field['required'] ? $field['required'] : FALSE,
            '#maxlength' => 255,
            '#size' => isset($field['widget']['size']) ? $field['widget']['size'] : 60,
            '#description' => isset($field['widget']['description']) ? $field['widget']['description'] : '',
          );
        }
      }
      else {
        $default_value = "";
        if (isset($field['widget']['default_value'][0]['email'])) {
          $default_value = $field['widget']['default_value'][0]['email'];
        }
        $form[$field['field_name']][0]['email'] = array(
          '#type' => 'textfield',
          '#title' => $field['widget']['label'],
          '#default_value' => isset($node_field[0]['email']) ? $node_field[0]['email'] : $default_value,
          '#required' => $field['required'] ? $field['required'] : FALSE,
          '#maxlength' => 255,
          '#size' => isset($field['widget']['size']) ? $field['widget']['size'] : 60,
          '#description' => isset($field['widget']['description']) ? $field['widget']['description'] : '',
        );
      }
      
      return $form;
    
    case 'validate':
      if (is_array($node_field)) {
        foreach ($node_field as $delta => $item) {
          if ($item['email'] != '' && !valid_email_address(trim($item['email']))) {
            form_set_error($field['field_name'],t('"%mail" is not a valid email address',array('%mail' => $item['email'])));
          }
        }
      }
      break;
  }           
}

/**
 * Implementation of hook_menu().
 */
function email_menu($may_cache) {
  $items = array();

  if ($may_cache) {
    $items[] = array('path' => 'email',
      'title' => t('Email Contact Form'),
      'callback' => 'email_mail_page',
      'access' => user_access('access content'),
      'type' => MENU_CALLBACK,
    );
  }
  return $items;
}

/**
 * The contact form page.
 */
function email_mail_page($nid=null, $fieldname=null) {
  if (empty($nid) || empty($fieldname)) {
    drupal_not_found();
    return;
  }
  $node = node_load(intval($nid));
  if (!$node) {
    drupal_not_found();
    return;
  }
  // Validate field name
  $types = content_types($node->type);
  if (!isset($types['fields'][$fieldname]) ||
      $types['fields'][$fieldname]['type'] != 'email' ||
      ($types['fields'][$fieldname]['display_settings']['teaser']['format'] != 'contact' &&
      $types['fields'][$fieldname]['display_settings']['full']['format'] != 'contact')) {
    drupal_not_found();
    return;
  }
  $field = $node->$fieldname;
  if (empty($field) || empty($field[0]['email'])) {
    drupal_not_found();
    return;
  }

  if (!flood_is_allowed('email', variable_get('email_hourly_threshold', 3))) {
    $output = t("You cannot send more than %number messages per hour. Please try again later.", array('%number' => variable_get('email_hourly_threshold', 3)));
  }
  else {
    $output = drupal_get_form('email_mail_page_form');
  }

  return $output;
}

function email_mail_page_form() {
  global $user;
  
  if ($user->uid) {
    $edit['name'] = $user->name;
    $edit['mail'] = $user->mail;
  }

  $form['#token'] = $user->name . $user->mail;
  $form['name'] = array('#type' => 'textfield',
    '#title' => t('Your name'),
    '#maxlength' => 255,
    '#default_value' => $edit['name'],
    '#required' => TRUE,
  );
  $form['mail'] = array('#type' => 'textfield',
    '#title' => t('Your e-mail address'),
    '#maxlength' => 255,
    '#default_value' => $edit['mail'],
    '#required' => TRUE,
  );
  $form['subject'] = array('#type' => 'textfield',
    '#title' => t('Subject'),
    '#maxlength' => 255,
    '#required' => TRUE,
  );
  $form['message'] = array('#type' => 'textarea',
    '#title' => t('Message'),
    '#required' => TRUE,
  );
  $form['submit'] = array('#type' => 'submit',
    '#value' => t('Send e-mail'),
  );
  return $form;
}

/**
 * Validate the site-wide contact page form submission.
 */
function email_mail_page_form_validate($form_id, $form_values) {
  if (!valid_email_address($form_values['mail'])) {
    form_set_error('mail', t('You must enter a valid e-mail address.'));
  }
  if (preg_match("/\r|\n/", $form_values['subject'])) {
    form_set_error('subject', t('The subject cannot contain linebreaks.'));
    watchdog('mail', 'Email injection exploit attempted in email form subject: '.check_plain($form_values['subject']), WATCHDOG_NOTICE);
  }
}

/**
 * Process the site-wide contact page form submission.
 */
function email_mail_page_form_submit($form_id, $edit) {
  $nid = intval(arg(1));
  $fieldname = arg(2);
  if (empty($nid) || empty($fieldname)) {
    drupal_not_found();
    return;
  }
  $node = node_load($nid);
  if (!$node) {
    drupal_not_found();
    return;
  }
  // Validate field name
  $types = content_types($node->type);
  if (!isset($types['fields'][$fieldname]) ||
      $types['fields'][$fieldname]['type'] != 'email') {
    drupal_not_found();
    return;
  }
  $field = $node->$fieldname;
  if (empty($field) || empty($field[0]['email'])) {
    drupal_not_found();
    return;
  }
  $email = $field[0]['email'];

  // E-mail address of the sender: as the form field is a text field,
  // all instances of \r and \n have been automatically stripped from it.
  $from = $edit['mail'];

  // Compose the body:  
  $message[] = t("@name sent a message using the contact form at @form.", array('@name' => $edit['name'], '@form' => url($_GET['q'], NULL, NULL, TRUE)));  
  $message[] = $edit['message'];
  
  // Tidy up the body:
  foreach ($message as $key => $value) {
    $message[$key] = wordwrap($value);
  }

  // Format the category:
  $subject = t('[@title - @contact] @subject', array('@title' => preg_replace("/\r|\n/",'',$node->title), '@contact' => $types['fields'][$fieldname]['widget']['label'], '@subject' => $edit['subject']));
  
  // Prepare the body:
  $body = implode("\n\n", $message);

  // Send the e-mail to the recipients:
  drupal_mail($fieldname, $email, $subject, $body, $from);

  // Log the operation:
  flood_register_event('email');
  watchdog('mail', t('%name-from sent an e-mail at %form.', array('%name-from' => theme('placeholder', $edit['name'] ." <$from>"), '%form' => url($_GET['q'], NULL, NULL, TRUE))));

  // Update user:
  drupal_set_message(t('Your message has been sent.'));

  // Jump to home page rather than back to contact page to avoid contradictory messages if flood control has been activated.
  return 'node/'.$node->nid;
}

/**
 * Token Integration
 */

/**
 * Implementation of hook token_list
 */
function email_token_list($type = 'all') {
  if ($type == 'field' || $type == 'all') {
    $tokens['email']['email'] = t("Email Address");
    return $tokens;
  }
}

/**
 * Implementation of hook token_values
 */ 
function email_token_values($type, $object = NULL, $options = array()) {
  if ($type == 'field') {
    $item = $object[0];
    $tokens['email'] = check_plain($item['email']);
    return $tokens;
  }
}

====2007 version====


// $Id: email.module,v 1.9.2.3 2007/04/17 05:58:31 mh86 Exp $

/**
 * Implementation of hook_help().
 */
function email_help($section) {
  switch ($section) {
    case 'admin/modules#description':
      return t('Defines a field type for email addresses. <em>Note: Requires content.module.</em>');
  }
}


/**
 * Implementation of hook_field_info().
 */
function email_field_info() {
  return array(
    'email' => array('label' => t('E-Mail')),
   );
}


/**
 * Implementation of hook_field_settings().
 */
function email_field_settings($op, $field) {
  switch ($op) {
    case 'database columns':
      $columns = array(
        'email' => array('type' => 'varchar', 'length' => 255, 'not null' => TRUE),
      );
      return $columns;
  }
}


/**
 * Implementation of hook_field().
 */
function email_field($op, &$node, $field, &$node_field, $teaser, $page) {
  switch ($op) {
    case 'view':     
      foreach ($node_field as $delta => $item) {
        $node_field[$delta]['view'] = content_format($field, $item, 'email', $node);
      }
      return theme('field', $node, $field, $node_field, $teaser, $page);
  }
}

/**
 * Implementation of hook_field_formatter_info().
 *
 */
function email_field_formatter_info() {
  return array(
    'default' => array(
      'label' => 'Default Email-Link',
      'field types' => array('email'),
    ),
    'invisi' => array(
      'label' => 'Email-Invisimail',
      'field types' => array('email'),
    ),
    'contact' => array(
      'label' => 'Email-Contact Form',
      'field types' => array('email'),
    ),
  );
}

function email_field_formatter($field, $item, $formatter, $node) {
  if (empty($item['email'])) {
    return '';
  }
  else {
    if ($field['widget']['link_type'] == 'form' || $formatter == 'contact') {
      $mailto = l(t('Email Contact Form'), 'email/'.$node->nid.'/'.$field['field_name']);
    }
    elseif (($field['widget']['link_type'] == 'mailto_encrypt' || $formatter == 'invisi') && module_exists('invisimail')) {
      $format = $GLOBALS['invisimail_format'];
      if (!(variable_get('invisimail_link_'.$format, TRUE))) {     
        variable_set('invisimail_link_'.$format, TRUE);
        variable_set('invisimail_js_'.$format, TRUE);
      }
      $mailto = invisimail_ascii_encode($item['email']);
    }
    else {
      $mailto =  '<a href="mailto:'. $item['email']. '">'. check_plain($item['email']) .'</a>';
    }
    return $mailto;
  }
}


/**
 * Implementation of hook_widget_info().
 */
function email_widget_info() {
  return array(
    'email' => array(
      'label' => t('Textfield'),
      'field types' => array('email'),
    ),
  );
}


/**
 * Implementation of hook_widget_settings().
 */
function email_widget_settings($op, $widget) {
  switch ($op) {
    case 'form':
      $form = array();
      $form['size'] = array(
        '#type' => 'textfield',
        '#title' => t('Size'),
        '#default_value' => isset($widget['size']) ? $widget['size'] : 60,
        '#required' => FALSE,
        '#description' => t('Size of textfield'),
      );
      
      $options = array(
        'mailto' => t('Mailto: Direct link'), 
        'form' => t('Contact form'), 
      );
      if (module_exists('invisimail')) {
        $options += array('mailto_encrypt' => t('Mailto: Direct link with invisimail encryption'));
      }
      $form['link_type'] = array(
        '#type' => 'radios',
        '#title' => t('Email Link Type'),
        '#default_value' => isset($widget['link_type']) ? $widget['link_type'] : 'mailto',
        '#options' => $options,
      );
      
      return $form;
      
    case 'validate':
      if (!empty($widget['size']) && (!is_numeric($widget['size']) || intval($widget['size']) != $widget['size'] || $widget['size'] <= 0)) {
        form_set_error('size', t('"Size" must be a positive integer.'));
      }
      break;

    case 'save':
      return array('size', 'link_type');
  }
}


/**
 * Implementation of hook_widget().
 */
function email_widget($op, &$node, $field, &$node_field) {
  switch ($op) {   
    case 'form':
      $form = array();
      $form[$field['field_name']] = array(
        '#tree' => TRUE, 
        '#weight' => $field['widget']['weight'],
      );
      
      if ($field['multiple']) {
        $form[$field['field_name']]['#type'] = 'fieldset';
        $form[$field['field_name']]['#title'] = t($field['widget']['label']);
        foreach (range(0,2) as $delta) {
          $default_value = "";
          if (isset($field['widget']['default_value'][$delta]['email'])) {
            $default_value = $field['widget']['default_value'][$delta]['email'];
          }
          $form[$field['field_name']][$delta]['email'] = array(
            '#type' => 'textfield',
            '#title' => '',
            '#default_value' => isset($node_field[$delta]['email']) ? $node_field[$delta]['email'] : $default_value,
            '#required' => $field['required'] ? $field['required'] : FALSE,
            '#maxlength' => 255,
            '#size' => isset($field['widget']['size']) ? $field['widget']['size'] : 60,
            '#description' => isset($field['widget']['description']) ? $field['widget']['description'] : '',
          );
        }
      }
      else {
        $default_value = "";
        if (isset($field['widget']['default_value'][0]['email'])) {
          $default_value = $field['widget']['default_value'][0]['email'];
        }
        $form[$field['field_name']][0]['email'] = array(
          '#type' => 'textfield',
          '#title' => $field['widget']['label'],
          '#default_value' => isset($node_field[0]['email']) ? $node_field[0]['email'] : $default_value,
          '#required' => $field['required'] ? $field['required'] : FALSE,
          '#maxlength' => 255,
          '#size' => isset($field['widget']['size']) ? $field['widget']['size'] : 60,
          '#description' => isset($field['widget']['description']) ? $field['widget']['description'] : '',
        );
      }
      
      return $form;
    
    case 'validate':
      if (is_array($node_field)) {
          foreach ($node_field as $delta => $item) {
            if ($item['email'] != '' && !valid_email_address($item['email'])) {
              form_set_error($field['field_name'],t('"%mail" is not a valid email address',array('%mail' => $item['email'])));
            }
          }
      }
      break;
  }           
}

/**
 * Implementation of hook_menu().
 */
function email_menu($may_cache) {
  $items = array();

  if ($may_cache) {
    $items[] = array('path' => 'email',
      'title' => t('Email Contact Form'),
      'callback' => 'email_mail_page',
      'access' => user_access('access content'),
      'type' => MENU_CALLBACK,
    );
  }
  return $items;
}

/**
 * The contact form page.
 */
function email_mail_page($nid=null, $fieldname=null) {
  if (empty($nid) || empty($fieldname)) {
    drupal_not_found();
    return;
  }
  $node = node_load(intval($nid));
  if (!$node) {
    drupal_not_found();
    return;
  }
  // Validate field name
  $types = content_types($node->type);
  if (!isset($types['fields'][$fieldname]) ||
      $types['fields'][$fieldname]['type'] != 'email' ||
      $types['fields'][$fieldname]['widget']['link_type'] != 'form') {
    drupal_not_found();
    return;
  }
  $field = $node->$fieldname;
  if (empty($field) || empty($field[0]['email'])) {
    drupal_not_found();
    return;
  }

  if (!flood_is_allowed('email', variable_get('email_hourly_threshold', 3))) {
    $output = t("You cannot send more than %number messages per hour. Please try again later.", array('%number' => variable_get('email_hourly_threshold', 3)));
  }
  else {
    $output = drupal_get_form('email_mail_page_form');
  }

  return $output;
}

function email_mail_page_form() {
  global $user;
  
  if ($user->uid) {
    $edit['name'] = $user->name;
    $edit['mail'] = $user->mail;
  }

  $form['#token'] = $user->name . $user->mail;
  $form['name'] = array('#type' => 'textfield',
    '#title' => t('Your name'),
    '#maxlength' => 255,
    '#default_value' => $edit['name'],
    '#required' => TRUE,
  );
  $form['mail'] = array('#type' => 'textfield',
    '#title' => t('Your e-mail address'),
    '#maxlength' => 255,
    '#default_value' => $edit['mail'],
    '#required' => TRUE,
  );
  $form['subject'] = array('#type' => 'textfield',
    '#title' => t('Subject'),
    '#maxlength' => 255,
    '#required' => TRUE,
  );
  $form['message'] = array('#type' => 'textarea',
    '#title' => t('Message'),
    '#required' => TRUE,
  );
  $form['submit'] = array('#type' => 'submit',
    '#value' => t('Send e-mail'),
  );
  return $form;
}

/**
 * Validate the site-wide contact page form submission.
 */
function email_mail_page_form_validate($form_id, $form_values) {
  if (!valid_email_address($form_values['mail'])) {
    form_set_error('mail', t('You must enter a valid e-mail address.'));
  }
  if (preg_match("/\r|\n/", $form_values['subject'])) {
    form_set_error('subject', t('The subject cannot contain linebreaks.'));
    watchdog('mail', 'Email injection exploit attempted in email form subject: '.check_plain($form_values['subject']), WATCHDOG_NOTICE);
  }
}

/**
 * Process the site-wide contact page form submission.
 */
function email_mail_page_form_submit($form_id, $edit) {
  $nid = intval(arg(1));
  $fieldname = arg(2);
  if (empty($nid) || empty($fieldname)) {
    drupal_not_found();
    return;
  }
  $node = node_load($nid);
  if (!$node) {
    drupal_not_found();
    return;
  }
  // Validate field name
  $types = content_types($node->type);
  if (!isset($types['fields'][$fieldname]) ||
      $types['fields'][$fieldname]['type'] != 'email' ||
      $types['fields'][$fieldname]['widget']['link_type'] != 'form') {
    drupal_not_found();
    return;
  }
  $field = $node->$fieldname;
  if (empty($field) || empty($field[0]['email'])) {
    drupal_not_found();
    return;
  }
  $email = $field[0]['email'];

  // E-mail address of the sender: as the form field is a text field,
  // all instances of \r and \n have been automatically stripped from it.
  $from = $edit['mail'];

  // Compose the body:
  $message[] = t("%name sent a message using the contact form at %form.", array('%name' => $edit['name'], '%form' => url($_GET['q'], NULL, NULL, TRUE)));
  $message[] = $edit['message'];

  // Tidy up the body:
  foreach ($message as $key => $value) {
    $message[$key] = wordwrap($value);
  }

  // Format the category:
  $subject = t('[%title - %contact] %subject', array('%title' => preg_replace("/\r|\n/",'',$node->title), '%contact' => $types['fields'][$fieldname]['widget']['label'], '%subject' => $edit['subject']));

  // Prepare the body:
  $body = implode("\n\n", $message);

  // Send the e-mail to the recipients:
  drupal_mail($fieldname, $email, $subject, $body, $from);

  // Log the operation:
  flood_register_event('email');
  watchdog('mail', t('%name-from sent an e-mail at %form.', array('%name-from' => theme('placeholder', $edit['name'] ." <$from>"), '%form' => url($_GET['q'], NULL, NULL, TRUE))));

  // Update user:
  drupal_set_message(t('Your message has been sent.'));

  // Jump to home page rather than back to contact page to avoid contradictory messages if flood control has been activated.
  return 'node/'.$node->nid;
}

Comments

rootwork’s picture

Status: Active » Closed (outdated)