1 ;;; rfc2047.el --- Functions for encoding and decoding rfc2047 messages
2 ;; Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
4 ;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
5 ;; MORIOKA Tomohiko <morioka@jaist.ac.jp>
6 ;; This file is part of GNU Emacs.
8 ;; GNU Emacs is free software; you can redistribute it and/or modify
9 ;; it under the terms of the GNU General Public License as published by
10 ;; the Free Software Foundation; either version 2, or (at your option)
13 ;; GNU Emacs is distributed in the hope that it will be useful,
14 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
15 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 ;; GNU General Public License for more details.
18 ;; You should have received a copy of the GNU General Public License
19 ;; along with GNU Emacs; see the file COPYING. If not, write to the
20 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
21 ;; Boston, MA 02111-1307, USA.
25 ;; RFC 2047 is "MIME (Multipurpose Internet Mail Extensions) Part
26 ;; Three: Message Header Extensions for Non-ASCII Text".
32 (defvar message-posting-charset))
39 ;; Fixme: Avoid this (for gnus-point-at-...) mm dependence on gnus.
41 (autoload 'mm-body-7-or-8 "mm-bodies")
43 (defvar rfc2047-header-encoding-alist
44 '(("Newsgroups" . nil)
46 ("\\(Resent-\\)?\\(From\\|Cc\\|To\\|Bcc\\|Reply-To\\|Sender\\)" .
49 "*Header/encoding method alist.
50 The list is traversed sequentially. The keys can either be
55 1) nil, in which case no encoding is done;
56 2) `mime', in which case the header will be encoded according to RFC2047;
57 3) a charset, in which case it will be encoded as that charset;
58 4) `default', in which case the field will be encoded as the rest
60 5) a string, like `mime', expect for using it as word-chars.")
62 (defvar rfc2047-charset-encoding-alist
85 "Alist of MIME charsets to RFC2047 encodings.
86 Valid encodings are nil, `Q' and `B'. These indicate binary (no) encoding,
87 quoted-printable and base64 respectively.")
89 (defvar rfc2047-encoding-function-alist
90 '((Q . rfc2047-q-encode-region)
91 (B . rfc2047-b-encode-region)
93 "Alist of RFC2047 encodings to encoding functions.")
95 (defvar rfc2047-q-encoding-alist
96 '(("\\(Resent-\\)?\\(From\\|Cc\\|To\\|Bcc\\|Reply-To\\|Sender\\):"
98 ;; = (\075), _ (\137), ? (\077) are used in the encoded word.
99 ;; Avoid using 8bit characters.
100 ;; Equivalent to "^\000-\007\011\013\015-\037\200-\377=_?"
101 ("." . "\010\012\014\040-\074\076\100-\136\140-\177"))
102 "Alist of header regexps and valid Q characters.")
105 ;;; Functions for encoding RFC2047 messages
108 (defun rfc2047-narrow-to-field ()
109 "Narrow the buffer to the header on the current line."
115 (if (re-search-forward "^[^ \n\t]" nil t)
120 (goto-char (point-min)))
122 (defun rfc2047-field-value ()
123 "Return the value of the field at point."
126 (rfc2047-narrow-to-field)
127 (re-search-forward ":[ \t\n]*" nil t)
128 (buffer-substring (point) (point-max)))))
130 (defun rfc2047-encode-message-header ()
131 "Encode the message header according to `rfc2047-header-encoding-alist'.
132 Should be called narrowed to the head of the message."
135 (goto-char (point-min))
136 (let (alist elem method)
139 (rfc2047-narrow-to-field)
140 (if (not (rfc2047-encodable-p))
142 (if (and (eq (mm-body-7-or-8) '8bit)
145 (car message-posting-charset)))
146 ;; 8 bit must be decoded.
147 ;; Is message-posting-charset a coding system?
148 (mm-encode-coding-region
149 (point-min) (point-max)
150 (car message-posting-charset))
152 ;; No encoding necessary, but folding is nice
155 (goto-char (point-min))
156 (skip-chars-forward "^:")
157 (when (looking-at ": ")
161 ;; We found something that may perhaps be encoded.
163 alist rfc2047-header-encoding-alist)
164 (while (setq elem (pop alist))
165 (when (or (and (stringp (car elem))
166 (looking-at (car elem)))
172 (rfc2047-encode-region (point-min) (point-max) method))
174 (rfc2047-encode-region (point-min) (point-max)))
175 ((eq method 'default)
176 (if (and (featurep 'mule)
177 (if (boundp 'default-enable-multibyte-characters)
178 default-enable-multibyte-characters)
180 (mm-encode-coding-region (point-min) (point-max)
181 mail-parse-charset)))
182 ;; We get this when CC'ing messsages to newsgroups with
183 ;; 8-bit names. The group name mail copy just get
184 ;; unconditionally encoded. Previously, it would ask
185 ;; whether to encode, which was quite confusing for the
186 ;; user. If the new behaviour is wrong, tell me. I have
187 ;; left the old code commented out below.
188 ;; -- Per Abrahamsen <abraham@dina.kvl.dk> Date: 2001-10-07.
191 (mm-find-charset-region (point-min) (point-max)))
192 (rfc2047-encode-region (point-min) (point-max))))
194 ;;; (and (delq 'ascii
195 ;;; (mm-find-charset-region (point-min)
197 ;;; (if (or (message-options-get
198 ;;; 'rfc2047-encode-message-header-encode-any)
199 ;;; (message-options-set