Detect additional SMTP temporary failure modes
authormark burdett <mfburdett@gmail.com>
Sat, 24 Mar 2018 22:28:41 +0000 (15:28 -0700)
committermark burdett <mfburdett@gmail.com>
Sat, 24 Mar 2018 22:28:41 +0000 (15:28 -0700)
e.g. code: 454, response: Throttling failure: Maximum sending rate exceeded.

CRM/Mailing/BAO/MailingJob.php

index 0d49819d64081e86dbc641a570675dc0f3c1a3de..b0a510655c0f715b05559ca9989fb0fd9500fe1d 100644 (file)
@@ -685,9 +685,16 @@ VALUES (%1, %2, %3, %4, %5, %6, %7)
       if (is_a($result, 'PEAR_Error') && !$mailing->sms_provider_id) {
         // CRM-9191
         $message = $result->getMessage();
+        // SMTP response code is buried in the message.
+        $code = preg_match('/ \(code: (.+), response: /', $message, $matches) ? $matches[1] : '';
         if (
           strpos($message, 'Failed to write to socket') !== FALSE ||
-          strpos($message, 'Failed to set sender') !== FALSE
+          ((
+            strpos($message, 'Failed to set sender') !== FALSE ||
+            strpos($message, 'Failed to add recipient') !== FALSE ||
+            strpos($message, 'Failed to send data') !== FALSE
+          // Register 5xx SMTP response code (permanent failure) as bounce.
+          ) && substr($code, 0, 1) !== '5')
         ) {
           // lets log this message and code
           $code = $result->getCode();