diff --git a/includes/simplenews.admin.inc b/includes/simplenews.admin.inc
index 394abaf..54b8287 100644
--- a/includes/simplenews.admin.inc
+++ b/includes/simplenews.admin.inc
@@ -257,8 +257,8 @@ function simplenews_admin_issues_submit($form, &$form_state) {
  * Callback to send newsletters.
  */
 function simplenews_issue_send($nids) {
+  $sent_titles = array();
   foreach (node_load_multiple($nids) as $node) {
-
     $newsletter = simplenews_newsletter_load($node->nid);
     if ($newsletter->status != SIMPLENEWS_STATUS_SEND_NOT) {
       continue;
@@ -266,16 +266,23 @@ function simplenews_issue_send($nids) {
 
     if ($node->status == NODE_NOT_PUBLISHED) {
       simplenews_newsletter_update_sent_status($node, SIMPLENEWS_COMMAND_SEND_PUBLISH);
-      drupal_set_message(t('Newsletter %title is unpublished and will be sent on publish', array('%title' => $node->title)));
+      drupal_set_message(t('Newsletter %title is unpublished and will be sent on publish.', array('%title' => $node->title)));
       continue;
     }
 
-    $status = simplenews_add_node_to_spool($node);
-    if ($status == SIMPLENEWS_STATUS_SEND_READY) {
-      drupal_set_message(t('Newsletter %title sent.', array('%title' => $node->title)));
+    simplenews_add_node_to_spool($node, FALSE);
+    $sent_titles[] = $node->title;
+  }
+
+  // If there were any newsletters sent, display a message.
+  if (!empty($sent_titles)) {
+    if (!variable_get('simplenews_use_cron', TRUE)) {
+      // If mails are supposed to be sent immediatly, set up a batch.
+      simplenews_mail_spool_batch();
+      drupal_set_message(t('Sent the following newsletters: %titles.', array('%titles' => implode(', ', $sent_titles))));
     }
     else {
-      drupal_set_message(t('Newsletter %title pending.', array('%title' => $node->title)));
+      drupal_set_message(t('The following newsletter are now pending: %titles.', array('%titles' => implode(', ', $sent_titles))));
     }
   }
 }
@@ -1868,8 +1875,9 @@ function simplenews_node_tab_send_form_submit($form, &$form_state) {
   // Send newsletter to all subscribers or send test newsletter
   module_load_include('inc', 'simplenews', 'includes/simplenews.mail');
   if ($values['simplenews']['send'] == SIMPLENEWS_COMMAND_SEND_NOW) {
-    $status = simplenews_add_node_to_spool($node);
-    if ($status == SIMPLENEWS_STATUS_SEND_READY) {
+    simplenews_add_node_to_spool($node, FALSE);
+    if (!variable_get('simplenews_use_cron', TRUE)) {
+      simplenews_mail_spool_batch();
       drupal_set_message(t('Newsletter %title sent.', array('%title' => $node->title)));
     }
     else {
diff --git a/includes/simplenews.mail.inc b/includes/simplenews.mail.inc
index 27194a4..a868a60 100644
--- a/includes/simplenews.mail.inc
+++ b/includes/simplenews.mail.inc
@@ -16,9 +16,25 @@
  * @param $node
  *   The newsletter node to be sent.
  *
+ * @param $send_immediatly
+ *   (Optional) Allows to override the default send behavior. TRUE will always
+ *   process mail spool immediatly while FALSE never does, even if Simplenews
+ *   is configured to do so. That can for example be used to process the mail
+ *   spool as a batch using simplenews_mail_send_batch().
+ *
+ * @return
+ *   SIMPLENEWS_STATUS_SEND_READY if the mails have been sent or
+ *   SIMPLENEWS_STATUS_SEND_PENDING if they were just added to the spool.
+ *
  * @ingroup issue
  */
-function simplenews_add_node_to_spool($node) {
+function simplenews_add_node_to_spool($node, $send_immediatly = NULL) {
+
+  // If not explicitly TRUE or FALSE, get the default value.
+  if ($send_immediatly === NULL) {
+    $send_immediatly = !variable_get('simplenews_use_cron', TRUE);
+  }
+
   // To send the newsletter, the node id and target email addresses
   // are stored in the spool.
   // Only subscribed recipients are stored in the spool (status = 1).
@@ -44,7 +60,7 @@ function simplenews_add_node_to_spool($node) {
   // When cron is not used the newsletter is send immediately to the emails
   // in the spool. When cron is used newsletters are send to addresses in the
   // spool during the next (and following) cron run.
-  if (variable_get('simplenews_use_cron', TRUE) == FALSE) {
+  if ($send_immediatly) {
     simplenews_mail_spool();
     simplenews_clear_spool();
     simplenews_send_status_update();
@@ -56,6 +72,32 @@ function simplenews_add_node_to_spool($node) {
 }
 
 /**
+ * Set up a batch to send the mail spool.
+ */
+function simplenews_mail_spool_batch() {
+  $operations = array();
+  // Set up as many send operations as necessary to send all mails with the
+  // defined throttle amount.
+  $throttle = variable_get('simplenews_throttle', 20);
+  $spool_count = simplenews_count_spool();
+  $num_operations = ceil($spool_count / $throttle);
+  for ($i = 0; $i < $num_operations; $i++) {
+    $operations[] = array('simplenews_mail_spool', array($throttle));
+  }
+
+  // Add separate operations to clear the spool and updat the send status.
+  $operations[] = array('simplenews_clear_spool', array());
+  $operations[] = array('simplenews_send_status_update', array());
+
+  $batch = array(
+    'operations' => $operations,
+    'title' => t('Sending mails'),
+    'file' => drupal_get_path('module', 'simplenews') . '/includes/simplenews.mail.inc',
+  );
+  batch_set($batch);
+}
+
+/**
  * Send test version of newsletter.
  *
  * @param mixed $node
@@ -411,32 +453,28 @@ function simplenews_update_spool($msids, $data) {
 /**
  * Count data in mail spool table.
  *
- * @param integer $nid
+ * @param $nid
  *   Newsletter node id.
- * @param array $status
+ * @param $status
  *   Array of status flags.
  *
- * @return integer
- *   Count of mail spool elements which own the attributes passed in as params.
+ * @return
+ *   Count of mail spool elements of the passed in arguments.
  *
  * @ingroup spool
  */
-function simplenews_count_spool($nid, $status = array(SIMPLENEWS_SPOOL_PENDING, SIMPLENEWS_SPOOL_IN_PROGRESS)) {
-  $clauses = array();
-  $params = array();
-
-  if (!is_array($status)) {
-    $status = array($status);
+function simplenews_count_spool($nid = NULL, $status = array(SIMPLENEWS_SPOOL_PENDING, SIMPLENEWS_SPOOL_IN_PROGRESS)) {
+  $query = db_select('simplenews_mail_spool')
+    ->condition('status', $status);
+  if (!empty($nid)) {
+    $query->condition('nid', $nid);
   }
 
-  foreach ($status as $s) {
-    $clauses[] = "status = $s";
-  }
+  $query->addExpression('COUNT(*)', 'count');
 
-  $query = db_select('simplenews_mail_spool')
-    ->condition('nid', $nid)
-    ->where(implode(' OR ', $clauses));
-  return $query->countQuery()->execute()->fetchField();
+  return $query
+    ->execute()
+    ->fetchField();
 }
 
 /**
diff --git a/tests/simplenews.test b/tests/simplenews.test
index 6603381..4b8c1ce 100644
--- a/tests/simplenews.test
+++ b/tests/simplenews.test
@@ -1540,8 +1540,8 @@ class SimplenewsSendTestCase extends SimplenewsTestCase {
     );
     $this->drupalPost('admin/content/simplenews', $edit, t('Update'));
 
-    $this->assertText(t('Newsletter @title sent', array('@title' => $first->title)));
-    $this->assertText(t('Newsletter @title is unpublished and will be sent on publish', array('@title' => $unpublished->title)));
+    $this->assertText(t('Sent the following newsletters: @title.', array('@title' => $first->title)));
+    $this->assertText(t('Newsletter @title is unpublished and will be sent on publish.', array('@title' => $unpublished->title)));
 
     // Verify states.
     $newsletter = simplenews_newsletter_load($first->nid);
