*** empty log message ***
[bpt/emacs.git] / lisp / mail / mh-mime.el
CommitLineData
c26cf6c8 1;;; mh-mime --- mh-e support for composing MIME messages
b4b1e78a 2;; Time-stamp: <95/08/19 16:45:17 gildea>
c26cf6c8 3
847b8219 4;; Copyright (C) 1993, 1995 Free Software Foundation, Inc.
c26cf6c8 5
b4b1e78a 6;; This file is part of mh-e, part of GNU Emacs.
c26cf6c8 7
9b7bc076 8;; GNU Emacs is free software; you can redistribute it and/or modify
c26cf6c8
RS
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)
11;; any later version.
12
9b7bc076 13;; GNU Emacs is distributed in the hope that it will be useful,
c26cf6c8
RS
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.
17
18;; You should have received a copy of the GNU General Public License
b578f267
EN
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.
c26cf6c8
RS
22
23;;; Commentary:
24
b578f267
EN
25;; Internal support for mh-e package.
26;; Support for generating an mhn composition file.
27;; MIME is supported only by MH 6.8 or later.
c26cf6c8 28
847b8219
KH
29;;; Change Log:
30
b578f267 31;; $Id: mh-mime.el,v 1.5 1995/11/03 02:29:49 kwzh Exp erik $
847b8219 32
c26cf6c8
RS
33;;; Code:
34
35(provide 'mh-mime)
36(require 'mh-comp)
37
38
39;; To do:
40;; paragraph code should not fill # lines if MIME enabled.
41;; implement mh-auto-edit-mhn (if non-nil, \\[mh-send-letter]
42;; invokes mh-edit-mhn automatically before sending.)
43;; actually, instead of mh-auto-edit-mhn,
44;; should read automhnproc from profile
45;; MIME option to mh-forward
46;; command to move to content-description insertion point
47
847b8219
KH
48(defvar mh-mhn-args nil
49 "Extra arguments to have \\[mh-edit-mhn] pass to the \"mhn\" command.
50The arguments are passed to mhn if \\[mh-edit-mhn] is given a
51prefix argument. Normally default arguments to mhn are specified in the
52MH profile.")
53
54(defvar mh-edit-mhn-hook nil
55 "Invoked on the formatted letter by \\<mh-letter-mode-map>\\[mh-edit-mhn].")
56
42c21202 57;;;###autoload
c26cf6c8
RS
58(defvar mh-mime-content-types
59 '(("text/plain") ("text/richtext")
60 ("multipart/mixed") ("multipart/alternative") ("multipart/digest")
61 ("multipart/parallel")
62 ("message/rfc822") ("message/partial") ("message/external-body")
63 ("application/octet-stream") ("application/postscript")
64 ("image/jpeg") ("image/gif")
65 ("audio/basic")
66 ("video/mpeg"))
42c21202 67 "Legal MIME content types. See documentation for \\[mh-edit-mhn].")
c26cf6c8
RS
68
69(defun mh-mhn-compose-insertion (pathname type description)
42c21202 70 "Add a directive to insert a MIME message part from a file.
c26cf6c8 71This is the typical way to insert non-text parts in a message.
847b8219
KH
72Arguments are PATHNAME, which tells where to find the file, TYPE, the
73MIME content type, and DESCRIPTION, a line of text for the
74Content-description header. See also \\[mh-edit-mhn]."
c26cf6c8
RS
75 (interactive (list
76 (read-file-name "Insert contents of: ")
77 (completing-read "Content-type: "
78 mh-mime-content-types nil nil nil)
79 (read-string "Content-description: ")))
80 (mh-mhn-compose-type pathname type description))
81
82(defun mh-mhn-compose-type (pathname type
83 &optional description attributes comment)
84 (beginning-of-line)
85 (insert "#" type)
86 (and attributes
87 (insert "; " attributes))
88 (and comment
89 (insert " (" comment ")"))
90 (insert " [")
91 (and description
92 (insert description))
93 (insert "] " (expand-file-name pathname))
94 (insert "\n"))
95
96
97(defun mh-mhn-compose-anon-ftp (host pathname type description)
42c21202 98 "Add a directive for a MIME anonymous ftp external body part.
847b8219
KH
99This directive tells MH to include a reference to a
100message/external-body part retrievable by anonymous FTP. Arguments
101are HOST and PATHNAME, which tell where to find the file, TYPE, the
102MIME content type, and DESCRIPTION, a line of text for the
103Content-description header. See also \\[mh-edit-mhn]."
c26cf6c8
RS
104 (interactive (list
105 (read-string "Remote host: ")
106 (read-string "Remote pathname: ")
107 (completing-read "External Content-type: "
108 mh-mime-content-types nil nil nil)
109 (read-string "External Content-description: ")))
110 (mh-mhn-compose-external-type "anon-ftp" host pathname
111 type description))
112
113(defun mh-mhn-compose-external-compressed-tar (host pathname description)
42c21202 114 "Add a directive to include a MIME reference to a compressed tar file.
847b8219
KH
115The file should be available via anonymous ftp. This directive
116tells MH to include a reference to a message/external-body part.
117Arguments are HOST and PATHNAME, which tell where to find the file, and
118DESCRIPTION, a line of text for the Content-description header.
c26cf6c8
RS
119See also \\[mh-edit-mhn]."
120 (interactive (list
121 (read-string "Remote host: ")
122 (read-string "Remote pathname: ")
123 (read-string "Tar file Content-description: ")))
124 (mh-mhn-compose-external-type "anon-ftp" host pathname
125 "application/octet-stream"
126 description
127 "type=tar; conversions=x-compress"
128 "mode=image"))
129
130
131(defun mh-mhn-compose-external-type (access-type host pathname type
132 &optional description
133 attributes extra-params comment)
134 (beginning-of-line)
135 (insert "#@" type)
136 (and attributes
137 (insert "; " attributes))
138 (and comment
139 (insert " (" comment ") "))
140 (insert " [")
141 (and description
142 (insert description))
143 (insert "] ")
144 (insert "access-type=" access-type "; ")
145 (insert "site=" host)
146 (insert "; name=" (file-name-nondirectory pathname))
147 (insert "; directory=\"" (file-name-directory pathname) "\"")
148 (and extra-params
149 (insert "; " extra-params))
150 (insert "\n"))
151
847b8219 152(defun mh-mhn-compose-forw (&optional description folder messages)
42c21202 153 "Add a forw directive to this message, to forward a message with MIME.
c26cf6c8
RS
154This directive tells MH to include the named messages in this one.
155Arguments are DESCRIPTION, a line of text for the Content-description header,
42c21202 156and FOLDER and MESSAGES, which name the message(s) to be forwarded.
c26cf6c8
RS
157See also \\[mh-edit-mhn]."
158 (interactive (list
159 (read-string "Forw Content-description: ")
847b8219 160 (mh-prompt-for-folder "Message from" mh-sent-from-folder nil)
c26cf6c8
RS
161 (read-string (format "Messages%s: "
162 (if mh-sent-from-msg
163 (format " [%d]" mh-sent-from-msg)
847b8219 164 "")))))
c26cf6c8
RS
165 (beginning-of-line)
166 (insert "#forw [")
167 (and description
168 (not (string= description ""))
169 (insert description))
170 (insert "]")
171 (and folder
172 (not (string= folder ""))
173 (insert " " folder))
847b8219
KH
174 (if (and messages
175 (not (string= messages "")))
c26cf6c8 176 (let ((start (point)))
847b8219 177 (insert " " messages)
c26cf6c8
RS
178 (subst-char-in-region start (point) ?, ? ))
179 (if mh-sent-from-msg
180 (insert " " (int-to-string mh-sent-from-msg))))
181 (insert "\n"))
182
847b8219
KH
183(defun mh-edit-mhn (&optional extra-args)
184 "Format the current draft for MIME, expanding any mhn directives.
185Process the current draft with the mhn program, which,
186using directives already inserted in the draft, fills in
c26cf6c8
RS
187all the MIME components and header fields.
188This step should be done last just before sending the message.
189The mhn program is part of MH version 6.8 or later.
190The `\\[mh-revert-mhn-edit]' command undoes this command.
847b8219
KH
191The arguments in the list `mh-mhn-args' are passed to mhn
192if this function is passed an argument.
193
194For assistance with creating mhn directives to insert
c26cf6c8
RS
195various types of components in a message, see
196\\[mh-mhn-compose-insertion] (generic insertion from a file),
197\\[mh-mhn-compose-anon-ftp] (external reference to file via anonymous ftp),
198\\[mh-mhn-compose-external-compressed-tar] \
199\(reference to compressed tar file via anonymous ftp), and
200\\[mh-mhn-compose-forw] (forward message)."
847b8219 201 (interactive "*P")
c26cf6c8
RS
202 (save-buffer)
203 (message "mhn editing...")
847b8219
KH
204 (mh-exec-cmd-error (format "mhdraft=%s" buffer-file-name)
205 "mhn" (if extra-args mh-mhn-args) buffer-file-name)
c26cf6c8 206 (revert-buffer t t)
847b8219
KH
207 (message "mhn editing...done")
208 (run-hooks 'mh-edit-mhn-hook))
c26cf6c8
RS
209
210
211(defun mh-revert-mhn-edit (noconfirm)
212 "Undoes the effect of \\[mh-edit-mhn] by reverting to the backup file.
847b8219 213Optional non-nil argument means don't ask for confirmation."
c26cf6c8
RS
214 (interactive "*P")
215 (if (null buffer-file-name)
216 (error "Buffer does not seem to be associated with any file"))
217 (let ((backup-strings '("," "#"))
218 backup-file)
219 (while (and backup-strings
220 (not (file-exists-p
221 (setq backup-file
222 (concat (file-name-directory buffer-file-name)
223 (car backup-strings)
224 (file-name-nondirectory buffer-file-name)
225 ".orig")))))
226 (setq backup-strings (cdr backup-strings)))
227 (or backup-strings
228 (error "mhn backup file for %s no longer exists!" buffer-file-name))
229 (or noconfirm
230 (yes-or-no-p (format "Revert buffer from file %s? "
231 backup-file))
232 (error "mhn edit revert not confirmed."))
233 (let ((buffer-read-only nil))
234 (erase-buffer)
235 (insert-file-contents backup-file))
236 (after-find-file nil)))