emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] master 603e704: Try resending when getting a transient 4xx


From: Lars Ingebrigtsen
Subject: [Emacs-diffs] master 603e704: Try resending when getting a transient 4xx SMTP code
Date: Mon, 16 Sep 2019 17:49:35 -0400 (EDT)

branch: master
commit 603e70483b844201a46f13e0a9e7acf50d3fd273
Author: Lars Ingebrigtsen <address@hidden>
Commit: Lars Ingebrigtsen <address@hidden>

    Try resending when getting a transient 4xx SMTP code
    
    * lisp/mail/smtpmail.el (smtpmail-via-smtp): Try resending when
    getting a transient error message (bug#34177).
---
 etc/NEWS              |  4 ++++
 lisp/mail/smtpmail.el | 21 ++++++++++++++++++++-
 2 files changed, 24 insertions(+), 1 deletion(-)

diff --git a/etc/NEWS b/etc/NEWS
index 1218269..adb2b64 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -1162,6 +1162,10 @@ defining new 'cl-defmethod' of 
'smtpmail-try-auth-method'.
 attempt when communicating with the SMTP server(s), the
 'smtpmail-servers-requiring-authorization' variable can be used.
 
+---
+*** smtpmail will now try resending mail when getting a transient 4xx
+error message from the SMTP server.
+
 ** Footnote mode
 
 *** Support Hebrew-style footnotes
diff --git a/lisp/mail/smtpmail.el b/lisp/mail/smtpmail.el
index f6fd1cd..57913c1 100644
--- a/lisp/mail/smtpmail.el
+++ b/lisp/mail/smtpmail.el
@@ -654,10 +654,12 @@ Returns an error if the server cannot be contacted."
              user-mail-address))))
 
 (defun smtpmail-via-smtp (recipient smtpmail-text-buffer
-                                   &optional ask-for-password)
+                                   &optional ask-for-password
+                                    send-attempts)
   (unless smtpmail-smtp-server
     (smtpmail-query-smtp-server))
   (let ((process nil)
+        (send-attempts (or send-attempts 1))
        (host (or smtpmail-smtp-server
                  (error "`smtpmail-smtp-server' not defined")))
        (port smtpmail-smtp-service)
@@ -819,6 +821,23 @@ Returns an error if the server cannot be contacted."
               ((smtpmail-ok-p (setq result (smtpmail-read-response process)))
                ;; Success.
                )
+               ((and (numberp (car result))
+                     (<= 400 (car result) 499)
+                     (< send-attempts 10))
+                (message "Got transient error code %s when sending; retrying 
attempt %d..."
+                         (car result) send-attempts)
+                ;; Retry on getting a transient 4xx code; see
+                ;; https://tools.ietf.org/html/rfc5321#section-4.2.1
+                (ignore-errors
+                 (smtpmail-send-command process "QUIT")
+                 (smtpmail-read-response process))
+               (delete-process process)
+                (sleep-for 1)
+               (setq process nil)
+               (throw 'done
+                      (smtpmail-via-smtp recipient smtpmail-text-buffer
+                                          ask-for-password
+                                          (1+ send-attempts))))
               ((and auth-mechanisms
                     (not ask-for-password)
                     (eq (car result) 530))



reply via email to

[Prev in Thread] Current Thread [Next in Thread]