diff --git a/queue_mail.drush.inc b/queue_mail.drush.inc
index 0cf4283..8060c1e 100644
--- a/queue_mail.drush.inc
+++ b/queue_mail.drush.inc
@@ -55,9 +55,15 @@ function drush_queue_mail_send_all() {
     $end = time() + $timeout;
     $queue = _queue_mail_get_queue();
     while ((($timeout == 0) || time() < $end) && ($item = $queue->claimItem())) {
-      $function($item->data);
-      $queue->deleteItem($item);
-      $sent_mails_count++;
+      try {
+        $function($item->data);
+        $queue->deleteItem($item);
+        $sent_mails_count++;
+      } catch (Exception $e) {
+        // In case of exception log it and leave the item in the queue
+        // to be processed again later.
+        watchdog_exception('mail_drush', $e);
+      }
     }
   }
   // Restore the user.
diff --git a/queue_mail.module b/queue_mail.module
index ccf2e1e..83fe045 100644
--- a/queue_mail.module
+++ b/queue_mail.module
@@ -111,9 +111,10 @@ function queue_mail_send($message = array()) {
   // Sending was originally requested and was not canceled.
   else {
     $message['result'] = $system->mail($message);
-    // Log errors.
+    // Log errors and throw exception so that item remains in queue.
     if (!$message['result']) {
       watchdog('mail', 'Error sending e-mail (from %from to %to).', array('%from' => $message['from'], '%to' => $message['to']), WATCHDOG_ERROR);
+      throw new Exception('Could not send queued email. Will retry later.');
     }
   }
 
