diff options
author | Eli Zaretskii <eliz@gnu.org> | 2003-08-28 15:12:10 +0000 |
---|---|---|
committer | Eli Zaretskii <eliz@gnu.org> | 2003-08-28 15:12:10 +0000 |
commit | 17139abc070ed531b7caca6bdc44aa90c7ff8297 (patch) | |
tree | 689c7d73511cc94b40cc6067f5912199c6b66357 /lisp/mail | |
parent | a0b1873872f089de287dfa170649245c6ab8915f (diff) | |
download | emacs-17139abc070ed531b7caca6bdc44aa90c7ff8297.tar.gz |
(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.
Diffstat (limited to 'lisp/mail')
-rw-r--r-- | lisp/mail/rmail.el | 79 |
1 files changed, 73 insertions, 6 deletions
diff --git a/lisp/mail/rmail.el b/lisp/mail/rmail.el index deb043ffba9..c5494fc55c7 100644 --- a/lisp/mail/rmail.el +++ b/lisp/mail/rmail.el @@ -1652,12 +1652,66 @@ It returns t if it got any new messages." (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 @@ It returns t if it got any new messages." (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 @@ It returns t if it got any new messages." ;; 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 |