Function: mail-send
mail-send is an interactive and byte-compiled function defined in
sendmail.el.gz.
Signature
(mail-send)
Documentation
Send the message in the current buffer.
If mail-interactive is non-nil, wait for success indication
or error messages, and inform user.
Otherwise any failure is reported in a message back to
the user from the mailer.
Key Bindings
Source Code
;; Defined in /usr/src/emacs/lisp/mail/sendmail.el.gz
(defun mail-send ()
"Send the message in the current buffer.
If `mail-interactive' is non-nil, wait for success indication
or error messages, and inform user.
Otherwise any failure is reported in a message back to
the user from the mailer."
(interactive)
(if (if buffer-file-name
(y-or-n-p "Send buffer contents as mail message? ")
(or (buffer-modified-p)
(y-or-n-p "Message already sent; resend? ")))
(let ((inhibit-read-only t)
(opoint (point))
(ml (when mail-mailing-lists
;; The surrounding regexp assumes the use of
;; `mail-strip-quoted-names' on addresses before matching
;; Cannot deal with full RFC 822 (or later), but that is
;; unlikely to be problematic.
(concat "\\(?:[[:space:];,]\\|\\`\\)"
(regexp-opt mail-mailing-lists t)
"\\(?:[[:space:];,]\\|\\'\\)"))))
(unless noninteractive
(mail-combine-fields "To")
(mail-combine-fields "Cc"))
;; If there are mailing lists defined
(when ml
(save-excursion
(let* ((to (mail-fetch-field "to" nil t))
(cc (mail-fetch-field "cc" nil t))
(new-header-values ; To: and Cc:
(mail-strip-quoted-names
(concat to (when cc (concat ", " cc))))))
;; If message goes to known mailing list ...
(when (string-match ml new-header-values)
;; Add Mail-Followup-To if none yet
(unless (mail-fetch-field "mail-followup-to")
(goto-char (mail-header-end))
(insert "Mail-Followup-To: "
(let ((l))
(mapc
;; remove duplicates
(lambda (e)
(unless (member e l)
(push e l)))
(split-string new-header-values
",[[:space:]]+" t))
(mapconcat #'identity l ", "))
"\n"))
;; Add Mail-Reply-To if none yet
(unless (mail-fetch-field "mail-reply-to")
(goto-char (mail-header-end))
(insert "Mail-Reply-To: "
(or (mail-fetch-field "reply-to")
user-mail-address)
"\n"))))))
(unless (memq mail-send-nonascii '(t mime))
(goto-char (point-min))
(skip-chars-forward "\0-\177")
(or (= (point) (point-max))
(if (eq mail-send-nonascii 'query)
(or (y-or-n-p "Message contains non-ASCII characters; send anyway? ")
(error "Aborted"))
(error "Message contains non-ASCII characters"))))
;; Complain about any invalid line.
(goto-char (point-min))
;; Search for mail-header-eeparator as whole line.
(re-search-forward (concat "^" (regexp-quote mail-header-separator) "$")
(point-max) t)
(let ((header-end (or (match-beginning 0) (point-max))))
(goto-char (point-min))
(while (< (point) header-end)
(unless (looking-at "[ \t]\\|.*:\\|$")
(push-mark opoint)
(error "Invalid header line (maybe a continuation line lacks initial whitespace)"))
(forward-line 1)))
(goto-char opoint)
(when mail-encode-mml
(mml-to-mime)
(setq mail-encode-mml nil))
(run-hooks 'mail-send-hook)
(message "Sending...")
(funcall send-mail-function)
;; Now perform actions on successful sending.
(while mail-send-actions
(condition-case nil
(apply (car (car mail-send-actions))
(cdr (car mail-send-actions)))
(error))
(setq mail-send-actions (cdr mail-send-actions)))
(message "Sending...done")
;; If buffer has no file, mark it as unmodified and delete auto-save.
(if (not buffer-file-name)
(progn
(set-buffer-modified-p nil)
(delete-auto-save-file-if-necessary t))))))