From: Lars Ingebrigtsen Date: Mon, 16 Sep 2019 21:45:34 +0000 (+0200) Subject: Try resending when getting a transient 4xx SMTP code X-Git-Tag: emacs-27.0.90~1551^2~28 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=603e70483b844201a46f13e0a9e7acf50d3fd273;p=emacs.git 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). --- diff --git a/etc/NEWS b/etc/NEWS index 12182694d1d..adb2b642ba9 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 f6fd1cd65eb..57913c1f0f0 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))