+;;;###autoload
+(defun sendmail-query-once ()
+ "Query for `send-mail-function' and send mail with it.
+This also saves the value of `send-mail-function' via Customize."
+ ;; If send-mail-function is already setup, we're incorrectly called
+ ;; a second time, probably because someone's using an old value
+ ;; of send-mail-function.
+ (when (eq send-mail-function 'sendmail-query-once)
+ (let* ((options `(("Mail client" . mailclient-send-it)
+ ,@(when (and sendmail-program
+ (executable-find sendmail-program))
+ '(("Mail transport agent" . sendmail-send-it)))
+ ("SMTP server" . smtpmail-send-it)))
+ (choice
+ ;; Query the user.
+ (with-temp-buffer
+ (rename-buffer "*Emacs Mail Setup Help*" t)
+ (insert "\
+ Emacs is about to send an email message. However, it was not configured
+ for sending email. You can instruct Emacs to send email in one of the
+ following ways:
+
+ - Start your default mail client and pass to it the message text.
+ Type \"Mail client\" at the prompt below to select this option.\n\n")
+ (if (and sendmail-program
+ (executable-find sendmail-program))
+ (insert "\
+ - Invoke the system's mail transport agent (\"sendmail\").
+ Type \"Mail transport agent\" at the prompt below to select this option.\n\n"))
+ (insert "\
+ - Send mail directly by communicating with your mail server
+ (this requires setting up SMTP parameters).
+ Type \"SMTP server\" at the prompt below to select this option.
+
+ Emacs will record your selection and will use it thereafter. To change
+ your selection later, customize the option `send-mail-function'.\n")
+ (goto-char (point-min))
+ (display-buffer (current-buffer))
+ (let ((completion-ignore-case t))
+ (completing-read "Send mail via: "
+ options nil 'require-match)))))
+ (customize-save-variable 'send-mail-function
+ (cdr (assoc-string choice options t)))))
+ (funcall send-mail-function))
+\f