diff --git a/includes/phpmailer.class.inc b/includes/phpmailer.class.inc
index 63fab4c..96ddadb 100644
--- a/includes/phpmailer.class.inc
+++ b/includes/phpmailer.class.inc
@@ -16,6 +16,37 @@ class DrupalPHPMailer extends PHPMailer {
   public $ReturnPath = '';
 
   /**
+   * Verbose debug output level configured for Drupal.
+   *
+   * In order to be able to log error messages with actual error information and
+   * see what actually went wrong for a particular message, PHPMailer::SMTPDebug
+   * always needs to be enabled.
+   *
+   * DrupalPHPMailer::SmtpSend() overrides PHPMailer::SmtpSend() to capture the
+   * debug output string and make it available for watchdog() calls.
+   *
+   * @see PHPMailer::SMTPDebug
+   * @see SMTP::do_debug
+   * @see DrupalPHPMailer::SmtpSend()
+   * @see DrupalPHPMailer::drupalDebugOutput
+   *
+   * @var int
+   */
+  public $drupalDebug = 0;
+
+  /**
+   * Overrides PHPMailer::SMTPDebug to capture SMTP communication errors by default.
+   */
+  public $SMTPDebug = 2;
+
+  /**
+   * Stores the verbose debug output of the SMTP communication.
+   *
+   * @var string
+   */
+  public $drupalDebugOutput = '';
+
+  /**
    * Constructor.
    */
   public function __construct() {
@@ -40,7 +71,7 @@ class DrupalPHPMailer extends PHPMailer {
     $this->SMTPAuth = (bool)($this->Username != '' && $this->Password != '');
 
     $this->SMTPKeepAlive = variable_get('smtp_keepalive', 0);
-    $this->SMTPDebug = variable_get('smtp_debug', 0);
+    $this->drupalDebug = variable_get('smtp_debug', 0);
 
     // Adjust path to SMTP class.
     $this->PluginDir = './'. phpmailer_get_path() .'/';
@@ -53,6 +84,8 @@ class DrupalPHPMailer extends PHPMailer {
    */
   public function SmtpSend($header, $body) {
     if ($this->SMTPDebug) {
+      // Clear possibly previously captured debug output.
+      $this->drupalDebugOutput = '';
       ob_start();
     }
 
@@ -67,7 +100,8 @@ class DrupalPHPMailer extends PHPMailer {
     catch (phpmailerException $exception) {}
 
     if ($this->SMTPDebug) {
-      if ($debug = ob_get_contents()) {
+      $this->drupalDebugOutput = ob_get_contents();
+      if ($this->drupalDebug && $this->drupalDebugOutput) {
         drupal_set_message($debug);
       }
       ob_end_clean();
diff --git a/includes/phpmailer.drupal.inc b/includes/phpmailer.drupal.inc
index 0b91d5b..19c8913 100644
--- a/includes/phpmailer.drupal.inc
+++ b/includes/phpmailer.drupal.inc
@@ -118,8 +118,26 @@ function phpmailer_send($message) {
     return $mail->Send();
   }
   catch (phpmailerException $e) {
-    drupal_set_message(t('Sending of at least one e-mail failed. The error returned was:<br />@error.', array('@error' => $e->getMessage())), 'error');
-    watchdog('phpmailer', $e->getMessage(), NULL, WATCHDOG_ERROR);
+    // Log the error including verbose debug information.
+    // Message is a safe t() string from DrupalPHPMailer::SetLanguage().
+    $output = $e->getMessage();
+    $arguments = array();
+    // Append SMTP communication output.
+    if ($mail->drupalDebugOutput) {
+      // PHPMailer debug output contains HTML linebreaks. PRE is more readable.
+      $mail->drupalDebugOutput = str_replace('<br />', '', $mail->drupalDebugOutput);
+      $output .= "\n<p>Server response:</p>";
+      $output .= "\n<pre>@smtp_output</pre>";
+      $arguments += array(
+        '@smtp_output' => $mail->drupalDebugOutput,
+      );
+    }
+    $output .= "\n<p>Message:</p>";
+    $output .= "\n<pre>@message</pre>";
+    $arguments += array(
+      '@message' => var_export($message, TRUE),
+    );
+    watchdog('phpmailer', $output, $arguments, WATCHDOG_ERROR);
     return FALSE;
   }
 }
diff --git a/phpmailer.admin.inc b/phpmailer.admin.inc
index 9a53332..2611a8f 100644
--- a/phpmailer.admin.inc
+++ b/phpmailer.admin.inc
@@ -149,14 +149,7 @@ function phpmailer_settings_form($form_state) {
       // is enabled, so drupal_mail_send() cannot be used.
       // @see drupal_mail_send()
       module_load_include('inc', 'phpmailer', 'includes/phpmailer.drupal');
-      $message['result'] = phpmailer_send($message);
-
-      // Log errors
-      // @see drupal_mail()
-      if (!$message['result']) {
-        watchdog('mail', 'Error sending e-mail (from %from to %to).', array('%from' => $message['from'], '%to' => $message['to']), WATCHDOG_ERROR);
-        drupal_set_message(t('Unable to send e-mail. Please contact the site administrator if the problem persists.'), 'error');
-      }
+      phpmailer_send($message);
     }
     drupal_set_message(t('A test e-mail has been sent to %email. <a href="@watchdog-url">Check the logs</a> for any error messages.', array(
       '%email' => $test_address,
