Index: simplenews.module
===================================================================
RCS file: /cvs/drupal/contributions/modules/simplenews/simplenews.module,v
retrieving revision 1.172
diff -u -r1.172 simplenews.module
--- simplenews.module   11 Dec 2008 09:53:32 -0000   1.172
+++ simplenews.module   17 Dec 2008 20:03:15 -0000
@@ -1008,7 +1008,7 @@
     db_query("INSERT INTO {simplenews_snid_tid} (snid, tid) VALUES (%d, %d)", $subscription->snid, $tid);
 
     // Execute simplenews subscribe trigger.
-    simplenews_call_actions('subscribe', $subscription);
+    simplenews_call_actions('subscribe', $subscription, $tid);
   }
   return TRUE;
 }
@@ -1057,7 +1057,7 @@
     }
 
     // Execute simplenews unsubscribe trigger
-    simplenews_call_actions('unsubscribe', $subscription);
+    simplenews_call_actions('unsubscribe', $subscription, $tid);
     }
 
   return TRUE;
@@ -1663,6 +1663,41 @@
         $message['body'] = _simplenews_subscription_confirmation_text('unsubscribe_unsubscribed', $context['account']->language, $variables);
       }
       break;
+    case 'action_send_email':
+      $account = $context['account'];
+      $newsletter = $params['newsletter'];
+      // Use formatted from address "name" <mail_address>
+      $message['headers']['From'] = $params['from']['formatted'];
+
+      $user = user_load($account->uid);
+
+      //Anonymous users need a name
+      if (!$user->uid) {
+        $user->name = t('Anonymous User');
+      }
+
+      $variables = array(
+        '%site_name'  => variable_get('site_name', 'Drupal'),
+        '%username'   => $user->name,
+        '%user_page'  => url('user/' . $user->uid, array('absolute' => TRUE)),
+        '%email'      => $user->mail,
+        '%newsletter' => $newsletter->name,
+        '%status'     => $_POST['op'],
+        '%to_from'    => ($_POST['op'] == 'Subscribe') ? 'to' : 'from',
+      );
+
+
+        //$message['body'] = t('@username (@email) just unsubscribed from @newsletter', array('@username' => $user->name, '@email' => $account->mail, '@newsletter' => $newsletter->name));
+        //$message['subject'] = t('[@newsletter] unsubscription', array('@newsletter' => $newsletter->name));
+
+      //Build the message
+      $message['subject'] = strtr($params['subject'], $variables);
+      $message['body'] = strtr($params['message'], $variables);
+
+      if ($user->uid && $params['user_link']) {
+        $message['body'] .= "\n\n" . t("Access the account page for this user at the following URL: !url", array('!url' => url('user/' . $user->uid, array('absolute' => TRUE))));
+      }
+
+      break;
   }
 
   // Debug message to check for outgoing emails messages.
@@ -1929,7 +1964,7 @@
 /**
  * Call simplenews actions.
  */
-function simplenews_call_actions($op, $subscription) {
+function simplenews_call_actions($op, $subscription, $tid) {
   // Only call actions when the simplenews_action module is enabled.
   if (!module_exists('simplenews_action')) {
     return;
@@ -1939,6 +1974,7 @@
     'hook' => 'simplenews',
     'op' => $op,
     'account' => $subscription,
+    'tid' => $tid,
   );
   foreach ($aids as $aid => $action_info) {
     actions_do($aid, $subscription, $context);

Index: simplenews_action/simplenews_action.module
===================================================================
RCS file: /cvs/drupal/contributions/modules/simplenews/simplenews_action/simplenews_action.module,v
retrieving revision 1.4
diff -u -r1.4 simplenews_action.module
--- simplenews_action.module   4 Aug 2008 06:10:21 -0000   1.4
+++ simplenews_action.module   17 Dec 2008 20:07:27 -0000
@@ -47,6 +47,14 @@
         'user' => array('update', 'delete'),
       ),
     ),
+    'simplenews_send_email_action' => array(
+      'description' => t('Send email upon subscription/unsubscription'),
+      'type' => 'simplenews',
+      'configurable' => TRUE,
+      'hooks' => array(
+        'simplenews' => array('subscribe', 'unsubscribe'),
+      ),
+    ),
   );
 }
 
@@ -296,6 +304,139 @@
 }
 
 /**
+ * A configurable Drupal action. Send an email when someone subscribes or unsubscribes from a newsletter.
+ *
+ *   Available context:
+ *    $context['recipient']     email recipient
+ *    $context['tid']           current newsletter tid
+ *
+ *   @see simplenews_send_email_action_form()
+ *   @see simplenews_send_email_action_submit()
+ */
+function simplenews_send_email_action($object, $context) {
+  if (in_array($context['tid'], $context['newsletter'])) {
+    $params = array(
+      'from' => _simplenews_set_from(),
+      'newsletter' => taxonomy_get_term($context['tid']),
+      'subject' => $context['subject'],
+      'message' => $context['message'],
+      'context' => array('account' => $object),
+      'user_link' => $context['user_link'],
+    );
+
+    //Get recipient email address from username
+    if (!valid_email_address($context['recipient'])) {
+      $user = user_load( array('name' => $context['recipient']));
+      $context['recipient'] = $user->mail;
+    }
+
+    drupal_mail('simplenews', 'action_send_email', $context['recipient'], $object->language, $params, $params['from']['address']);
+  }
+}
+
+/**
+ * Implementation of a configurable Drupal action.
+ */
+function simplenews_send_email_action_form($context) {
+  // Set default values for form.
+  if (!isset($context['recipient'])) {
+    $context['recipient'] = '';
+  }
+
+  $form['recipient'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Recipient'),
+    '#default_value' => $context['recipient'],
+    '#maxlength' => '254',
+    '#autocomplete_path' => 'user/autocomplete',
+    '#description' => t('The email address to which the message should be sent.'),
+  );
+
+  if (!isset($context['newsletter'])) {
+    $context['newsletter'] = array();
+  }
+ 
+  $tree = taxonomy_get_tree(variable_get('simplenews_vid', ''));
+  $terms = array();
+  foreach ($tree as $newsletter) {
+    $terms[$newsletter->tid] = check_plain($newsletter->name);
+  }
+  $form['newsletter'] = array(
+    '#title' => t('Newsletter'),
+    '#type' => 'select',
+    '#default_value' => $context['newsletter'],
+    '#multiple' => TRUE,
+    '#options' => $terms,
+    '#description' => t('The newsletter series (select as many as you like) of which the recipient will be alerted of subscriptions or unsubscriptions.'),
+    '#required' => TRUE,
+  );
+
+  $form['message_settings'] = array(
+    '#type'  => 'fieldset',
+    '#title' => t('Message Settings'),
+    '#collapsible' => TRUE,
+    '#collapsed' => TRUE,
+  );
+  $form['message_settings']['subject'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Subject'),
+    '#default_value' => $context['subject'],
+    '#maxlength' => '254',
+    '#description' => t('You may include the following variables: %site_name, %username, %user_page, %email, %newsletter, %status (\'Subscribe\' or \'Unsubscribe\'), %to_from (\'to\' or \'from\').'),
+  );
+  $form['message_settings']['message'] = array(
+    '#type' => 'textarea',
+    '#title' => t('Message'),
+    '#default_value' => $context['message'],
+    '#description' => t('The message that should be sent when a user subscribes to a newsletter. You may include the following variables: %site_name, %username, %user_page, %email, %newsletter, %status (\'Subscribe\' or \'Unsubscribe\'), %to_from (\'to\' or \'from\').'),
+  );
+  $form['message_settings']['user_link'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Account Page Link'),
+    '#default_value' => $context['user_link'],
+    '#description' => t('Include a link to this user\'s account page if they are registered at this site'),
+  );
+
+  return $form;
+}
+
+/**
+ * Process simplenews_send_email_action form submissions.
+ */
+function simplenews_send_email_action_submit($form, $form_state) {
+  $form_values = $form_state['values'];
+
+  $params = array(
+    'recipient'  => $form_values['recipient'],
+    'newsletter' => $form_values['newsletter'],
+    'subject'    => $form_values['subject'],
+    'message'    => $form_values['message'],
+    'user_link'  => $form_values['user_link'],
+  );
+  return $params;
+}
+
+
+/**
+ * Validate simplenews_send_email_action form submissions.
+ */
+function simplenews_send_email_action_validate($form, $form_state) {
+  $form_values = $form_state['values'];
+
+  //Get recipient email address from username
+  if (!valid_email_address($form_values['recipient'])) {
+    $user = user_load( array('name' => $form_values['recipient']));
+    $form_values['recipient'] = $user->mail;
+  }
+
+  // Validate the configuration form.
+  if (!valid_email_address($form_values['recipient'])) {
+    form_set_error('recipient', t('Please enter a valid email address or username.'));
+  }
+}
+
+
+/**
  * Implementation of hook_hook_info().
  */
 function simplenews_hook_info() {