diff -ur rules.orig/modules/system.eval.inc rules/modules/system.eval.inc
--- rules.orig/modules/system.eval.inc	2011-10-11 02:24:11.000000000 -0700
+++ rules/modules/system.eval.inc	2012-01-03 09:20:21.000000000 -0800
@@ -95,17 +95,26 @@
 /**
  * Action: Send mail to all users of a specific role group(s).
  */
-function rules_action_mail_to_users_of_role($roles, $subject, $message, $from = NULL, $settings, RulesState $state, RulesPlugin $element) {
+function rules_action_mail_to_users_of_role($roles, $intersect, $subject, $message, $from = NULL, $settings, RulesState $state, RulesPlugin $element) {
   $from = !empty($from) ? str_replace(array("\r", "\n"), '', $from) : NULL;
 
-  // All authenticated users, which is everybody.
-  if (in_array(DRUPAL_AUTHENTICATED_RID, $roles)) {
-    $result = db_query('SELECT mail FROM {users} WHERE uid > 0');
+  if($intersect) {
+    $query = 'SELECT DISTINCT u.mail FROM {users} u WHERE u.uid IN ( select uid from {users_roles} where rid = ';
+    $query .= implode(' intersect select uid from {users_roles} where rid = ', $roles);
+    $query .= ')';
+    
+    $result = db_query($query);
   }
   else {
-    $rids = implode(',', $roles);
-    // Avoid sending emails to members of two or more target role groups.
-    $result = db_query('SELECT DISTINCT u.mail FROM {users} u INNER JOIN {users_roles} r ON u.uid = r.uid WHERE r.rid IN ('. $rids .')');
+    // All authenticated users, which is everybody.
+    if (in_array(DRUPAL_AUTHENTICATED_RID, $roles)) {
+      $result = db_query('SELECT mail FROM {users} WHERE uid > 0');
+    }
+    else {
+      $rids = implode(',', $roles);
+      // Avoid sending emails to members of two or more target role groups.
+      $result = db_query('SELECT DISTINCT u.mail FROM {users} u INNER JOIN {users_roles} r ON u.uid = r.uid WHERE r.rid IN ('. $rids .')');
+    }
   }
 
   // Now, actually send the mails.
diff -ur rules.orig/modules/system.rules.inc rules/modules/system.rules.inc
--- rules.orig/modules/system.rules.inc	2011-10-11 02:24:11.000000000 -0700
+++ rules/modules/system.rules.inc	2012-01-03 08:41:35.000000000 -0800
@@ -210,6 +210,12 @@
           'options list' => 'entity_metadata_user_roles',
           'description' => t('Select the roles whose users should receive the mail.'),
         ),
+        'intersect' => array(
+          'type' => 'boolean',
+          'label' => t('Intersection of all groups'),
+          'description' => t('If this is selected, then the mail will be sent only to users who are in ALL selected groups instead of users in ANY of the selected groups.'),
+          'optional' => TRUE,
+        ),
         'subject' => array(
           'type' => 'text',
           'label' => t('Subject'),
