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))))))