Function: mailclient-send-it

mailclient-send-it is an autoloaded and byte-compiled function defined in mailclient.el.gz.

Signature

(mailclient-send-it)

Documentation

Pass current buffer on to the system's mail client.

Suitable value for send-mail-function. The mail client is taken to be the handler of mailto URLs.

Probably introduced at or before Emacs version 24.1.

Source Code

;; Defined in /usr/src/emacs/lisp/mail/mailclient.el.gz
;;;###autoload
(defun mailclient-send-it ()
  "Pass current buffer on to the system's mail client.
Suitable value for `send-mail-function'.
The mail client is taken to be the handler of mailto URLs."
  (require 'mail-utils)
  (let ((case-fold-search nil)
	delimline
	(mailbuf (current-buffer)))
    (unwind-protect
	(with-temp-buffer
	  (insert-buffer-substring mailbuf)
	  ;; Move to header delimiter
	  (mail-sendmail-undelimit-header)
	  (setq delimline (point-marker))
	  (if mail-aliases
	      (expand-mail-aliases (point-min) delimline))
	  (goto-char (point-min))
	  ;; ignore any blank lines in the header
	  (while (and (re-search-forward "\n\n\n*" delimline t)
		      (< (point) delimline))
	    (replace-match "\n"))
	  (let ((case-fold-search t)
		(mime-charset-pattern
		 (concat
		  "^content-type:[ \t]*text/plain;"
		  "\\(?:[ \t\n]*\\(?:format\\|delsp\\)=\"?[-a-z0-9]+\"?;\\)*"
		  "[ \t\n]*charset=\"?\\([^ \t\n\";]+\\)\"?"))
		coding-system
		character-coding
		;; Use the external browser function to send the
		;; message.
                (browse-url-default-handlers nil))
	    ;; initialize limiter
	    (setq mailclient-delim-static "?")
	    ;; construct and call up mailto URL
	    (browse-url
	     (concat
	      (save-excursion
		(narrow-to-region (point-min) delimline)
                ;; We can't send multipart/* messages (i. e. with
                ;; attachments or the like) via this method.
                (when-let ((type (mail-fetch-field "content-type")))
                  (when (and (string-match "multipart"
                                           (car (mail-header-parse-content-type
                                                 type)))
                             (not (y-or-n-p "Message with attachments can't be sent via mailclient; continue anyway?")))
                    (error "Choose a different `send-mail-function' to send attachments")))
		(goto-char (point-min))
		(setq coding-system
		      (if (re-search-forward mime-charset-pattern nil t)
			  (coding-system-from-name (match-string 1))
			'undecided))
		(setq character-coding
		      (mail-fetch-field "content-transfer-encoding"))
		(when character-coding
		  (setq character-coding (downcase character-coding)))
		(concat
		 "mailto:"
		 ;; Some of the headers according to RFC 822 (or later).
		 (mailclient-gather-addresses "To"
					      'drop-first-name)
		 (mailclient-gather-addresses "cc"  )
		 (mailclient-gather-addresses "bcc"  )
		 (mailclient-gather-addresses "Resent-To"  )
		 (mailclient-gather-addresses "Resent-cc"  )
		 (mailclient-gather-addresses "Resent-bcc"  )
		 (mailclient-gather-addresses "Reply-To"  )
		 ;; The From field is not honored for now: it's
		 ;; not necessarily configured. The mail client
		 ;; knows the user's address(es)
		 ;; (mailclient-gather-addresses "From"  )
		 ;; subject line
		 (let ((subj (mail-fetch-field "Subject" nil t)))
		   (widen) ;; so we can read the body later on
		   (if subj ;; if non-blank
		       ;; the mail client will deal with
		       ;; warning the user etc.
		       (concat (mailclient-url-delim) "subject="
			       (mailclient-encode-string-as-url subj))
		     ""))))
	      ;; body
	      (mailclient-url-delim) "body="
	      (progn
		(delete-region (point-min) delimline)
		(unless (null character-coding)
		  ;; mailto: and clipboard need UTF-8 and cannot deal with
		  ;; Content-Transfer-Encoding or Content-Type.
		  ;; FIXME: There is code duplication here with rmail.el.
		  (set-buffer-multibyte nil)
		  (cond
		   ((string= character-coding "base64")
		    (base64-decode-region (point-min) (point-max)))
		   ((string= character-coding "quoted-printable")
		    (mail-unquote-printable-region (point-min) (point-max)
						   nil nil t))
                   (t (error "Unsupported Content-Transfer-Encoding: %s"
			     character-coding)))
		  (decode-coding-region (point-min) (point-max) coding-system))
		(mailclient-encode-string-as-url
		 (if mailclient-place-body-on-clipboard-flag
		     (progn
		       (clipboard-kill-ring-save (point-min) (point-max))
		       (concat
			"*** E-Mail body has been placed on clipboard, "
			"please paste it here! ***"))
		   (buffer-string)))))))))))