'. t('The Mass Contact module is simply a modified version of the core contact module. It works opposite the latter, in that it allows site moderators (or anyone with permission), to send mass e-mail to a set role or group of roles or even to all registered users.') .'
'; $output .= ''. t("The sender's own address may be placed in the 'To:' field and all recipients placed in the 'BCC:' field, or the recipients simply placed in the 'To:' field. Note that the latter option leaves all recipients open to abuse due to their e-mail addresses being visible to all other recipients.") .'
'; $output .= ''. t("The e-mail may be sent as html or plain text, and may include a single binary file attachment (if permitted by admin).") .'
'; $output .= ''. t("At the option of the sender (if permitted by admin), a node may be created in order to keep a record of the e-mail sent. Do not try to send e-mails by creating nodes; it will not work.") .'
'; $output .= ''. t('Users may opt-out of mass mailings on their profile page, but this may be overridden by the admin (or respected). The entire opt-out system may be disabled on the settings page.', array('@settings-page' => url('admin/build/mass_contact/settings'))) .'
'; $output .= ''. t('Make sure to add at least one category and configure the module before trying to send mass e-mails.') .'
'; if (!module_exists('menu')) { $menu_note = t('The menu item can be customized and configured only once the menu module has been enabled.', array('@modules-page' => url('admin/build/modules'))); } else { $menu_note = ''; } $output .= ''. t('The Mass Contact module also adds a menu item (disabled by default) to the navigation block.', array('@menu-settings' => url('admin/build/menu'))) .' '. $menu_note .'
'; return ($output); } } /** * Implementation of hook_perm */ function mass_contact_perm() { return array('access mass contact form', 'choose whether to archive mass contact messages', 'send mass contact attachments'); } /** * Implementation of hook_menu(). */ function mass_contact_menu($may_cache) { $items = array(); if ($may_cache) { $items[] = array( 'path' => 'admin/build/mass_contact', 'title' => t('Mass Contact form'), 'description' => t('Create a mass contact form and set up categories for the form to use.'), 'callback' => 'mass_contact_admin_categories', 'access' => user_access('administer site configuration'), ); $items[] = array( 'path' => 'admin/build/mass_contact/list', 'title' => t('List'), 'callback' => 'mass_contact_admin_categories', 'access' => user_access('administer site configuration'), 'type' => MENU_DEFAULT_LOCAL_TASK, ); $items[] = array( 'path' => 'admin/build/mass_contact/add', 'title' => t('Add category'), 'callback' => 'drupal_get_form', 'callback arguments' => array('mass_contact_admin_edit'), 'access' => user_access('administer site configuration'), 'type' => MENU_LOCAL_TASK, 'weight' => 1, ); $items[] = array( 'path' => 'admin/build/mass_contact/edit', 'title' => t('Edit Mass Contact category'), 'callback' => 'drupal_get_form', 'callback arguments' => array('mass_contact_admin_edit'), 'access' => user_access('administer site configuration'), 'type' => MENU_CALLBACK, ); $items[] = array( 'path' => 'admin/build/mass_contact/delete', 'title' => t('Delete Mass Contact category'), 'callback' => 'drupal_get_form', 'callback arguments' => array('mass_contact_admin_delete'), 'access' => user_access('administer site configuration'), 'type' => MENU_CALLBACK, ); $items[] = array( 'path' => 'admin/build/mass_contact/settings', 'title' => t('Settings'), 'callback' => 'drupal_get_form', 'callback arguments' => array('mass_contact_admin_settings'), 'access' => user_access('administer site configuration'), 'type' => MENU_LOCAL_TASK, 'weight' => 2, ); $items[] = array( 'path' => 'mass_contact', 'title' => t('Mass Contact'), 'callback' => 'mass_contact_site_page', 'access' => user_access('access mass contact form'), 'type' => MENU_SUGGESTED_ITEM, ); $items[] = array( 'path' => 'node/add/mass_contact', 'title' => t('Mass Contact'), 'access' => user_access('create mass_contact content'), 'type' => MENU_SUGGESTED_ITEM, ); } return $items; } /** * Categories/list tab. */ function mass_contact_admin_categories() { $result = db_query('SELECT cid, category, recipients, selected FROM {mass_contact}'); $rows = array(); while ($category = db_fetch_object($result)) { $rolenamesa = array(); foreach (explode(',', $category->recipients) as $rid) { $namerole = db_fetch_object(db_query('SELECT name FROM {role} WHERE rid = %d', $rid)); $rolenamesa[] = ($namerole->name); } $rolenames = implode(', ', $rolenamesa); $rows[] = array($category->category, $rolenames, ($category->selected ? t('Yes') : t('No')), l(t('edit'), 'admin/build/mass_contact/edit/'. $category->cid), l(t('delete'), 'admin/build/mass_contact/delete/'. $category->cid)); } $header = array(t('Category'), t('Recipients'), t('Selected'), array('data' => t('Operations'), 'colspan' => 2)); return theme('table', $header, $rows); } /** * Category edit page. */ function mass_contact_admin_edit($cid = NULL) { if (arg(3) == "edit" && $cid > 0) { $edit = db_fetch_array(db_query("SELECT * FROM {mass_contact} WHERE cid = %d", $cid)); } $form['category'] = array( '#type' => 'textfield', '#title' => t('Category'), '#maxlength' => 255, '#default_value' => $edit['category'], '#description' => t("Will appear in the subject of your e-mail as [category]."), '#required' => TRUE, ); // get all roles except anonymous $allroles = db_query('SELECT rid, name FROM {role} WHERE rid > 1'); while ($roleobj = db_fetch_object($allroles)) { $onerid = $roleobj->rid; $onename = $roleobj->name; $rolesarray[$onerid] = $onename; } $form['recipients'] = array( '#type' => 'checkboxes', '#title' => t('Roles to receive e-mail'), '#options' => $rolesarray, '#default_value' => explode(',', $edit['recipients']), '#description' => t('These roles will be added to the mailing list. Note: if you check "authenticated users", other roles will not be added, as they will receive the e-mail anyway.'), ); $form['selected_categories'] = array( '#type' => 'fieldset', '#title' => t('Selected categories'), ); $form['selected_categories']['selected'] = array( '#type' => 'select', '#title' => t('Selected'), '#options' => array('0' => t('No'), '1' => t('Yes')), '#default_value' => $edit['selected'], '#description' => t('Set this to Yes if you would like this category to be selected by default.'), ); $form['selected_categories']['reset_selected'] = array( '#type' => 'checkbox', '#title' => t('Reset all previously selected categories to No.'), ); $form['cid'] = array( '#type' => 'value', '#value' => $edit['cid'], ); $form['submit'] = array( '#type' => 'submit', '#value' => t('Submit'), ); return $form; } /** * Validate the mass_contact category edit page form submission. */ function mass_contact_admin_edit_validate($form_id, $form_values) { $recipients = $form_values['recipients']; foreach ($recipients as $checkr) { if ($checkr > 1) { return; } } form_set_error('recipients', t('You must check one or more recipients.')); } /** * Process the mass_contact category edit page form submission. */ function mass_contact_admin_edit_submit($form_id, $form_values) { if ($form_values['reset_selected']) { // Unselect all other contact categories. db_query('UPDATE {mass_contact} SET selected = 0'); } // Remove 0s for unselected roles, convert to csv. $recipients = $form_values['recipients']; // If all authenticated users are already added, remove all roles. if ($recipients[2] == 2) { foreach ($recipients as $checkr) { if ($checkr > 2) { $recipients[$checkr] = 0; } } } // Remove roles that were not selected. foreach ($recipients as $recip) { if ($recip != 0) { $newformrec[] = $recip; } } $form_values['recipients'] = implode(',', $newformrec); if (arg(3) == 'add') { db_query("INSERT INTO {mass_contact} (category, recipients, reply, weight, selected) VALUES ('%s', '%s', '%s', %d, %d)", $form_values['category'], $form_values['recipients'], $form_values['reply'], $form_values['weight'], $form_values['selected']); drupal_set_message(t('Category %category has been added.', array('%category' => $form_values['category']))); watchdog('mass_contact', t('Mass Contact form: category %category added.', array('%category' => $form_values['category'])), WATCHDOG_NOTICE, l(t('view'), 'admin/build/mass_contact')); } else { db_query("UPDATE {mass_contact} SET category = '%s', recipients = '%s', reply = '%s', weight = %d, selected = %d WHERE cid = %d", $form_values['category'], $form_values['recipients'], $form_values['reply'], $form_values['weight'], $form_values['selected'], $form_values['cid']); drupal_set_message(t('Category %category has been updated.', array('%category' => $form_values['category']))); watchdog('mass_contact', t('Mass Contact form: category %category updated.', array('%category' => $form_values['category'])), WATCHDOG_NOTICE, l(t('view'), 'admin/build/mass_contact')); } return 'admin/build/mass_contact'; } /** * Category delete page. */ function mass_contact_admin_delete($cid = NULL) { if ($info = db_fetch_object(db_query("SELECT category FROM {mass_contact} WHERE cid = %d", $cid))) { $form['category'] = array( '#type' => 'value', '#value' => $info->category, ); return confirm_form($form, t('Are you sure you want to delete %category?', array('%category' => $info->category)), 'admin/build/mass_contact', t('This action cannot be undone.'), t('Delete'), t('Cancel')); } else { drupal_set_message(t('Category not found.'), 'error'); drupal_goto('admin/build/mass_contact'); } } /** * Process category delete form submission. */ function mass_contact_admin_delete_submit($form_id, $form_values) { db_query("DELETE FROM {mass_contact} WHERE cid = %d", arg(4)); drupal_set_message(t('Category %category has been deleted.', array('%category' => $form_values['category']))); watchdog('mass_contact', t('Mass Contact form: category %category deleted.', array('%category' => $form_values['category'])), WATCHDOG_NOTICE); return 'admin/build/mass_contact'; } /** * Administration settings form. */ function mass_contact_admin_settings() { $form['mass_contact_form_information'] = array( '#type' => 'textarea', '#title' => t('Additional information for Mass Contact form'), '#default_value' => variable_get('mass_contact_form_information', t('Send e-mails using the following form.')), '#description' => t('Information to show on the Mass Contact page.', array('@form' => url('mass_contact'))), ); $form['mass_contact_default_sender'] = array( '#type' => 'fieldset', '#title' => t('Default sender information'), '#description' => t('If anything is specified in here, it is used in place of the "Your name" and "Your e-mail address" fileds when sending the mass e-mail. Otherwise, the sender\'s name and e-mail address will be the default values. You must fill in both values, if you want to specify a default.'), ); $form['mass_contact_default_sender']['mass_contact_default_sender_name'] = array( '#type' => 'textfield', '#title' => t('Default sender name'), '#default_value' => variable_get('mass_contact_default_sender_name', ''), '#size' => 60, '#maxlength' => 128, '#description' => t('The optional user name to send e-mail as. Replaces the "Your name" value when sending mass e-mails.'), ); $form['mass_contact_default_sender']['mass_contact_default_sender_email'] = array( '#type' => 'textfield', '#title' => t('Default sender e-mail address'), '#default_value' => variable_get('mass_contact_default_sender_email', ''), '#size' => 60, '#maxlength' => 128, '#description' => t('The optional user e-mail address to send e-mail as. Replaces the "Your e-mail address" value when sending mass e-mails.'), ); $form['mass_contact_recipient_limit'] = array( '#type' => 'textfield', '#title' => t('Max number of users before breaking up the e-mail'), '#size' => 4, '#default_value' => variable_get('mass_contact_recipient_limit', 0), '#description' => t('This is a workaround for server-side limits on the number of recipients in a single mail message. Once this limit is reached, the recipient list will be broken up and multiple copies of the message will be sent out until all recipients receive the mail. Setting this to "0" will turn off this feature.'), '#required' => TRUE, ); $form['mass_contact_optout_d'] = array( '#type' => 'checkbox', '#title' => t('Allow users to opt-out of mass e-mails.'), '#default_value' => variable_get('mass_contact_optout_d', 0), ); $form['mass_contact_bcc_d'] = array( '#type' => 'checkbox', '#title' => t('Send as BCC (hide recipients) by default.'), '#default_value' => variable_get('mass_contact_bcc_d', 1), ); $form['mass_contact_bcc_d_override'] = array( '#type' => 'checkbox', '#title' => t('Allow sender to override BCC setting.'), '#default_value' => variable_get('mass_contact_bcc_d_override', 1), ); $form['mass_contact_category_override'] = array( '#type' => 'checkbox', '#title' => t('Include category in subject line.'), '#default_value' => variable_get('mass_contact_category_override', 1), ); $form['mass_contact_supplemental_texts'] = array( '#type' => 'fieldset', '#title' => t('Supplemental message body texts'), '#description' => t('You may specify additional text to insert before and/or after the message text of every mass e-mail that is sent.'), ); if (module_exists('token')) { $form['mass_contact_supplemental_texts']['mass_contact_message_prefix'] = array( '#type' => 'textarea', '#title' => t('Text to be prepended to all messages'), '#default_value' => variable_get('mass_contact_message_prefix', t('[user-name] has sent you a group e-mail from [site-name].')), '#description' => t('The text you specify above will be added to all e-mails sent out. The text will be placed before the message text enetered in by the sender.'), ); $form['mass_contact_supplemental_texts']['mass_contact_message_suffix'] = array( '#type' => 'textarea', '#title' => t('Text to be appended to all messages'), '#default_value' => variable_get('mass_contact_message_suffix', t('')), '#description' => t('The text you specify above will be added to all e-mails sent out. The text will be placed after the message text enetered in by the sender.'), ); $form['mass_contact_supplemental_texts']['mass_contact_replacement_tokens'] = array( '#type' => 'fieldset', '#title' => t('Replacement tokens'), '#collapsible' => TRUE, '#collapsed' => TRUE, '#description' => t('You may use any of the following replacements tokens for use in the prefix and/or suffix texts above.'), ); $form['mass_contact_supplemental_texts']['mass_contact_replacement_tokens']['token_help'] = array( '#value' => theme('token_help', 'global'), ); } else { $form['mass_contact_supplemental_texts']['mass_contact_message_prefix'] = array( '#type' => 'textarea', '#title' => t('Text to be prepended to all messages'), '#default_value' => variable_get('mass_contact_message_prefix', t('You were sent a group e-mail from !site.', array('!site' => url(NULL, NULL, NULL, TRUE)))), '#description' => t('The text you specify above will be added to all e-mails sent out. The text will be placed before the message text enetered in by the sender.'), ); $form['mass_contact_supplemental_texts']['mass_contact_message_suffix'] = array( '#type' => 'textarea', '#title' => t('Text to be appended to all messages'), '#default_value' => variable_get('mass_contact_message_suffix', t('')), '#description' => t('The text you specify above will be added to all e-mails sent out. The text will be placed after the message text enetered in by the sender.'), ); } $form['mass_contact_HTML_d'] = array( '#type' => 'checkbox', '#title' => t('Send as HTML by default.'), '#default_value' => variable_get('mass_contact_HTML_d', 1), ); $form['mass_contact_nodecc_d'] = array( '#type' => 'checkbox', '#title' => t('Save a copy as a node by default.'), '#default_value' => variable_get('mass_contact_nodecc_d', 1), ); $form['mass_contact_attachment_location'] = array( '#type' => 'textfield', '#title' => t('Attachment location'), '#default_value' => variable_get('mass_contact_attachment_location', file_directory_path() .'/mass_contact_attachments'), '#description' => t('If a copy of the message is saved as a node, this is the file path where to save the attachment so it can be viewed later.'), ); $form['mass_contact_hourly_threshold'] = array( '#type' => 'select', '#title' => t('Hourly threshold'), '#options' => drupal_map_assoc(array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 15, 20, 25, 30, 40, 50, 75, 100)), '#default_value' => variable_get('mass_contact_hourly_threshold', 3), '#description' => t('The maximum number of Mass Contact form submissions a user can perform per hour.'), ); return system_settings_form($form); } /** * Validation for the administration settings form. */ function mass_contact_admin_settings_validate($form_id, $form_values) { if (!empty($form_values['mass_contact_default_sender_name'])) { if (empty($form_values['mass_contact_default_sender_email'])) { form_set_error('mass_contact_default_sender_email', t('If you are going to specify default user settings, you must specify both a user name and a user e-mail address.')); } } if (!empty($form_values['mass_contact_default_sender_email'])) { if (empty($form_values['mass_contact_default_sender_name'])) { form_set_error('mass_contact_default_sender_name', t('If you are going to specify default user settings, you must specify both a user name and a user e-mail address.')); } } } /** * Implementation of hook_user(). * * Provide form element to opt in to content mailouts. */ function mass_contact_user($type, $edit, &$user, $category = NULL) { if (variable_get('mass_contact_optout_d', 0) == 1) { if ($type == 'register' || ($type == 'form' && $category == 'account')) { $form['mail'] = array( '#type' => 'fieldset', '#title' => t('Group e-mail settings'), '#weight' => 5, '#collapsible' => TRUE, ); $form['mail']['mass_contact_optout'] = array( '#type' => 'checkbox', '#title' => t('Opt-out of Mass E-mails'), '#default_value' => $edit['mass_contact_optout'], '#description' => t('Allows you to opt-out of group e-mails from privileged users. Note that site administrators are able to include you in mass e-mails even if you choose not to enable this feature, and the ability to opt-out may be removed by the administrator at any time.'), ); return $form; } elseif ($type == 'validate') { return array('mass_contact_optout' => $edit['mass_contact_optout']); } } } /** * mail page */ function mass_contact_site_page() { global $user; if (!user_access('administer site configuration') && !flood_is_allowed('mass_contact', variable_get('mass_contact_hourly_threshold', 3))) { $output = t("You cannot send more than %number messages per hour. Please try again later.", array('%number' => variable_get('mass_contact_hourly_threshold', 3))); } else { $output = drupal_get_form('mass_contact_mail_page'); } return $output; } /** * */ function mass_contact_mail_page() { global $user; $result = db_query('SELECT cid, category, selected FROM {mass_contact} ORDER BY weight, category'); while ($category = db_fetch_object($result)) { $categories[$category->cid] = $category->category; if ($category->selected) { $default_category[] = $category->cid; $default_category_name = $category->category; } } if (count($categories) > 0) { $form['#attributes'] = array( 'enctype' => "multipart/form-data" ); $form['#token'] = $user->name . $user->mail; $form['contact_information'] = array( '#value' => filter_xss_admin(variable_get('mass_contact_form_information', t('Send an e-mail message using the contact form below.'))) ); $mass_contact_default_sender_name = variable_get('mass_contact_default_sender_name', ''); if ($mass_contact_default_sender_name) { $form['name'] = array( '#type' => 'textfield', '#title' => t('Your name'), '#maxlength' => 255, '#default_value' => $mass_contact_default_sender_name, '#disabled' => TRUE, ); } else { $form['name'] = array( '#type' => 'textfield', '#title' => t('Your name'), '#maxlength' => 255, '#default_value' => $user->uid ? $user->name : '', '#required' => TRUE, ); } $mass_contact_default_sender_email = variable_get('mass_contact_default_sender_email', ''); if ($mass_contact_default_sender_email) { $form['mail'] = array( '#type' => 'textfield', '#title' => t('Your e-mail address'), '#maxlength' => 255, '#default_value' => $mass_contact_default_sender_email, '#disabled' => TRUE, ); } else { $form['mail'] = array( '#type' => 'textfield', '#title' => t('Your e-mail address'), '#maxlength' => 255, '#default_value' => $user->uid ? $user->mail : '', '#required' => TRUE, ); } // If there is more than one category available and no default category has been selected, // prepend a default placeholder value. // if (!isset($default_category)) { // $categories = array(t('--')) + $categories; // } if ((count($categories) > 1) || !isset($default_category)) { // Display a choice when one is needed. $form['cid'] = array( '#type' => 'select', '#title' => t('Category'), '#default_value' => $default_category, '#options' => $categories, '#required' => TRUE, '#multiple' => TRUE, ); } else { // Otherwise, just use the default category. $form['cid'] = array( '#type' => 'value', // '#value' => array($default_category), // This must be an array, otherwise the code breaks upon submit. '#value' => $default_category, // This must be an array, otherwise the code breaks upon submit. ); $form['cid-info'] = array( '#type' => 'markup', '#value' => 'Sending to all users subscribed to the '. $default_category_name .' category.
', ); } if (variable_get('mass_contact_optout_d', 0) == 1) { // Allow to override or respect opt-outs if admin, otherwise use default. if (user_access('administer site configuration')) { $form['optout'] = array( '#type' => 'checkbox', '#title' => t('Respect user opt-outs.'), '#default_value' => 1, ); } else { $form['optout'] = array( '#type' => 'hidden', '#default_value' => 1, ); } } // Check if the user can override BCC. if (variable_get('mass_contact_bcc_d_override', 1)) { $form['bcc'] = array( '#type' => 'checkbox', '#title' => t('Send as BCC (hide recipients).'), '#default_value' => variable_get('mass_contact_bcc_d', 1), ); } // If not, then just display the BCC info. else { $form['bcc'] = array( '#type' => 'value', '#value' => variable_get('mass_contact_bcc_d', 1), ); $form['bcc-info'] = array( '#type' => 'markup', '#value' => ''. (variable_get('mass_contact_bcc_d', 1) ? t('Recipients will be hidden.') : t('Recipients will NOT be hidden.')) .'
', ); } $form['subject'] = array( '#type' => 'textfield', '#title' => t('Subject'), '#maxlength' => 255, '#required' => TRUE, ); $form['message'] = array( '#type' => 'textarea', '#title' => t('Message'), '#required' => TRUE, ); if (user_access('send mass contact attachments')) { $form['attachment'] = array( '#type' => 'file', '#title' => t('Attachment'), '#size' => 40, ); } $form['html'] = array( '#type' => 'checkbox', '#title' => t('Send as HTML.'), '#default_value' => variable_get('mass_contact_HTML_d', 1), ); if (user_access('choose whether to archive mass contact messages')) { $form['nodecc'] = array( '#type' => 'checkbox', '#title' => t('Save a copy as a node.'), '#default_value' => variable_get('mass_contact_nodecc_d', 1), ); } else { $form['nodecc'] = array( '#type' => 'hidden', '#default_value' => variable_get('mass_contact_nodecc_d', 1), ); } /* // Place hooder for future use. $form['preview'] = array( '#type' => 'button', '#value' => t('Preview') ); */ $form['submit'] = array( '#type' => 'submit', '#value' => t('Send e-mail'), ); } else { $form['error'] = array( '#value' => ''. t('You must create at least one category before using this form.') .'', ); } if (user_access('administer site configuration')) { $form['tasklist'] = array( '#type' => 'fieldset', '#title' => t('Related tasks'), '#collapsible' => TRUE, '#collapsed' => FALSE, '#prefix' => '
', ); $form['tasklist']['list'] = array( '#value' => '
'. t('1. Add a category
2. View categories
3. Configure the module
4. Set permissions
5. Send mass e-mail
6. Help') .'
"; $node_message[] = "
"; } // Add in the actual message. $message[] = wordwrap($form_values['message']); $node_message[] = wordwrap($form_values['message']); // Add a spacer for HTML formatted messages. if ($form_values['html'] == 1) { $message[] = "
"; $node_message[] = "
"; } // End with the message suffix. if (module_exists('token')) { $message[] = token_replace(variable_get('mass_contact_message_suffix', '')); $node_message[] = token_replace(variable_get('mass_contact_message_suffix', '')); } else { $message[] = variable_get('mass_contact_message_suffix', ''); $node_message[] = variable_get('mass_contact_message_suffix', ''); } // Add attachment. if ($_FILES['files']['size']['attachment'] > 0) { if (module_exists('mimemail') && variable_get('mimemail_alter', 0) == 1) { $message_attachment = array( array( 'filepath' => $_FILES['files']['tmp_name']['attachment'], 'filename' => $_FILES['files']['name']['attachment'], 'filemime' => $_FILES['files']['type']['attachment'], ) ); } else { $message_attachment = '--'. $uid ."\n"; $message_attachment .= 'Content-Type: '. $_FILES['files']['type']['attachment'] .'; name="'. basename($_FILES['files']['name']['attachment']) ."\"\n"; $message_attachment .= "Content-Transfer-Encoding: base64\n"; $message_attachment .= 'Content-Disposition: attachment; filename="'. basename($_FILES['files']['name']['attachment']) ."\"\n\n"; $message_attachment .= chunk_split(base64_encode(file_get_contents($_FILES['files']['tmp_name']['attachment']))); $message_attachment .= "\n\n--". $uid ."--\n\n"; $message[] = $message_attachment; } } /////////////////////////////////////////////////////////////////////////// // // @TODO: The whole rest of this function needs to be re-thought out and // refactored, possibly separating some of it out into other // functions. // /////////////////////////////////////////////////////////////////////////// /* Task order: Get the list of categories Create the list of recipients Compose the e-mail message, starting w/the header */ // Load the category information. foreach ($form_values['cid'] as $cid) { $cids .= $cid; if (next($form_values['cid'])) { $cids .= ", "; } } $result = db_query("SELECT * FROM {mass_contact} WHERE cid IN (%s)", $cids); while ($contact = db_fetch_object($result)) { // Format the subject line. if (variable_get('mass_contact_category_override', 1)) { $subject = t('[!category] !subject', array('!category' => $contact->category, '!subject' => $form_values['subject'])); } else { $subject = $form_values['subject']; } // Prepare the body. $body = implode("\n\n", $message); $node_body = implode("\n\n", $node_message); // Check for opt-out unless overridden by admin. if (variable_get('mass_contact_optout_d', 0) == 1) { $allow_oo = $form_values['optout']; if ($allow_oo == 1) { $ooresult = db_query('SELECT uid FROM {users} WHERE status != 0'); while ($oouid = db_fetch_object($ooresult)) { $account = user_load(array('uid' => $oouid->uid, 'status' => 1)); if ($account->mass_contact_optout) { $uidoo = $oouid->uid; $uidooa[$uidoo] = 1; } } } } // Create the recipient list. $recipientouta = array(); $roles = explode(',', $contact->recipients); foreach ($roles as $r) { if ($r == 2) { // all users $recipients = db_query("SELECT name, mail, uid FROM {users} WHERE status != 0 AND uid > 0"); while ($obj = db_fetch_object($recipients)) { $rname = $obj->name; $rmail = $obj->mail; $ruid = $obj->uid; if ($rname != $user->name && !$uidooa[$ruid]) { $recipientouta[$rname] = $rmail; } } break; } else { // Get from users_roles, then role -> user. $uids = db_query("SELECT ur.uid FROM {users_roles} ur LEFT JOIN {users} u ON ur.uid=u.uid WHERE ur.rid = %d AND u.status != 0", $r); while ($obj = db_fetch_object($uids)) { $ruid = $obj->uid; $userobj = db_fetch_object(db_query("SELECT name, mail FROM {users} WHERE uid = %d", $ruid)); $rname = $userobj->name; $rmail = $userobj->mail; if ($rname != $user->name && !$uidooa[$ruid]) { $recipientouta[$rname] = $rmail; } } } } // Check for empty recipient list. if (count($recipientouta) == 0) { drupal_set_message(t('There are no users in this category. Mail not sent.')); return (''); } $recipientout = array(); // Check for recipient limit and break up recipient list, if necessary. $recip_limit = variable_get('mass_contact_recipient_limit', 0); if (count($recipientouta) > $recip_limit && $recip_limit != 0) { $countrecip = 0; $ccc = 0; foreach ($recipientouta as $rnamea => $rmaila) { // $recipientout[] = $rnamea ." <". $rmaila .">"; $recipientout[] = $rmaila; // $recipient_temp[] = $rnamea ." <". $rmaila .">"; $recipient_temp[] = $rmaila; $countrecip = count($recipient_temp); if ($countrecip == $recip_limit) { $recipient_send = implode(', ', $recipient_temp); // set bcc if ($bcc == 1) { // hidden recipients $headers['Bcc'] = $recipient_send; $to = $from; } else { $to = $recipient_send; } ++$ccc; // Send the e-mail to the recipients: if (module_exists('mimemail') && variable_get('mimemail_alter', 0) == 1) { $success = mimemail($from, $to, $subject, $body, NULL, $headers, NULL, $message_attachment); } else { $success = drupal_mail('mass-contact-page-mail', $to, $subject, $body, $from, $headers); } if ($success) { drupal_set_message(t('[Success] Send #!ccc: -e-mails', array('!ccc' => $ccc, '-e-mails' => $recipient_send))); } else { ++$send_error; } // reset array $recipient_temp = array(); $countrecip = 0; } } // Send the remainder. if ($countrecip != 0) { $recipient_send = implode(', ', $recipient_temp); if ($bcc == 1) { // hidden recipients $headers['Bcc'] = $recipient_send; $to = $from; } else { $to = $recipient_send; } ++$ccc; // Send the e-mail to the recipients: if (module_exists('mimemail') && variable_get('mimemail_alter', 0) == 1) { $success = mimemail($from, $to, $subject, $body, NULL, $headers, NULL, $message_attachment); } else { $success = drupal_mail('mass-contact-page-mail', $to, $subject, $body, $from, $headers); } if ($success) { drupal_set_message(t('[Success] Send Remainder: -e-mails', array('-e-mails' => $recipient_send))); } else { ++$send_error; } } $total_recip = count($recipientout); $recipientout = implode(', ', $recipientout); } else { foreach ($recipientouta as $rnamea => $rmaila) { // $recipientout[] = $rnamea ." <". $rmaila .">"; $recipientout[] = $rmaila; } $total_recip = count($recipientout); $recipientout = implode(', ', $recipientout); // set bcc if ($bcc == 1) { // hidden recipients $headers['Bcc'] = $recipientout; $to = $from; } else { $to = $recipientout; } // Send the e-mail to the recipients. if (module_exists('mimemail') && variable_get('mimemail_alter', 0) == 1) { $success = mimemail($from, $to, $subject, $body, NULL, $headers, NULL, $message_attachment); } else { $success = drupal_mail('mass-contact-page-mail', $to, $subject, $body, $from, $headers); } if ($success) { drupal_set_message(t('[Success] Send Once: -e-mails', array('-e-mails' => $recipientout))); } else { ++$send_error; } } // Error checking & reporting and node saving. // Check for errors. if ($send_error == 0) { // If there are no errors, check to see if we need to save the message as a node. if ($nodecc == 1) { // Check to see if the node type exists. $check = db_fetch_array(db_query("SELECT * FROM {node_type} WHERE type = 'mass_contact'")); if (!$check) { // If the node type does not exist, create it. $info->type = "mass_contact"; $info->name = "Mass Contact Message"; $info->module = "node"; $info->description = "Archived copy of mass e-mails sent from this site"; $info->help = ""; $info->has_title = 1; $info->title_label = "Subject"; $info->has_body = 1; $info->body_label = "Message Body"; $info->min_word_count = 0; $info->custom = 1; $info->modified = 0; $info->locked = 0; $info->orig_type = 'mass_contact'; db_query("INSERT INTO {node_type} (type, name, module, description, help, has_title, title_label, has_body, body_label, min_word_count, custom, modified, locked, orig_type) VALUES ('%s', '%s', '%s', '%s', '%s', %d, '%s', %d, '%s', %d, %d, %d, %d, '%s')", $info->type, $info->name, $info->module, $info->description, $info->help, $info->has_title, $info->title_label, $info->has_body, $info->body_label, $info->min_word_count, $info->custom, $info->modified, $info->locked, $info->orig_type); module_invoke_all('node_type', 'insert', $info); drupal_set_message(t('Node type created.')); } if ($_FILES['files']['size']['attachment'] > 0) { $file_data = fread(fopen($_FILES['files']['tmp_name']['attachment'], 'r'), filesize($_FILES['files']['tmp_name']['attachment'])); $file_dest = variable_get('mass_contact_attachment_location', file_directory_path() .'/mass_contact_attachments'); // .'/'; file_check_directory($file_dest, FILE_CREATE_DIRECTORY); $file_path = file_save_data($file_data, $file_dest .'/'. $_FILES['files']['name']['attachment'], FILE_EXISTS_RENAME); $file_url = file_create_url($file_path); $node_body .= '
'. t('Category: ') . $category .'
'. t('Roles: ') . $rolesent .'
'. t('Recipients: ') . $recipients .'
'. $body; $node->teaser = node_teaser($node->body); $node->type = 'mass_contact'; $node->uid = $uid; $node->format = 3; $node->status = 0; $node->comment = 2; $node->promote = 0; $node->sticky = 0; node_save($node); return TRUE; } /** * Implementation of hook_nodeapi. */ function mass_contact_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) { // If this is a delete operation and the node type is mass_contact, then // check for an attachment and delete the file if one exists. if ($op == 'delete' && $node->type == 'mass_contact') { // Look for the key phrase in the node body. If it exists, then there is // an attachment that needs to be deleted. $offset1 = strpos($node->body, '