This allows for extra authentication mechanisms (such as XOAuth2) to be added without having to advise any functions. * lisp/mail/smtpmail.el: Turn `smtpmail-try-auth-method' into a generic function. --- lisp/mail/smtpmail.el | 33 +++++++++++++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/lisp/mail/smtpmail.el b/lisp/mail/smtpmail.el index 20cbeb5f4e..46c1639832 100644 --- a/lisp/mail/smtpmail.el +++ b/lisp/mail/smtpmail.el @@ -181,7 +181,25 @@ This is relative to `smtpmail-queue-dir'." (defconst smtpmail-auth-supported '(cram-md5 plain login) "List of supported SMTP AUTH mechanisms. -The list is in preference order.") +The list is in preference order. + +New mechanisms can be added by defining a method implementing the +`smtpmail-try-auth-method' generic function for that mechanism, and +then adding the mechanism to this list. As an example, the code below +adds support for XOAuth2 authentication (assuming that there is an +appropriate auth source extension that can provide the correct user +and password): + +\(cl-defmethod smtpmail-try-auth-method + (process (mech (eql xoauth2)) user password) + (smtpmail-command-or-throw + process + (concat \"AUTH XOAUTH2 \" + (base64-encode-string + (concat \"user=\" user \"\\1auth=Bearer \" password \"\\1\\1\") t)) + 235)) + +\(add-to-list 'smtpmail-try-auth-method 'xoauth2)") (defvar smtpmail-mail-address nil "Value to use for envelope-from address for mail from ambient buffer.") @@ -539,7 +557,18 @@ The list is in preference order.") (funcall save-function)) result)))) -(defun smtpmail-try-auth-method (process mech user password) +(cl-defgeneric smtpmail-try-auth-method (process mech user password) + "Try to authenticate to an SMTP process. +Authenticate to PROCESS using the MECH authentication mechanism, with +the given USER and PASSWORD. Implementations should either return the +result code from the authentication command, or throw 'done with an +error string. (This is usually done by calling +`smtpmail-command-or-throw' as the last step in the function.)") + +(cl-defmethod smtpmail-try-auth-method (process mech user password) + "Default `smtpmail-try-auth-method' implementation. +This implementation provides support for the SMTP authentication +mechanisms 'cram-md5, 'login, and 'plain." (let (ret) (cond ((or (not mech) -- 2.15.0 -- Cesar Crusius