# HG changeset patch # User Eli Zaretskii # Date 1062083475 0 # Node ID 7751260b33588f9ba65fd181f784d9dfa8fa47c4 # Parent e0444201e1c2daf80567aa8c875916f511af298e (rmail-convert-to-babyl-format): Detect quoted-printable- and base64-encoded messages and decode them automatically. Set the message's encoding from the charset= header, if any. Decode base64-encoded messages in Mail format as well. diff -r e0444201e1c2 -r 7751260b3358 lisp/mail/rmail.el --- a/lisp/mail/rmail.el Thu Aug 28 14:08:55 2003 +0000 +++ b/lisp/mail/rmail.el Thu Aug 28 15:11:15 2003 +0000 @@ -1652,12 +1652,66 @@ (save-excursion (skip-chars-forward " \t\n") (point))) - (setq last-coding-system-used nil) - (or rmail-enable-mime - (not rmail-enable-multibyte) - (decode-coding-region start (point) - (or rmail-file-coding-system - 'undecided))) + (save-excursion + (let* ((header-end + (progn + (save-excursion + (goto-char start) + (forward-line 1) + (if (looking-at "0") + (forward-line 1) + (forward-line 2)) + (save-restriction + (narrow-to-region (point) (point-max)) + (rfc822-goto-eoh) + (point))))) + (case-fold-search t) + (quoted-printable-header-field-end + (save-excursion + (goto-char start) + (re-search-forward + "^content-transfer-encoding:\\(\n?[\t ]\\)*quoted-printable\\(\n?[\t ]\\)*" + header-end t))) + (base64-header-field-end + (save-excursion + (goto-char start) + (re-search-forward + "^content-transfer-encoding:\\(\n?[\t ]\\)*base64\\(\n?[\t ]\\)*" + header-end t)))) + (if quoted-printable-header-field-end + (save-excursion + (rmail-decode-quoted-printable header-end (point)) + ;; Change "quoted-printable" to "8bit", + ;; to reflect the decoding we just did. + (goto-char quoted-printable-header-field-end) + (delete-region (point) (search-backward ":")) + (insert ": 8bit"))) + (if base64-header-field-end + (save-excursion + (base64-decode-region (1+ header-end) + (- (point) 2)) + ;; Change "base64" to "8bit", to reflect the + ;; decoding we just did. + (goto-char (1+ header-end)) + (while (search-forward "\r\n" (point-max) t) + (replace-match "\n")) + (goto-char base64-header-field-end) + (delete-region (point) (search-backward ":")) + (insert ": 8bit"))) + (setq last-coding-system-used nil) + (or rmail-enable-mime + (not rmail-enable-multibyte) + (let ((mime-charset + (if (and rmail-decode-mime-charset + (save-excursion + (goto-char start) + (search-forward "\n\n" nil t) + (let ((case-fold-search t)) + (re-search-backward + rmail-mime-charset-pattern + start t)))) + (intern (downcase (match-string 1)))))) + (rmail-decode-region start (point) mime-charset))))) ;; Add an X-Coding-System: header if we don't have one. (save-excursion (goto-char start) @@ -1714,6 +1768,11 @@ (re-search-forward "^content-transfer-encoding:\\(\n?[\t ]\\)*quoted-printable\\(\n?[\t ]\\)*" header-end t))) + (base64-header-field-end + (save-excursion + (re-search-forward + "^content-transfer-encoding:\\(\n?[\t ]\\)*base64\\(\n?[\t ]\\)*" + header-end t))) (size ;; Get the numeric value from the Content-Length field. (save-excursion @@ -1762,6 +1821,14 @@ ;; to reflect the decoding we just did. (goto-char quoted-printable-header-field-end) (delete-region (point) (search-backward ":")) + (insert ": 8bit"))) + (if base64-header-field-end + (save-excursion + (base64-decode-region header-end (point)) + ;; Change "base64" to "8bit", to reflect the + ;; decoding we just did. + (goto-char base64-header-field-end) + (delete-region (point) (search-backward ":")) (insert ": 8bit")))) (save-excursion