Index: /Users/erik/ste/sn6/sites/all/modules/simplenews/simplenews.admin.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/simplenews/simplenews.admin.inc,v
retrieving revision 1.17
diff -u -p -r1.17 simplenews.admin.inc
--- simplenews.admin.inc	21 Jun 2008 07:28:45 -0000	1.17
+++ simplenews.admin.inc	29 Jun 2008 16:03:51 -0000
@@ -375,7 +375,7 @@ function simplenews_subscription_multipl
 }
 
 /**
- * Menu callback: Add newsletter series.
+ * Menu callback: Mass subscribe to newsletters.
  *
  * @see simplenews_subscription_list_add_validate()
  * @see simplenews_subscription_list_add_submit()
@@ -386,7 +386,7 @@ function simplenews_subscription_list_ad
     '#title' => t('E-mail addresses'),
     '#cols' => 60,
     '#rows' => 5,
-    '#description' => t('Supply a comma separated list of e-mail addresses to be added to the list. Spaces between commas and addresses are allowed.'),
+    '#description' => t('Supply a comma separated list of email addresses to be subscribed.'),
   );
   $newsletters = array();
   foreach (taxonomy_get_tree(variable_get('simplenews_vid', '')) as $newsletter) {
@@ -394,7 +394,7 @@ function simplenews_subscription_list_ad
   }
   $form['newsletters'] = array(
     '#type' => 'fieldset',
-    '#title' => t('Subscribe imported addresses to the following newsletter(s)'),
+    '#title' => t('Subscribe the addresses to the following newsletter(s)'),
     '#collapsible' => FALSE,
   );
   $form['newsletters']['newsletters'] = array(
@@ -403,7 +403,7 @@ function simplenews_subscription_list_ad
   );
   $form['submit'] = array(
     '#type' => 'submit',
-    '#value' => t('Import'),
+    '#value' => t('Subscribe'),
   );
   return $form;
 }
@@ -490,13 +490,9 @@ function simplenews_subscription_list_ex
       );
     }
   }
-  $form['emails'] = array(
-    '#type' => 'textarea',
-    '#title' => t('E-mail addresses'),
-    '#cols' => 60,
-    '#rows' => 5,
-    '#default_value' => t('No search performed'),
-  );
+  // Emails item is initially empty. It serves as place holder. Data is added by
+  // simplenews_admin_export_after_build(). 
+  $form['emails'] = array();
   $form['submit'] = array(
     '#type' => 'submit',
     '#value' => t('Export'),
@@ -531,17 +527,105 @@ function simplenews_admin_export_after_b
         $mails[] = $mail->mail;
       }
     }
+
     if (isset($mails)) {
       $exported_mails = implode(", ", $mails);
     }
     else {
       $exported_mails = t('No addresses were found.');
     }
-    $form['emails']['#value'] = $exported_mails;
+    $form['emails'] = array(
+      '#type' => 'textarea',
+      '#title' => t('Export results'),
+      '#cols' => 60,
+      '#rows' => 5,
+      '#value' => $exported_mails,
+    );
+  }
+  return $form;
+}
+
+/**
+ * Menu callback: Mass subscribe to newsletters.
+ *
+ * @see simplenews_subscription_list_remove_validate()
+ * @see simplenews_subscription_list_remove_submit()
+ */
+function simplenews_subscription_list_remove() {
+  $form['emails'] = array(
+    '#type' => 'textarea',
+    '#title' => t('E-mail addresses'),
+    '#cols' => 60,
+    '#rows' => 5,
+    '#description' => t('Supply a comma separated list of email addresses to be unsubscribed. Email addresses which are no longer subscribed to any newsletter, will be removed from the database.'),
+  );
+  $newsletters = array();
+  foreach (taxonomy_get_tree(variable_get('simplenews_vid', '')) as $newsletter) {
+    $newsletters[$newsletter->tid] = $newsletter->name;
   }
+  $form['newsletters'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Unsubscribe the addresses from the following newsletter(s)'),
+    '#collapsible' => FALSE,
+  );
+  $form['newsletters']['newsletters'] = array(
+    '#type' => 'checkboxes',
+    '#options' => $newsletters,
+  );
+  $form['submit'] = array(
+    '#type' => 'submit',
+    '#value' => t('Unsubscribe'),
+  );
   return $form;
 }
 
+function simplenews_subscription_list_remove_validate($form, &$form_state) {
+  $checked_newsletters = array_filter($form_state['values']['newsletters']);
+  if (!$checked_newsletters) {
+    form_set_error('newsletters', t('You must select at least one newsletter.'));
+  }
+}
+
+function simplenews_subscription_list_remove_submit($form, &$form_state) {
+  $tree = taxonomy_get_tree(variable_get('simplenews_vid', ''));
+  $removed = array();
+  $invalid = array();
+  $checked_newsletters = array_filter($form_state['values']['newsletters']);
+
+  $emails = explode(",", $form_state['values']['emails']);
+  foreach ($emails as $email) {
+    $email = trim($email);
+    if (valid_email_address($email)) {
+      foreach ($checked_newsletters as $tid) {
+        $newsletter = taxonomy_get_term($tid);
+        simplenews_unsubscribe_user($email, $newsletter->tid, FALSE);
+        $removed[] = $email;
+      }
+    }
+    else {
+      $invalid[] = $email;
+    }
+  }
+  if ($removed) {
+    $removed = implode(", ", $removed);
+    drupal_set_message(t('The following addresses were unsubscribed or removed: %removed.', array('%removed' => $removed)));
+
+    $newsletter_names = array();
+    foreach ($checked_newsletters as $tid) {
+      $newsletter = taxonomy_get_term($tid);
+      $newsletter_names[] = $newsletter->name;
+    }
+    drupal_set_message(t('The addresses were unsubscribed from the following newsletters: %newsletters.', array('%newsletters' => implode(', ', $newsletter_names))));
+  }
+  else {
+    drupal_set_message(t('No addresses were removed.'));
+  }
+  if ($invalid) {
+    $invalid = implode(", ", $invalid);
+    drupal_set_message(t('The following addresses were invalid: %invalid.', array('%invalid' => $invalid)), 'error');
+  }
+}
+
 /**
  * Menu callback: subscription administration.
  */
Index: /Users/erik/ste/sn6/sites/all/modules/simplenews/simplenews.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/simplenews/simplenews.module,v
retrieving revision 1.109
diff -u -p -r1.109 simplenews.module
--- simplenews.module	21 Jun 2008 07:28:45 -0000	1.109
+++ simplenews.module	29 Jun 2008 16:03:54 -0000
@@ -198,12 +198,12 @@ function simplenews_menu() {
     'file' => 'simplenews.subscription.inc',
     );
   $items['admin/content/newsletters/users/list'] = array(
-    'title' => 'List subscriptions',
+    'title' => 'List',
     'type' => MENU_DEFAULT_LOCAL_TASK,
     'weight' => -10,
   );
   $items['admin/content/newsletters/users/import'] = array(
-    'title' => 'Import subscriptions',
+    'title' => 'Mass subscribe',
     'type' => MENU_LOCAL_TASK,
     'page callback' => 'drupal_get_form',
     'page arguments' => array('simplenews_subscription_list_add'),
@@ -211,14 +211,23 @@ function simplenews_menu() {
     'file' => 'simplenews.admin.inc',
     'weight' => -9,
   );
+  $items['admin/content/newsletters/users/unsubscribe'] = array(
+    'title' => 'Mass unsubscribe',
+    'type' => MENU_LOCAL_TASK,
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('simplenews_subscription_list_remove'),
+    'access arguments' => array('administer newsletters'),
+    'file' => 'simplenews.admin.inc',
+    'weight' => -8,
+  );
   $items['admin/content/newsletters/users/export'] = array(
-    'title' => 'Export subscriptions',
+    'title' => 'Export',
     'type' => MENU_LOCAL_TASK,
     'page callback' => 'drupal_get_form',
     'page arguments' => array('simplenews_subscription_list_export'),
     'access arguments' => array('administer newsletters'),
     'file' => 'simplenews.admin.inc',
-    'weight' => -8,
+    'weight' => -7,
   );
 
   $items['admin/content/newsletters/settings'] = array(
@@ -810,6 +819,9 @@ function simplenews_subscribe_user($mail
   elseif (!isset($subscription->tids[$tid])) {
     // OR add user to newsletter relationship if not already subscribed.
     db_query("INSERT INTO {simplenews_snid_tid} (snid, tid) VALUES (%d, %d)", $subscription->snid, $tid);
+
+    // Execute simplenews subscribe trigger.
+    simplenews_call_actions('subscribe', $subscription);
   }
   return TRUE;
 }
@@ -856,7 +868,10 @@ function simplenews_unsubscribe_user($ma
     if (!db_result(db_query("SELECT COUNT(*) FROM {simplenews_snid_tid} t WHERE t.snid = %d", $subscription->snid))) {
       db_query('DELETE FROM {simplenews_subscriptions} WHERE snid = %d', $subscription->snid);
     }
-  }
+
+    // Execute simplenews unsubscribe trigger
+    simplenews_call_actions('unsubscribe', $subscription);
+    }
 
   return TRUE;
 }
@@ -1523,6 +1538,27 @@ function simplenews_clear_spool() {
 }
 
 /**
+ * Call simplenews actions
+ *
+ * @see simplenews_hook_info()
+ */
+function simplenews_call_actions($op, $subscription) {
+  // Only call actions when the simplenews_action module is enabled.
+  if (!module_exists('simplenews_action')) {
+    return;
+  }
+  $aids = _trigger_get_hook_aids('simplenews', $op);
+  $context = array(
+    'hook' => 'simplenews',
+    'op' => $op,
+    'account' => $subscription,
+  );
+  foreach ($aids as $aid => $action_info) {
+    actions_do($aid, $subscription, $context);
+  }
+}
+
+/**
  * Build formatted from-name and e-mail for a mail object.
  *
  * Each newsletter (serie; tid) can have a different from address.
