From 6216c7abd4cefd6245d29272d899490045cfdeff Mon Sep 17 00:00:00 2001 From: Lars Ingebrigtsen Date: Fri, 26 Jul 2019 12:16:49 +0200 Subject: [PATCH] Allow specifying that SMTP auth should always be used * doc/misc/smtpmail.texi (Authentication): Document it. * lisp/mail/smtpmail.el (smtpmail-servers-requiring-authorization): New variable (bug#26359). (smtpmail-via-smtp): Use it. --- doc/misc/smtpmail.texi | 14 ++++++++--- lisp/mail/smtpmail.el | 55 +++++++++++++++++++++--------------------- 2 files changed, 39 insertions(+), 30 deletions(-) diff --git a/doc/misc/smtpmail.texi b/doc/misc/smtpmail.texi index 365f55718e7..b2fc90a337a 100644 --- a/doc/misc/smtpmail.texi +++ b/doc/misc/smtpmail.texi @@ -221,10 +221,18 @@ they are allowed to send mail. Authentication usually involves supplying a user name and password. If you have not configured anything, then the first time you try to -send mail via a server, Emacs (version 24.1 and later) prompts you +send mail via a server and the SMTP server reports back that it +requires authentication, Emacs (version 24.1 and later) prompts you for the user name and password to use, and then offers to save the -information. By default, Emacs stores authentication information in -a file @file{~/.authinfo}. +information. By default, Emacs stores authentication information in a +file @file{~/.authinfo}. + +@vindex smtpmail-servers-requiring-authorization +Some SMTP servers may bandwidth-limit (or deny) requests from clients +that try to post without authorization---even if they later do supply +that information. To make this library supply that information on +first attempt, set @code{smtpmail-servers-requiring-authorization} to +a regexp that match the server name. @cindex authinfo The basic format of the @file{~/.authinfo} file is one line for each diff --git a/lisp/mail/smtpmail.el b/lisp/mail/smtpmail.el index 741c4393e65..acd6f145e71 100644 --- a/lisp/mail/smtpmail.el +++ b/lisp/mail/smtpmail.el @@ -70,34 +70,29 @@ (defcustom smtpmail-default-smtp-server nil "Specify default SMTP server. This only has effect if you specify it before loading the smtpmail library." - :type '(choice (const nil) string) - :group 'smtpmail) + :type '(choice (const nil) string)) (defcustom smtpmail-smtp-server (or (getenv "SMTPSERVER") smtpmail-default-smtp-server) "The name of the host running SMTP server." - :type '(choice (const nil) string) - :group 'smtpmail) + :type '(choice (const nil) string)) (defcustom smtpmail-smtp-service 25 "SMTP service port number. The default value would be \"smtp\" or 25." - :type '(choice (integer :tag "Port") (string :tag "Service")) - :group 'smtpmail) + :type '(choice (integer :tag "Port") (string :tag "Service"))) (defcustom smtpmail-smtp-user nil "User name to use when looking up credentials in the authinfo file. If non-nil, only consider credentials for the specified user." :version "24.1" - :type '(choice (const nil) string) - :group 'smtpmail) + :type '(choice (const nil) string)) (defcustom smtpmail-local-domain nil "Local domain name without a host name. If the function `system-name' returns the full internet address, don't define this value." - :type '(choice (const nil) string) - :group 'smtpmail) + :type '(choice (const nil) string)) (defcustom smtpmail-stream-type nil "Type of SMTP connections to use. @@ -105,7 +100,6 @@ This may be either nil (upgrade with STARTTLS if possible), `starttls' (refuse to send if STARTTLS isn't available), `plain' (never use STARTTLS), or `ssl' (to use TLS/SSL)." :version "24.1" - :group 'smtpmail :type '(choice (const :tag "Possibly upgrade to STARTTLS" nil) (const :tag "Always use STARTTLS" starttls) (const :tag "Never use STARTTLS" plain) @@ -119,55 +113,56 @@ not include an @-sign, so that each RCPT TO address is fully qualified. Don't bother to set this unless you have get an error like: Sending failed; 501 : recipient address must contain a domain." - :type '(choice (const nil) string) - :group 'smtpmail) + :type '(choice (const nil) string)) (defcustom smtpmail-debug-info nil "Whether to print info in buffer *trace of SMTP session to *. See also `smtpmail-debug-verb' which determines if the SMTP protocol should be verbose as well." - :type 'boolean - :group 'smtpmail) + :type 'boolean) (defcustom smtpmail-debug-verb nil "Whether this library sends the SMTP VERB command or not. The commands enables verbose information from the SMTP server." - :type 'boolean - :group 'smtpmail) + :type 'boolean) (defcustom smtpmail-code-conv-from nil "Coding system for encoding outgoing mail. Used for the value of `sendmail-coding-system' when `select-message-coding-system' is called." - :type 'coding-system - :group 'smtpmail) + :type 'coding-system) (defcustom smtpmail-queue-mail nil "Non-nil means mail is queued; otherwise it is sent immediately. If queued, it is stored in the directory `smtpmail-queue-dir' and sent with `smtpmail-send-queued-mail'." - :type 'boolean - :group 'smtpmail) + :type 'boolean) (defcustom smtpmail-queue-dir "~/Mail/queued-mail/" "Directory where `smtpmail.el' stores queued mail. This directory should not be writable by other users." - :type 'directory - :group 'smtpmail) + :type 'directory) (defcustom smtpmail-warn-about-unknown-extensions nil "If set, print warnings about unknown SMTP extensions. This is mainly useful for development purposes, to learn about new SMTP extensions that might be useful to support." :type 'boolean - :version "21.1" - :group 'smtpmail) + :version "21.1") (defcustom smtpmail-queue-index-file "index" "File name of queued mail index. This is relative to `smtpmail-queue-dir'." - :type 'string - :group 'smtpmail) + :type 'string) + +(defcustom smtpmail-servers-requiring-authorization nil + "Regexp matching servers that require authorization. +Normally smtpmail will try first to send emails via SMTP without +user/password credentials, and then retry using credentials if +the server says that it requires it. If the server name matches +this regexp, smtpmail will send over the credentials on the first +attempt." + :type '(choice regexp (const :tag "None" nil))) ;; End of customizable variables. @@ -679,6 +674,12 @@ Returns an error if the server cannot be contacted." result auth-mechanisms (supported-extensions '())) + + (when (and smtpmail-servers-requiring-authorization + (string-match-p smtpmail-servers-requiring-authorization + smtpmail-smtp-server)) + (setq ask-for-password t)) + (unwind-protect (catch 'done ;; get or create the trace buffer -- 2.39.2