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