In the end I ended up doing custom Action for Rules module

function rulesemailsamecountry_rules_action_info() {
$actions = array(
'rulesemailsamecountry_action_sendemailroleandcountry' => array(
'label' => t('Send mail to all users of a role that match country node'),
'group' => t('Custom'),
'parameter' => array(
'roles' => array(
'type' => 'list<integer>',
'label' => t('Roles'),
'options list' => 'entity_metadata_user_roles',
'description' => t('Select the roles whose users should receive the mail.'),
),
'subject' => array(
'type' => 'text',
'label' => t('Subject'),
'description' => t("The mail's subject."),
),
'message' => array(
'type' => 'text',
'label' => t('Message'),
'description' => t("The mail's message body."),
),
'from' => array(
'type' => 'text',
'label' => t('From'),
'description' => t("The mail's from address. Leave it empty to use the site-wide configured address."),
'optional' => TRUE,
),
),
'base' => 'rules_action_mail_to_users_of_role_by_country',
'access callback' => 'rules_system_integration_access',
),
);
return $actions;
}
function rules_action_mail_to_users_of_role_by_country($roles, $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');
}
else {
$rids = implode(',', $roles);
$country_code = $state->get('node')->value()->field_country['und'][0]['iso2'];
// Avoid sending emails to members of two or more target role groups.
$query = "
SELECT
DISTINCT u.mail
FROM {users} u
INNER JOIN {users_roles} r ON u.uid = r.uid
INNER JOIN profile p ON p.uid = u.uid
INNER JOIN field_data_field_profile_country c ON c.entity_id = p.pid
WHERE r.rid IN ('".$rids."')
AND c.field_profile_country_iso2 = '".$country_code."'";
$result = db_query($query);
}
// Now, actually send the mails.
$params = array(
'subject' => $subject,
'message' => $message,
);
// Set a unique key for this mail.
$name = isset($element->root()->name) ? $element->root()->name : 'unnamed';
$key = 'rules_action_mail_to_users_of_role_' . $name . '_' . $element->elementId(); $languages = language_list();
$message = array('result' => TRUE);
foreach ($result as $row) {
$message = drupal_mail('rules', $key, $row->mail, language_default(), $params, $from);
// If $message['result'] is FALSE, then it's likely that email sending is
// failing at the moment, and we should just abort sending any more. If
// however, $mesage['result'] is NULL, then it's likely that a module has
// aborted sending this particular email to this particular user, and we
// should just keep on sending emails to the other users.
// For more information on the result value, see drupal_mail().
if ($message['result'] === FALSE) {
break;
}
}
if ($message['result'] !== FALSE) {
$role_names = array_intersect_key(user_roles(TRUE), array_flip($roles));
watchdog('rules', 'Successfully sent email to the role(s) %roles.', array('%roles' => implode(', ', $role_names)));
}
}