Index: simplenews.admin.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/simplenews/simplenews.admin.inc,v
retrieving revision 1.17
diff -u -p -0 -r1.17 simplenews.admin.inc
--- simplenews.admin.inc	21 Jun 2008 07:28:45 -0000	1.17
+++ simplenews.admin.inc	29 Jun 2008 16:20:51 -0000
@@ -378 +378 @@ function simplenews_subscription_multipl
- * Menu callback: Add newsletter series.
+ * Menu callback: Mass subscribe to newsletters.
@@ -389 +389 @@ function simplenews_subscription_list_ad
-    '#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.'),
@@ -397 +397 @@ function simplenews_subscription_list_ad
-    '#title' => t('Subscribe imported addresses to the following newsletter(s)'),
+    '#title' => t('Subscribe the addresses to the following newsletter(s)'),
@@ -406 +406 @@ function simplenews_subscription_list_ad
-    '#value' => t('Import'),
+    '#value' => t('Subscribe'),
@@ -493,7 +493,3 @@ 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();
@@ -533,0 +530 @@ function simplenews_admin_export_after_b
+
@@ -540 +537,28 @@ function simplenews_admin_export_after_b
-    $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;
@@ -541,0 +566,13 @@ function simplenews_admin_export_after_b
+  $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'),
+  );
@@ -544,0 +582,47 @@ function simplenews_admin_export_after_b
+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');
+  }
+}
+
Index: simplenews.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/simplenews/simplenews.module,v
retrieving revision 1.109
diff -u -p -0 -r1.109 simplenews.module
--- simplenews.module	21 Jun 2008 07:28:45 -0000	1.109
+++ simplenews.module	29 Jun 2008 16:20:54 -0000
@@ -201 +201 @@ function simplenews_menu() {
-    'title' => 'List subscriptions',
+    'title' => 'List',
@@ -206 +206 @@ function simplenews_menu() {
-    'title' => 'Import subscriptions',
+    'title' => 'Mass subscribe',
@@ -213,0 +214,9 @@ function simplenews_menu() {
+  $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,
+  );
@@ -215 +224 @@ function simplenews_menu() {
-    'title' => 'Export subscriptions',
+    'title' => 'Export',
@@ -221 +230 @@ function simplenews_menu() {
-    'weight' => -8,
+    'weight' => -7,
