From: yamaoka Date: Tue, 7 May 2002 01:18:51 +0000 (+0000) Subject: T-gnus 6.15.7 revision 00. X-Git-Tag: t-gnus-6_15_7-00-quimby~1 X-Git-Url: http://git.chise.org/gitweb/?a=commitdiff_plain;h=4a3e63a96a0d628e35af388c4bd2e66a1d33a00a;p=elisp%2Fgnus.git- T-gnus 6.15.7 revision 00. --- diff --git a/ChangeLog b/ChangeLog index 8aecba8..a82e9cb 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2002-05-07 Katsumi Yamaoka + + * lisp/gnus-vers.el: T-gnus 6.15.7 revision 00. + 2002-04-30 Daiki Ueno * lisp/message.el (message-expand-name-function): New user option. diff --git a/README.T-gnus b/README.T-gnus index 1966194..23ef7ee 100644 --- a/README.T-gnus +++ b/README.T-gnus @@ -33,6 +33,6 @@ NEWS: * T-gnus 6.15 - this is based on Oort Gnus. - The latest T-gnus is T-gnus 6.15.4 (based on Oort Gnus 0.04). It + The latest T-gnus is T-gnus 6.15.7 (based on Oort Gnus 0.07). It requires SEMI/WEMI (1.13.5 or later), FLIM (1.13.1 or later), and APEL (10.0 or later). diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 282531f..d87788f 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,84 @@ +2002-05-06 Simon Josefsson + + * gnus-topic.el (gnus-group-topic-parameters): Work when group + buffer doesn't show group. From Matt Armstrong . + +2002-05-06 Josh Huber + + * mml2015.el (mml2015-gpg-encrypt): Changed name of optional + argument, and fixed compiler warning. (added autoload for + gpg-encrypt). + +2002-05-04 Simon Josefsson + + * mml1991.el (mml1991-function-alist): Doc fix. + + * mml.el (mml-preview): Bind gnus-newsrc-hashtb temporarily if it + doesn't exist (for previewing messages without having Gnus + started). + + * mm-util.el (mm-coding-system-priorities): Defcustom. + + * mm-encode.el (mm-content-transfer-encoding-defaults): Defcustom. + +2002-05-01 Josh Huber + + * gnus-msg.el (gnus-message-replysignencrypted): enabled by + default. + * mml-sec.el: + * mml-sec.el (mml-signencrypt-style): New. + * mml-sec.el (mml-pgpmime-encrypt-buffer): Accept optional + argument `sign'. + * mml-sec.el (mml-secure-message-encrypt-pgp): Changed default to + signencrypt. + * mml-sec.el (mml-secure-message-encrypt-pgpmime): Ditto. + * mml.el (mml-generate-mime-1): Changed logic so a part which is + both signed & encryped is processed in one operation. (rather than + two separate ops: sign, then encrypt) + * mml2015.el (mml2015-gpg-extract-signature-details): Give some + indication if a message is signed by an expired key. + * mml2015.el (mml2015-gpg-encrypt): Accept optional argument which + enables combined sign & encrypt operation. (this was always on + before). + * mml2015.el (mml2015-encrypt): Accept optional argument `sign'. + +2002-05-01 Simon Josefsson + + * nnimap.el (nnimap-retrieve-groups): Use separate data for each + server. + (nnimap-mailbox-info): defvar instead of defvoo. + +2002-05-01 20:09:21 Lars Magne Ingebrigtsen + + * gnus.el: Oort Gnus v0.06 is released. + +2002-05-01 Lars Magne Ingebrigtsen + + * lpath.el: Bind url-package-version. + +2002-05-01 Simon Josefsson + + * nnfolder.el (nnfolder-request-delete-group): Figure out nov/mrk + filename before deleting the group itself, because the presence of + a group filename decides if long filenames are used or not. + + * gnus-art.el (gnus-button-alist): Don't inline + gnus-button-url-regexp. This makes it possible to change g-b-u-r + without also modifying g-button-alist. + (gnus-button-alist): Fix type to allow variable as well as regexp. + (gnus-article-add-buttons): Evaluate regexp. Strings evaluate to + themselves, variables to its contents. + (gnus-button-entry): Ditto. + +2002-05-01 Simon Josefsson + + * imap.el (imap-parse-resp-text-code, imap-parse-status): Treat + UIDNEXT as a string. + + * nnimap.el (nnimap-string-lessp-numerical): New function. + (nnimap-retrieve-groups): Compare UIDNEXT as strings instead of + integers. + 2002-04-29 Simon Josefsson * nnmail.el (nnmail-cache-insert): Accept optional group diff --git a/lisp/gnus-art.el b/lisp/gnus-art.el index a6295d9..7ab2441 100644 --- a/lisp/gnus-art.el +++ b/lisp/gnus-art.el @@ -5813,7 +5813,7 @@ after replacing with the original article." ;; This is how URLs _should_ be embedded in text... ("]*\\)>" 1 t gnus-button-embedded-url 1) ;; Raw URLs. - (,gnus-button-url-regexp 0 t browse-url 0)) + (gnus-button-url-regexp 0 t browse-url 0)) "*Alist of regexps matching buttons in article bodies. Each entry has the form (REGEXP BUTTON FORM CALLBACK PAR...), where @@ -5827,7 +5827,7 @@ PAR: is a number of a regexp grouping whose text will be passed to CALLBACK. CALLBACK can also be a variable, in that case the value of that variable it the real callback function." :group 'gnus-article-buttons - :type '(repeat (list regexp + :type '(repeat (list (choice regexp variable) (integer :tag "Button") (sexp :tag "Form") (function :tag "Callback") @@ -6055,7 +6055,7 @@ specified by `gnus-button-alist'." (article-goto-body) (setq beg (point)) (while (setq entry (pop alist)) - (setq regexp (car entry)) + (setq regexp (eval (car entry))) (goto-char beg) (while (re-search-forward regexp nil t) (let* ((start (and entry (match-beginning (nth 1 entry)))) @@ -6164,7 +6164,7 @@ specified by `gnus-button-alist'." (entry nil)) (while alist (setq entry (pop alist)) - (if (looking-at (car entry)) + (if (looking-at (eval (car entry))) (setq alist nil) (setq entry nil))) entry)) diff --git a/lisp/gnus-msg.el b/lisp/gnus-msg.el index 60752ad..4fb4c01 100644 --- a/lisp/gnus-msg.el +++ b/lisp/gnus-msg.el @@ -241,7 +241,7 @@ See also the `mml-default-encrypt-method' variable." :type 'boolean) (defcustom gnus-message-replysignencrypted - nil + t "Setting this causes automatically encryped messages to also be signed." :group 'gnus-message :type 'boolean) diff --git a/lisp/gnus-topic.el b/lisp/gnus-topic.el index b7d054d..0f45fd3 100644 --- a/lisp/gnus-topic.el +++ b/lisp/gnus-topic.el @@ -381,9 +381,17 @@ If RECURSIVE is t, return groups in its subtopics too." "Compute the group parameters for GROUP taking into account inheritance from topics." (let ((params-list (copy-sequence (gnus-group-get-parameter group)))) (save-excursion - (gnus-group-goto-group group) (nconc params-list - (gnus-topic-hierarchical-parameters (gnus-current-topic)))))) + (gnus-topic-hierarchical-parameters + ;; First we try to go to the group within the group + ;; buffer and find the topic for the group that way. + ;; This hopefully copes well with groups that are in + ;; more than one topic. Failing that (i.e. when the + ;; group isn't visible in the group buffer) we find a + ;; topic for the group via gnus-group-topic. + (or (and (gnus-group-goto-group group) + (gnus-current-topic)) + (gnus-group-topic group))))))) (defun gnus-topic-hierarchical-parameters (topic) "Return a topic list computed for TOPIC." diff --git a/lisp/gnus-vers.el b/lisp/gnus-vers.el index 3cd358b..c341989 100644 --- a/lisp/gnus-vers.el +++ b/lisp/gnus-vers.el @@ -34,16 +34,16 @@ (require 'product) (provide 'gnus-vers) -(defconst gnus-revision-number "03" +(defconst gnus-revision-number "00" "Revision number for this version of gnus.") ;; Product information of this gnus. (product-provide 'gnus-vers (product-define "T-gnus" nil - (list 6 15 6 + (list 6 15 7 (string-to-number gnus-revision-number)))) -(defconst gnus-original-version-number "0.06" +(defconst gnus-original-version-number "0.07" "Version number for this version of Gnus.") (provide 'running-pterodactyl-gnus-0_73-or-later) diff --git a/lisp/imap.el b/lisp/imap.el index c1485d8..33f2d52 100644 --- a/lisp/imap.el +++ b/lisp/imap.el @@ -2116,8 +2116,8 @@ Return nil if no complete line has arrived." (imap-forward) (cond ((search-forward "PERMANENTFLAGS " nil t) (imap-mailbox-put 'permanentflags (imap-parse-flag-list))) - ((search-forward "UIDNEXT " nil t) - (imap-mailbox-put 'uidnext (read (current-buffer)))) + ((search-forward "UIDNEXT \\([0-9]+\\)" nil t) + (imap-mailbox-put 'uidnext (match-string 1))) ((search-forward "UNSEEN " nil t) (imap-mailbox-put 'unseen (read (current-buffer)))) ((looking-at "UIDVALIDITY \\([0-9]+\\)") @@ -2290,7 +2290,9 @@ Return nil if no complete line has arrived." ((eq token 'RECENT) (imap-mailbox-put 'recent (read (current-buffer)) mailbox)) ((eq token 'UIDNEXT) - (imap-mailbox-put 'uidnext (read (current-buffer)) mailbox)) + (and (looking-at " \\([0-9]+\\)") + (imap-mailbox-put 'uidnext (match-string 1) mailbox) + (goto-char (match-end 1)))) ((eq token 'UIDVALIDITY) (and (looking-at " \\([0-9]+\\)") (imap-mailbox-put 'uidvalidity (match-string 1) mailbox) diff --git a/lisp/lpath.el b/lisp/lpath.el index e1b1554..018179d 100644 --- a/lisp/lpath.el +++ b/lisp/lpath.el @@ -60,7 +60,8 @@ rmail-insert-mime-forwarded-message-function w3-meta-content-type-charset-regexp w3m-cid-retrieve-function-alist w3m-current-buffer - w3m-meta-content-type-charset-regexp w3m-mode-map)) + w3m-meta-content-type-charset-regexp w3m-mode-map + url-package-version url-package-name)) (if (featurep 'xemacs) (progn diff --git a/lisp/mm-encode.el b/lisp/mm-encode.el index fa44d45..48afccd 100644 --- a/lisp/mm-encode.el +++ b/lisp/mm-encode.el @@ -30,7 +30,7 @@ (eval-and-compile (autoload 'mm-body-7-or-8 "mm-bodies")) -(defvar mm-content-transfer-encoding-defaults +(defcustom mm-content-transfer-encoding-defaults '(("text/x-patch" 8bit) ("text/.*" qp-or-base64) ("message/rfc822" 8bit) @@ -40,7 +40,15 @@ (".*" base64)) "Alist of regexps that match MIME types and their encodings. If the encoding is `qp-or-base64', then either quoted-printable -or base64 will be used, depending on what is more efficient.") +or base64 will be used, depending on what is more efficient." + :type '(repeat (list (regexp :tag "MIME type") + (choice :tag "encoding" + (const 7bit) + (const 8bit) + (const qp-or-base64) + (const quoted-printable) + (const base64)))) + :group 'mime) (defvar mm-use-ultra-safe-encoding nil "If non-nil, use encodings aimed at Procrustean bed survival. diff --git a/lisp/mm-util.el b/lisp/mm-util.el index 93a595c..fe7afff 100644 --- a/lisp/mm-util.el +++ b/lisp/mm-util.el @@ -271,7 +271,7 @@ Valid elements include: mm-iso-8859-15-compatible)) "A table of the difference character between ISO-8859-X and ISO-8859-15.") -(defvar mm-coding-system-priorities nil +(defcustom mm-coding-system-priorities nil "Preferred coding systems for encoding outgoing mails. More than one suitable coding systems may be found for some texts. By @@ -281,8 +281,10 @@ it overrides the default priority. For example, Japanese users may prefer iso-2022-jp to japanese-shift-jis: \(setq mm-coding-system-priorities - '(iso-2022-jp iso-2022-jp-2 japanese-shift-jis utf-8)) -") + '(iso-2022-jp iso-2022-jp-2 japanese-shift-jis iso-latin-1 utf-8)) +" + :type '(repeat (coding-system :tag "Coding system")) + :group 'mime) (defvar mm-use-find-coding-systems-region (fboundp 'find-coding-systems-region) diff --git a/lisp/mml-sec.el b/lisp/mml-sec.el index 09fec43..bc20511 100644 --- a/lisp/mml-sec.el +++ b/lisp/mml-sec.el @@ -46,6 +46,13 @@ (defvar mml-default-encrypt-method (caar mml-encrypt-alist) "Default encryption method.") +(defvar mml-signencrypt-style + '(("smime" separate) + ("pgp" separate) + ("pgpmime" combined)) + "Alist specifying whether or not a single sign & encrypt +operation should be perfomed when requesting signencrypt.") + ;;; Security functions (defun mml-smime-sign-buffer (cont) @@ -68,8 +75,8 @@ (or (mml2015-sign cont) (error "Signing failed... inspect message logs for errors"))) -(defun mml-pgpmime-encrypt-buffer (cont) - (or (mml2015-encrypt cont) +(defun mml-pgpmime-encrypt-buffer (cont &optional sign) + (or (mml2015-encrypt cont sign) (error "Encryption failed... inspect message logs for errors"))) (defun mml-secure-part (method &optional sign) @@ -174,21 +181,17 @@ If called with a prefix argument, only encrypt (do NOT sign)." (interactive "P") (mml-secure-message "smime" (if dontsign 'encrypt 'signencrypt))) -;;; NOTE: this should be switched to use signencrypt -;;; once it does something sensible (defun mml-secure-message-encrypt-pgp (&optional dontsign) "Add MML tag to encrypt and sign the entire message. If called with a prefix argument, only encrypt (do NOT sign)." (interactive "P") - (mml-secure-message "pgp" (if dontsign 'encrypt 'encrypt))) + (mml-secure-message "pgp" (if dontsign 'encrypt 'signencrypt))) -;;; NOTE: this should be switched to use signencrypt -;;; once it does something sensible (defun mml-secure-message-encrypt-pgpmime (&optional dontsign) "Add MML tag to encrypt and sign the entire message. If called with a prefix argument, only encrypt (do NOT sign)." (interactive "P") - (mml-secure-message "pgpmime" (if dontsign 'encrypt 'encrypt))) + (mml-secure-message "pgpmime" (if dontsign 'encrypt 'signencrypt))) (provide 'mml-sec) diff --git a/lisp/mml.el b/lisp/mml.el index 4eb71c2..0cd49dd 100644 --- a/lisp/mml.el +++ b/lisp/mml.el @@ -530,22 +530,30 @@ If MML is non-nil, return the buffer up till the correspondent mml tag." (insert "\n--" mml-boundary "--\n"))))) (t (error "Invalid element: %S" cont))) - (let ((item (assoc (cdr (assq 'sign cont)) mml-sign-alist)) + ;; handle sign & encrypt tags in a semi-smart way. + (let ((sign-item (assoc (cdr (assq 'sign cont)) mml-sign-alist)) + (encrypt-item (assoc (cdr (assq 'encrypt cont)) + mml-encrypt-alist)) sender recipients) - (when item + (when (or sign-item encrypt-item) (if (setq sender (cdr (assq 'sender cont))) (message-options-set 'message-sender sender)) (if (setq recipients (cdr (assq 'recipients cont))) (message-options-set 'message-recipients recipients)) - (funcall (nth 1 item) cont))) - (let ((item (assoc (cdr (assq 'encrypt cont)) mml-encrypt-alist)) - sender recipients) - (when item - (if (setq sender (cdr (assq 'sender cont))) - (message-options-set 'message-sender sender)) - (if (setq recipients (cdr (assq 'recipients cont))) - (message-options-set 'message-recipients recipients)) - (funcall (nth 1 item) cont)))))) + (let ((style (second (assoc (first sign-item) + mml-signencrypt-style)))) + ;; check if: we're both signing & encrypting, both methods + ;; are the same (why would they be different?!), and that + ;; the signencrypt style allows for combined operation. + (if (and sign-item encrypt-item (equal (first sign-item) + (first encrypt-item)) + (equal style 'combined)) + (funcall (nth 1 encrypt-item) cont t) + ;; otherwise, revert to the old behavior. + (when sign-item + (funcall (nth 1 sign-item) cont)) + (when encrypt-item + (funcall (nth 1 encrypt-item) cont))))))))) (defun mml-compute-boundary (cont) "Return a unique boundary that does not exist in CONT." @@ -1014,7 +1022,9 @@ If RAW, don't highlight the article." (let ((gnus-newsgroup-charset (car message-posting-charset)) gnus-article-prepare-hook gnus-original-article-buffer) (run-hooks 'gnus-article-decode-hook) - (let ((gnus-newsgroup-name "dummy")) + (let ((gnus-newsgroup-name "dummy") + (gnus-newsrc-hashtb (or gnus-newsrc-hashtb + (gnus-make-hashtable 5)))) (gnus-article-prepare-display)))) ;; Disable article-mode-map. (use-local-map nil) diff --git a/lisp/mml1991.el b/lisp/mml1991.el index 49abfd6..a93f9d2 100644 --- a/lisp/mml1991.el +++ b/lisp/mml1991.el @@ -34,7 +34,7 @@ mml1991-mailcrypt-encrypt) (gpg mml1991-gpg-sign mml1991-gpg-encrypt)) - "Alist of PGP/MIME functions.") + "Alist of PGP functions.") ;;; mailcrypt wrapper diff --git a/lisp/mml2015.el b/lisp/mml2015.el index 75af79c..ce71778 100644 --- a/lisp/mml2015.el +++ b/lisp/mml2015.el @@ -352,6 +352,7 @@ by you.") (autoload 'gpg-verify-cleartext "gpg") (autoload 'gpg-sign-detached "gpg") (autoload 'gpg-sign-encrypt "gpg") + (autoload 'gpg-encrypt "gpg") (autoload 'gpg-passphrase-read "gpg")) (defun mml2015-gpg-passphrase () @@ -415,10 +416,13 @@ by you.") (defun mml2015-gpg-extract-signature-details () (goto-char (point-min)) (if (boundp 'gpg-unabbrev-trust-alist) - (let* ((signer (and (re-search-forward - "^\\[GNUPG:\\] GOODSIG [0-9A-Za-z]* \\(.*\\)$" + (let* ((expired (re-search-forward + "^\\[GNUPG:\\] SIGEXPIRED$" + nil t)) + (signer (and (re-search-forward + "^\\[GNUPG:\\] GOODSIG \\([0-9A-Za-z]*\\) \\(.*\\)$" nil t) - (match-string 1))) + (cons (match-string 1) (match-string 2)))) (fprint (and (re-search-forward "^\\[GNUPG:\\] VALIDSIG \\([0-9a-zA-Z]*\\) " nil t) @@ -428,12 +432,16 @@ by you.") (trust-good-enough-p (cdr (assoc (cdr (assoc trust gpg-unabbrev-trust-alist)) mml2015-trust-boundaries-alist)))) - (if (and signer trust fprint) - (concat signer - (unless trust-good-enough-p - (concat "\nUntrusted, Fingerprint: " - (mml2015-gpg-pretty-print-fpr fprint)))) - "From unknown user")) + (cond ((and signer fprint) + (concat (cdr signer) + (unless trust-good-enough-p + (concat "\nUntrusted, Fingerprint: " + (mml2015-gpg-pretty-print-fpr fprint))) + (when expired + (format "\nWARNING: Signature from expired key (%s)" + (car signer))))) + (t + "From unknown user"))) (if (re-search-forward "^gpg: Good signature from \"\\(.*\\)\"$" nil t) (match-string 1) "From unknown user"))) @@ -558,28 +566,42 @@ by you.") (insert (format "--%s--\n" boundary)) (goto-char (point-max))))) -(defun mml2015-gpg-encrypt (cont) +(defun mml2015-gpg-encrypt (cont &optional sign) (let ((boundary (funcall mml-boundary-function (incf mml-multipart-number))) (text (current-buffer)) cipher) (mm-with-unibyte-current-buffer-mule4 (with-temp-buffer - (unless (gpg-sign-encrypt - text (setq cipher (current-buffer)) - mml2015-result-buffer - (split-string - (or - (message-options-get 'message-recipients) - (message-options-set 'message-recipients - (read-string "Recipients: "))) - "[ \f\t\n\r\v,]+") - nil - (message-options-get 'message-sender) - t t) ; armor & textmode - (unless (> (point-max) (point-min)) - (pop-to-buffer mml2015-result-buffer) - (error "Encrypt error"))) + ;; set up a function to call the correct gpg encrypt routine + ;; with the right arguments. (FIXME: this should be done + ;; differently.) + (flet ((gpg-encrypt-func + (sign plaintext ciphertext result recipients &optional + passphrase sign-with-key armor textmode) + (if sign + (gpg-sign-encrypt + plaintext ciphertext result recipients passphrase + sign-with-key armor textmode) + (gpg-encrypt + plaintext ciphertext result recipients passphrase + armor textmode)))) + (unless (gpg-encrypt-func + sign ; passed in when using signencrypt + text (setq cipher (current-buffer)) + mml2015-result-buffer + (split-string + (or + (message-options-get 'message-recipients) + (message-options-set 'message-recipients + (read-string "Recipients: "))) + "[ \f\t\n\r\v,]+") + nil + (message-options-get 'message-sender) + t t) ; armor & textmode + (unless (> (point-max) (point-min)) + (pop-to-buffer mml2015-result-buffer) + (error "Encrypt error")))) (goto-char (point-min)) (while (re-search-forward "\r+$" nil t) (replace-match "" t t)) @@ -640,11 +662,11 @@ by you.") mml2015-use) ;;;###autoload -(defun mml2015-encrypt (cont) +(defun mml2015-encrypt (cont &optional sign) (mml2015-clean-buffer) (let ((func (nth 2 (assq mml2015-use mml2015-function-alist)))) (if func - (funcall func cont) + (funcall func cont sign) (error "Cannot find encrypt function")))) ;;;###autoload diff --git a/lisp/nnfolder.el b/lisp/nnfolder.el index 6c3bfd0..591a0bd 100644 --- a/lisp/nnfolder.el +++ b/lisp/nnfolder.el @@ -549,12 +549,12 @@ the group. Then the marks file will be regenerated properly by Gnus.") (if (not force) () ; Don't delete the articles. ;; Delete the file that holds the group. - (ignore-errors - (delete-file (nnfolder-group-pathname group)) - (when (file-exists-p (nnfolder-group-nov-pathname group)) - (delete-file (nnfolder-group-nov-pathname group))) - (when (file-exists-p (nnfolder-group-marks-pathname group)) - (delete-file (nnfolder-group-marks-pathname group))))) + (let ((data (nnfolder-group-pathname group)) + (nov (nnfolder-group-nov-pathname group)) + (mrk (nnfolder-group-marks-pathname group))) + (ignore-errors (delete-file data)) + (ignore-errors (delete-file nov)) + (ignore-errors (delete-file mrk)))) ;; Remove the group from all structures. (setq nnfolder-group-alist (delq (assoc group nnfolder-group-alist) nnfolder-group-alist) diff --git a/lisp/nnimap.el b/lisp/nnimap.el index 9a2e046..394aefc 100644 --- a/lisp/nnimap.el +++ b/lisp/nnimap.el @@ -379,7 +379,7 @@ restrict visible folders.") ;; Internal variables: -(defvoo nnimap-mailbox-info (gnus-make-hashtable 997)) +(defvar nnimap-mailbox-info (gnus-make-hashtable 997)) (defvar nnimap-debug nil "Name of buffer to record debugging info. For example: (setq nnimap-debug \"*nnimap-debug*\")") @@ -941,6 +941,23 @@ function is generally only called when Gnus is shutting down." ;; Optional backend functions +(defun nnimap-string-lessp-numerical (s1 s2) + "Return t if first arg string is less than second in numerical order." + (cond ((string= s1 s2) + nil) + ((> (length s1) (length s2)) + nil) + ((< (length s1) (length s2)) + t) + ((< (string-to-number (substring s1 0 1)) + (string-to-number (substring s2 0 1))) + t) + ((> (string-to-number (substring s1 0 1)) + (string-to-number (substring s2 0 1))) + nil) + (t + (nnimap-string-lessp-numerical (substring s1 1) (substring s2 1))))) + (deffoo nnimap-retrieve-groups (groups &optional server) (when (nnimap-possibly-change-server server) (gnus-message 5 "nnimap: Checking mailboxes...") @@ -952,7 +969,8 @@ function is generally only called when Gnus is shutting down." (setq slowgroups groups) (dolist (group groups) (gnus-message 7 "nnimap: Checking mailbox %s" group) - (add-to-list (if (gnus-gethash-safe group nnimap-mailbox-info) + (add-to-list (if (gnus-gethash-safe (concat server group) + nnimap-mailbox-info) 'asyncgroups 'slowgroups) (list group (imap-mailbox-status-asynch @@ -962,10 +980,13 @@ function is generally only called when Gnus is shutting down." (tag (nth 1 asyncgroup)) new old) (when (imap-ok-p (imap-wait-for-tag tag nnimap-server-buffer)) - (if (< (car (gnus-gethash group nnimap-mailbox-info)) - (imap-mailbox-get 'uidnext group nnimap-server-buffer)) + (if (nnimap-string-lessp-numerical + (car (gnus-gethash + (concat server group) nnimap-mailbox-info)) + (imap-mailbox-get 'uidnext group nnimap-server-buffer)) (push (list group) slowgroups) - (insert (cdr (gnus-gethash group nnimap-mailbox-info)))))))) + (insert (cdr (gnus-gethash (concat server group) + nnimap-mailbox-info)))))))) (dolist (group slowgroups) (if nnimap-retrieve-groups-asynchronous (setq group (car group))) @@ -984,7 +1005,7 @@ function is generally only called when Gnus is shutting down." (insert str) (when nnimap-retrieve-groups-asynchronous (gnus-sethash - group + (concat server group) (cons (or (imap-mailbox-get 'uidnext group nnimap-server-buffer) (imap-mailbox-status diff --git a/texi/ChangeLog b/texi/ChangeLog index 90f16a5..f2a7dba 100644 --- a/texi/ChangeLog +++ b/texi/ChangeLog @@ -1,3 +1,38 @@ +2002-05-04 Simon Josefsson + + * emacs-mime.texi (Encoding Customization): Fix. + +2002-05-04 Simon Josefsson + + * emacs-mime.texi: Move two chapters "Interface Functions" and + "Basic Functions" after the Decoding and Encoding chapters. (No + text modified.) + +2002-05-04 Simon Josefsson + + * emacs-mime.texi (Top): Change scope of manual to include users. + (Customization): Rename to Display Customization. + (MML Definition): Add cross references. + (Encoding Customization): New section. + (Charset Translation): More info and cross references. + +2002-05-01 Josh Huber + + * gnus.texi (Signing and encrypting): Fix doc. Also, add a + paragraph about replysign/replyencrypt/replysignencryped use. + +2002-05-01 Lars Magne Ingebrigtsen + + * message.texi (Message Headers): Remove colon from index + entries. + +2002-05-01 Simon Josefsson + + * gnus.texi (Group Mail Splitting): Fix example. + (Article Buttons): Document that REGEXP can be a variable as well. + + * message.texi (Message Headers): Fix example. + 2002-04-26 Steve Youngs * Makefile.in (infodir): Set to '@info_dir@' so we can separate diff --git a/texi/emacs-mime.texi b/texi/emacs-mime.texi index 1283422..0ddf342 100644 --- a/texi/emacs-mime.texi +++ b/texi/emacs-mime.texi @@ -77,9 +77,10 @@ license to the document, as described in section 6 of the license. This manual documents the libraries used to compose and display @sc{mime} messages. -This is not a manual meant for users; it's a manual directed at people -who want to write functions and commands that manipulate @sc{mime} -elements. +This manual is directed at users who want to modify the behaviour of +the MIME encoding/decoding process or want a more detailed picture of +how the Emacs MIME library works, and people who want to write +functions and commands that manipulate @sc{mime} elements. @sc{mime} is short for @dfn{Multipurpose Internet Mail Extensions}. This standard is documented in a number of RFCs; mainly RFC2045 (Format @@ -90,1395 +91,1466 @@ recommended that anyone who intends writing @sc{mime}-compliant software read at least RFC2045 and RFC2047. @menu -* Interface Functions:: An abstraction over the basic functions. -* Basic Functions:: Utility and basic parsing functions. * Decoding and Viewing:: A framework for decoding and viewing. * Composing:: MML; a language for describing @sc{mime} parts. +* Interface Functions:: An abstraction over the basic functions. +* Basic Functions:: Utility and basic parsing functions. * Standards:: A summary of RFCs and working documents used. * Index:: Function and variable index. @end menu -@node Interface Functions -@chapter Interface Functions -@cindex interface functions -@cindex mail-parse +@node Decoding and Viewing +@chapter Decoding and Viewing -The @code{mail-parse} library is an abstraction over the actual -low-level libraries that are described in the next chapter. +This chapter deals with decoding and viewing @sc{mime} messages on a +higher level. -Standards change, and so programs have to change to fit in the new -mold. For instance, RFC2045 describes a syntax for the -@code{Content-Type} header that only allows ASCII characters in the -parameter list. RFC2231 expands on RFC2045 syntax to provide a scheme -for continuation headers and non-ASCII characters. +The main idea is to first analyze a @sc{mime} article, and then allow +other programs to do things based on the list of @dfn{handles} that are +returned as a result of this analysis. -The traditional way to deal with this is just to update the library -functions to parse the new syntax. However, this is sometimes the wrong -thing to do. In some instances it may be vital to be able to understand -both the old syntax as well as the new syntax, and if there is only one -library, one must choose between the old version of the library and the -new version of the library. +@menu +* Dissection:: Analyzing a @sc{mime} message. +* Non-MIME:: Analyzing a non-@sc{mime} message. +* Handles:: Handle manipulations. +* Display:: Displaying handles. +* Display Customization:: Variables that affect display. +* New Viewers:: How to write your own viewers. +@end menu -The Emacs @sc{mime} library takes a different tack. It defines a -series of low-level libraries (@file{rfc2047.el}, @file{rfc2231.el} -and so on) that parses strictly according to the corresponding -standard. However, normal programs would not use the functions -provided by these libraries directly, but instead use the functions -provided by the @code{mail-parse} library. The functions in this -library are just aliases to the corresponding functions in the latest -low-level libraries. Using this scheme, programs get a consistent -interface they can use, and library developers are free to create -write code that handles new standards. -The following functions are defined by this library: +@node Dissection +@section Dissection -@table @code -@item mail-header-parse-content-type -@findex mail-header-parse-content-type -Parse a @code{Content-Type} header and return a list on the following -format: +The @code{mm-dissect-buffer} is the function responsible for dissecting +a @sc{mime} article. If given a multipart message, it will recursively +descend the message, following the structure, and return a tree of +@sc{mime} handles that describes the structure of the message. + +@node Non-MIME +@section Non-MIME + +Gnus also understands some non-@sc{mime} attachments, such as +postscript, uuencode, binhex, shar, forward, gnatsweb, pgp. Each of +these features can be disabled by add an item into +@code{mm-uu-configure-list}. For example, @lisp -("type/subtype" - (attribute1 . value1) - (attribute2 . value2) - ...) +(require 'mm-uu) +(add-to-list 'mm-uu-configure-list '(pgp-signed . disabled)) @end lisp -Here's an example: +@table @code +@item postscript +@findex postscript +Postscript file. -@example -(mail-header-parse-content-type - "image/gif; name=\"b980912.gif\"") -@result{} ("image/gif" (name . "b980912.gif")) -@end example +@item uu +@findex uu +Uuencoded file. -@item mail-header-parse-content-disposition -@findex mail-header-parse-content-disposition -Parse a @code{Content-Disposition} header and return a list on the same -format as the function above. +@item binhex +@findex binhex +Binhex encoded file. -@item mail-content-type-get -@findex mail-content-type-get -Takes two parameters---a list on the format above, and an attribute. -Returns the value of the attribute. +@item shar +@findex shar +Shar archive file. -@example -(mail-content-type-get - '("image/gif" (name . "b980912.gif")) 'name) -@result{} "b980912.gif" -@end example +@item forward +@findex forward +Non-@sc{mime} forwarded message. -@item mail-header-encode-parameter -@findex mail-header-encode-parameter -Takes a parameter string and returns an encoded version of the string. -This is used for parameters in headers like @code{Content-Type} and -@code{Content-Disposition}. +@item gnatsweb +@findex gnatsweb +Gnatsweb attachment. -@item mail-header-remove-comments -@findex mail-header-remove-comments -Return a comment-free version of a header. +@item pgp-signed +@findex pgp-signed +PGP signed clear text. -@example -(mail-header-remove-comments - "Gnus/5.070027 (Pterodactyl Gnus v0.27) (Finnish Landrace)") -@result{} "Gnus/5.070027 " -@end example +@item pgp-encrypted +@findex pgp-encrypted +PGP encrypted clear text. -@item mail-header-remove-whitespace -@findex mail-header-remove-whitespace -Remove linear white space from a header. Space inside quoted strings -and comments is preserved. +@item pgp-key +@findex pgp-key +PGP public keys. -@example -(mail-header-remove-whitespace - "image/gif; name=\"Name with spaces\"") -@result{} "image/gif;name=\"Name with spaces\"" -@end example +@item emacs-sources +@findex emacs-sources +Emacs source code. This item works only in the groups matching +@code{mm-uu-emacs-sources-regexp}. -@item mail-header-get-comment -@findex mail-header-get-comment -Return the last comment in a header. +@end table -@example -(mail-header-get-comment - "Gnus/5.070027 (Pterodactyl Gnus v0.27) (Finnish Landrace)") -@result{} "Finnish Landrace" -@end example +@node Handles +@section Handles -@item mail-header-parse-address -@findex mail-header-parse-address -Parse an address and return a list containing the mailbox and the -plaintext name. +A @sc{mime} handle is a list that fully describes a @sc{mime} +component. -@example -(mail-header-parse-address - "Hrvoje Niksic ") -@result{} ("hniksic@@srce.hr" . "Hrvoje Niksic") -@end example +The following macros can be used to access elements in a handle: -@item mail-header-parse-addresses -@findex mail-header-parse-addresses -Parse a string with list of addresses and return a list of elements like -the one described above. +@table @code +@item mm-handle-buffer +@findex mm-handle-buffer +Return the buffer that holds the contents of the undecoded @sc{mime} +part. -@example -(mail-header-parse-addresses - "Hrvoje Niksic , Steinar Bang ") -@result{} (("hniksic@@srce.hr" . "Hrvoje Niksic") - ("sb@@metis.no" . "Steinar Bang")) -@end example +@item mm-handle-type +@findex mm-handle-type +Return the parsed @code{Content-Type} of the part. -@item mail-header-parse-date -@findex mail-header-parse-date -Parse a date string and return an Emacs time structure. +@item mm-handle-encoding +@findex mm-handle-encoding +Return the @code{Content-Transfer-Encoding} of the part. -@item mail-narrow-to-head -@findex mail-narrow-to-head -Narrow the buffer to the header section of the buffer. Point is placed -at the beginning of the narrowed buffer. +@item mm-handle-undisplayer +@findex mm-handle-undisplayer +Return the object that can be used to remove the displayed part (if it +has been displayed). -@item mail-header-narrow-to-field -@findex mail-header-narrow-to-field -Narrow the buffer to the header under point. Understands continuation -headers. +@item mm-handle-set-undisplayer +@findex mm-handle-set-undisplayer +Set the undisplayer object. -@item mail-header-fold-field -@findex mail-header-fold-field -Fold the header under point. +@item mm-handle-disposition +@findex mm-handle-disposition +Return the parsed @code{Content-Disposition} of the part. -@item mail-header-unfold-field -@findex mail-header-unfold-field -Unfold the header under point. +@item mm-handle-disposition +@findex mm-handle-disposition +Return the description of the part. -@item mail-header-field-value -@findex mail-header-field-value -Return the value of the field under point. +@item mm-get-content-id +Returns the handle(s) referred to by @code{Content-ID}. -@item mail-encode-encoded-word-region -@findex mail-encode-encoded-word-region -Encode the non-ASCII words in the region. For instance, -@samp{Naïve} is encoded as @samp{=?iso-8859-1?q?Na=EFve?=}. +@end table -@item mail-encode-encoded-word-buffer -@findex mail-encode-encoded-word-buffer -Encode the non-ASCII words in the current buffer. This function is -meant to be called narrowed to the headers of a message. -@item mail-encode-encoded-word-string -@findex mail-encode-encoded-word-string -Encode the words that need encoding in a string, and return the result. +@node Display +@section Display -@example -(mail-encode-encoded-word-string - "This is naïve, baby") -@result{} "This is =?iso-8859-1?q?na=EFve,?= baby" -@end example +Functions for displaying, removing and saving. -@item mail-decode-encoded-word-region -@findex mail-decode-encoded-word-region -Decode the encoded words in the region. +@table @code +@item mm-display-part +@findex mm-display-part +Display the part. -@item mail-decode-encoded-word-string -@findex mail-decode-encoded-word-string -Decode the encoded words in the string and return the result. +@item mm-remove-part +@findex mm-remove-part +Remove the part (if it has been displayed). -@example -(mail-decode-encoded-word-string - "This is =?iso-8859-1?q?na=EFve,?= baby") -@result{} "This is naïve, baby" -@end example +@item mm-inlinable-p +@findex mm-inlinable-p +Say whether a @sc{mime} type can be displayed inline. -@end table +@item mm-automatic-display-p +@findex mm-automatic-display-p +Say whether a @sc{mime} type should be displayed automatically. -Currently, @code{mail-parse} is an abstraction over @code{ietf-drums}, -@code{rfc2047}, @code{rfc2045} and @code{rfc2231}. These are documented -in the subsequent sections. +@item mm-destroy-part +@findex mm-destroy-part +Free all resources occupied by a part. +@item mm-save-part +@findex mm-save-part +Offer to save the part in a file. +@item mm-pipe-part +@findex mm-pipe-part +Offer to pipe the part to some process. -@node Basic Functions -@chapter Basic Functions +@item mm-interactively-view-part +@findex mm-interactively-view-part +Prompt for a mailcap method to use to view the part. -This chapter describes the basic, ground-level functions for parsing and -handling. Covered here is parsing @code{From} lines, removing comments -from header lines, decoding encoded words, parsing date headers and so -on. High-level functionality is dealt with in the next chapter -(@pxref{Decoding and Viewing}). +@end table -@menu -* rfc2045:: Encoding @code{Content-Type} headers. -* rfc2231:: Parsing @code{Content-Type} headers. -* ietf-drums:: Handling mail headers defined by RFC822bis. -* rfc2047:: En/decoding encoded words in headers. -* time-date:: Functions for parsing dates and manipulating time. -* qp:: Quoted-Printable en/decoding. -* base64:: Base64 en/decoding. -* binhex:: Binhex decoding. -* uudecode:: Uuencode decoding. -* rfc1843:: Decoding HZ-encoded text. -* mailcap:: How parts are displayed is specified by the @file{.mailcap} file -@end menu +@node Display Customization +@section Display Customization -@node rfc2045 -@section rfc2045 +@table @code -RFC2045 is the ``main'' @sc{mime} document, and as such, one would -imagine that there would be a lot to implement. But there isn't, since -most of the implementation details are delegated to the subsequent -RFCs. +@item mm-inline-media-tests +This is an alist where the key is a @sc{mime} type, the second element +is a function to display the part @dfn{inline} (i.e., inside Emacs), and +the third element is a form to be @code{eval}ed to say whether the part +can be displayed inline. -So @file{rfc2045.el} has only a single function: +This variable specifies whether a part @emph{can} be displayed inline, +and, if so, how to do it. It does not say whether parts are +@emph{actually} displayed inline. -@table @code -@item rfc2045-encode-string -@findex rfc2045-encode-string -Takes a parameter and a value and returns a @samp{PARAM=VALUE} string. -@var{value} will be quoted if there are non-safe characters in it. -@end table +@item mm-inlined-types +This, on the other hand, says what types are to be displayed inline, if +they satisfy the conditions set by the variable above. It's a list of +@sc{mime} media types. +@item mm-automatic-display +This is a list of types that are to be displayed ``automatically'', but +only if the above variable allows it. That is, only inlinable parts can +be displayed automatically. -@node rfc2231 -@section rfc2231 +@item mm-attachment-override-types +Some @sc{mime} agents create parts that have a content-disposition of +@samp{attachment}. This variable allows overriding that disposition and +displaying the part inline. (Note that the disposition is only +overridden if we are able to, and want to, display the part inline.) -RFC2231 defines a syntax for the @code{Content-Type} and -@code{Content-Disposition} headers. Its snappy name is @dfn{MIME -Parameter Value and Encoded Word Extensions: Character Sets, Languages, -and Continuations}. +@item mm-discouraged-alternatives +List of @sc{mime} types that are discouraged when viewing +@samp{multipart/alternative}. Viewing agents are supposed to view the +last possible part of a message, as that is supposed to be the richest. +However, users may prefer other types instead, and this list says what +types are most unwanted. If, for instance, @samp{text/html} parts are +very unwanted, and @samp{text/richtech} parts are somewhat unwanted, +you could say something like: -In short, these headers look something like this: +@lisp +(setq mm-discouraged-alternatives + '("text/html" "text/richtext") + mm-automatic-display + (remove "text/html" mm-automatic-display)) +@end lisp -@example -Content-Type: application/x-stuff; - title*0*=us-ascii'en'This%20is%20even%20more%20; - title*1*=%2A%2A%2Afun%2A%2A%2A%20; - title*2="isn't it!" -@end example +@item mm-inline-large-images-p +When displaying inline images that are larger than the window, XEmacs +does not enable scrolling, which means that you cannot see the whole +image. To prevent this, the library tries to determine the image size +before displaying it inline, and if it doesn't fit the window, the +library will display it externally (e.g. with @samp{ImageMagick} or +@samp{xv}). Setting this variable to @code{t} disables this check and +makes the library display all inline images as inline, regardless of +their size. -They usually aren't this bad, though. +@item mm-inline-override-type +@code{mm-inlined-types} may include regular expressions, for example to +specify that all @samp{text/.*} parts be displayed inline. If a user +prefers to have a type that matches such a regular expression be treated +as an attachment, that can be accomplished by setting this variable to a +list containing that type. For example assuming @code{mm-inlined-types} +includes @samp{text/.*}, then including @samp{text/html} in this +variable will cause @samp{text/html} parts to be treated as attachments. -The following functions are defined by this library: +@item mm-inline-text-html-renderer +This selects the function used to render @sc{html}. The predefined +renderers are selected by the symbols @code{w3}, +@code{w3m}@footnote{See @uref{http://emacs-w3m.namazu.org/} for more +information about emacs-w3m}, @code{links}, @code{lynx} or +@code{html2text}. You can also specify a function, which will be +called with a @sc{mime} handle as the argument. -@table @code -@item rfc2231-parse-string -@findex rfc2231-parse-string -Parse a @code{Content-Type} header and return a list describing its -elements. +@item mm-inline-text-html-with-images +Some @sc{html} mails might have the trick of spammers using +@samp{} tags. It is likely to be intended to verify whether you +have read the mail. You can prevent your personal informations from +leaking by setting this option to @code{nil} (which is the default). +It is currently ignored by Emacs/w3. For emacs-w3m, you may use the +command @kbd{t} on the image anchor to show an image even if it is +@code{nil}.@footnote{The command @kbd{T} will load all images. If you +have set the option @code{w3m-key-binding} to @code{info}, use @kbd{i} +or @kbd{I} instead.} -@example -(rfc2231-parse-string - "application/x-stuff; - title*0*=us-ascii'en'This%20is%20even%20more%20; - title*1*=%2A%2A%2Afun%2A%2A%2A%20; - title*2=\"isn't it!\"") -@result{} ("application/x-stuff" - (title . "This is even more ***fun*** isn't it!")) -@end example +@item mm-inline-text-html-with-w3m-keymap +You can use emacs-w3m command keys in the inlined text/html part by +setting this option to non-@code{nil}. The default value is @code{t}. -@item rfc2231-get-value -@findex rfc2231-get-value -Takes one of the lists on the format above and returns -the value of the specified attribute. +@end table -@item rfc2231-encode-string -@findex rfc2231-encode-string -Encode a parameter in headers likes @code{Content-Type} and -@code{Content-Disposition}. -@end table +@node New Viewers +@section New Viewers +Here's an example viewer for displaying @code{text/enriched} inline: -@node ietf-drums -@section ietf-drums +@lisp +(defun mm-display-enriched-inline (handle) + (let (text) + (with-temp-buffer + (mm-insert-part handle) + (save-window-excursion + (enriched-decode (point-min) (point-max)) + (setq text (buffer-string)))) + (mm-insert-inline handle text))) +@end lisp -@dfn{drums} is an IETF working group that is working on the replacement -for RFC822. +We see that the function takes a @sc{mime} handle as its parameter. It +then goes to a temporary buffer, inserts the text of the part, does some +work on the text, stores the result, goes back to the buffer it was +called from and inserts the result. -The functions provided by this library include: +The two important helper functions here are @code{mm-insert-part} and +@code{mm-insert-inline}. The first function inserts the text of the +handle in the current buffer. It handles charset and/or content +transfer decoding. The second function just inserts whatever text you +tell it to insert, but it also sets things up so that the text can be +``undisplayed' in a convenient manner. -@table @code -@item ietf-drums-remove-comments -@findex ietf-drums-remove-comments -Remove the comments from the argument and return the results. -@item ietf-drums-remove-whitespace -@findex ietf-drums-remove-whitespace -Remove linear white space from the string and return the results. -Spaces inside quoted strings and comments are left untouched. +@node Composing +@chapter Composing +@cindex Composing +@cindex MIME Composing +@cindex MML +@cindex MIME Meta Language -@item ietf-drums-get-comment -@findex ietf-drums-get-comment -Return the last most comment from the string. +Creating a @sc{mime} message is boring and non-trivial. Therefore, a +library called @code{mml} has been defined that parses a language called +MML (@sc{mime} Meta Language) and generates @sc{mime} messages. -@item ietf-drums-parse-address -@findex ietf-drums-parse-address -Parse an address string and return a list that contains the mailbox and -the plain text name. +@findex mml-generate-mime +The main interface function is @code{mml-generate-mime}. It will +examine the contents of the current (narrowed-to) buffer and return a +string containing the @sc{mime} message. -@item ietf-drums-parse-addresses -@findex ietf-drums-parse-addresses -Parse a string that contains any number of comma-separated addresses and -return a list that contains mailbox/plain text pairs. +@menu +* Simple MML Example:: An example MML document. +* MML Definition:: All valid MML elements. +* Advanced MML Example:: Another example MML document. +* Encoding Customization:: Variables that affect encoding. +* Charset Translation:: How charsets are mapped from @sc{mule} to @sc{mime}. +* Conversion:: Going from @sc{mime} to MML and vice versa. +* Flowed text:: Soft and hard newlines. +@end menu -@item ietf-drums-parse-date -@findex ietf-drums-parse-date -Parse a date string and return an Emacs time structure. -@item ietf-drums-narrow-to-header -@findex ietf-drums-narrow-to-header -Narrow the buffer to the header section of the current buffer. +@node Simple MML Example +@section Simple MML Example -@end table +Here's a simple @samp{multipart/alternative}: +@example +<#multipart type=alternative> +This is a plain text part. +<#part type=text/enriched> +
This is a centered enriched part
+<#/multipart> +@end example -@node rfc2047 -@section rfc2047 +After running this through @code{mml-generate-mime}, we get this: -RFC2047 (Message Header Extensions for Non-ASCII Text) specifies how -non-ASCII text in headers are to be encoded. This is actually rather -complicated, so a number of variables are necessary to tweak what this -library does. +@example +Content-Type: multipart/alternative; boundary="=-=-=" -The following variables are tweakable: -@table @code -@item rfc2047-default-charset -@vindex rfc2047-default-charset -Characters in this charset should not be decoded by this library. -This defaults to @code{iso-8859-1}. +--=-=-= -@item rfc2047-header-encoding-list -@vindex rfc2047-header-encoding-list -This is an alist of header / encoding-type pairs. Its main purpose is -to prevent encoding of certain headers. -The keys can either be header regexps, or @code{t}. +This is a plain text part. -The values can be either @code{nil}, in which case the header(s) in -question won't be encoded, or @code{mime}, which means that they will be -encoded. +--=-=-= +Content-Type: text/enriched -@item rfc2047-charset-encoding-alist -@vindex rfc2047-charset-encoding-alist -RFC2047 specifies two forms of encoding---@code{Q} (a -Quoted-Printable-like encoding) and @code{B} (base64). This alist -specifies which charset should use which encoding. -@item rfc2047-encoding-function-alist -@vindex rfc2047-encoding-function-alist -This is an alist of encoding / function pairs. The encodings are -@code{Q}, @code{B} and @code{nil}. +
This is a centered enriched part
-@item rfc2047-q-encoding-alist -@vindex rfc2047-q-encoding-alist -The @code{Q} encoding isn't quite the same for all headers. Some -headers allow a narrower range of characters, and that is what this -variable is for. It's an alist of header regexps / allowable character -ranges. +--=-=-=-- +@end example -@item rfc2047-encoded-word-regexp -@vindex rfc2047-encoded-word-regexp -When decoding words, this library looks for matches to this regexp. -@end table +@node MML Definition +@section MML Definition -Those were the variables, and these are this functions: +The MML language is very simple. It looks a bit like an SGML +application, but it's not. -@table @code -@item rfc2047-narrow-to-field -@findex rfc2047-narrow-to-field -Narrow the buffer to the header on the current line. +The main concept of MML is the @dfn{part}. Each part can be of a +different type or use a different charset. The way to delineate a part +is with a @samp{<#part ...>} tag. Multipart parts can be introduced +with the @samp{<#multipart ...>} tag. Parts are ended by the +@samp{<#/part>} or @samp{<#/multipart>} tags. Parts started with the +@samp{<#part ...>} tags are also closed by the next open tag. -@item rfc2047-encode-message-header -@findex rfc2047-encode-message-header -Should be called narrowed to the header of a message. Encodes according -to @code{rfc2047-header-encoding-alist}. +There's also the @samp{<#external ...>} tag. These introduce +@samp{external/message-body} parts. -@item rfc2047-encode-region -@findex rfc2047-encode-region -Encodes all encodable words in the region specified. +Each tag can contain zero or more parameters on the form +@samp{parameter=value}. The values may be enclosed in quotation marks, +but that's not necessary unless the value contains white space. So +@samp{filename=/home/user/#hello$^yes} is perfectly valid. -@item rfc2047-encode-string -@findex rfc2047-encode-string -Encode a string and return the results. +The following parameters have meaning in MML; parameters that have no +meaning are ignored. The MML parameter names are the same as the +@sc{mime} parameter names; the things in the parentheses say which +header it will be used in. -@item rfc2047-decode-region -@findex rfc2047-decode-region -Decode the encoded words in the region. +@table @samp +@item type +The @sc{mime} type of the part (@code{Content-Type}). -@item rfc2047-decode-string -@findex rfc2047-decode-string -Decode a string and return the results. +@item filename +Use the contents of the file in the body of the part +(@code{Content-Disposition}). -@end table +@item charset +The contents of the body of the part are to be encoded in the character +set speficied (@code{Content-Type}). @xref{Charset Translation}. +@item name +Might be used to suggest a file name if the part is to be saved +to a file (@code{Content-Type}). -@node time-date -@section time-date +@item disposition +Valid values are @samp{inline} and @samp{attachment} +(@code{Content-Disposition}). -While not really a part of the @sc{mime} library, it is convenient to -document this library here. It deals with parsing @code{Date} headers -and manipulating time. (Not by using tesseracts, though, I'm sorry to -say.) +@item encoding +Valid values are @samp{7bit}, @samp{8bit}, @samp{quoted-printable} and +@samp{base64} (@code{Content-Transfer-Encoding}). @xref{Charset +Translation}. -These functions convert between five formats: A date string, an Emacs -time structure, a decoded time list, a second number, and a day number. +@item description +A description of the part (@code{Content-Description}). -Here's a bunch of time/date/second/day examples: +@item creation-date +RFC822 date when the part was created (@code{Content-Disposition}). -@example -(parse-time-string "Sat Sep 12 12:21:54 1998 +0200") -@result{} (54 21 12 12 9 1998 6 nil 7200) +@item modification-date +RFC822 date when the part was modified (@code{Content-Disposition}). -(date-to-time "Sat Sep 12 12:21:54 1998 +0200") -@result{} (13818 19266) +@item read-date +RFC822 date when the part was read (@code{Content-Disposition}). -(time-to-seconds '(13818 19266)) -@result{} 905595714.0 +@item recipients +Who to encrypt/sign the part to. This field is used to override any +auto-detection based on the To/CC headers. -(seconds-to-time 905595714.0) -@result{} (13818 19266 0) +@item size +The size (in octets) of the part (@code{Content-Disposition}). -(time-to-days '(13818 19266)) -@result{} 729644 +@item sign +What technology to sign this MML part with (@code{smime}, @code{pgp} +or @code{pgpmime}) -(days-to-time 729644) -@result{} (961933 65536) +@item encrypt +What technology to encrypt this MML part with (@code{smime}, +@code{pgp} or @code{pgpmime}) -(time-since '(13818 19266)) -@result{} (0 430) +@end table -(time-less-p '(13818 19266) '(13818 19145)) -@result{} nil +Parameters for @samp{application/octet-stream}: -(subtract-time '(13818 19266) '(13818 19145)) -@result{} (0 121) +@table @samp +@item type +Type of the part; informal---meant for human readers +(@code{Content-Type}). +@end table -(days-between "Sat Sep 12 12:21:54 1998 +0200" - "Sat Sep 07 12:21:54 1998 +0200") -@result{} 5 +Parameters for @samp{message/external-body}: -(date-leap-year-p 2000) -@result{} t +@table @samp +@item access-type +A word indicating the supported access mechanism by which the file may +be obtained. Values include @samp{ftp}, @samp{anon-ftp}, @samp{tftp}, +@samp{localfile}, and @samp{mailserver}. (@code{Content-Type}.) -(time-to-day-in-year '(13818 19266)) -@result{} 255 +@item expiration +The RFC822 date after which the file may no longer be fetched. +(@code{Content-Type}.) -(time-to-number-of-days - (time-since - (date-to-time "Mon, 01 Jan 2001 02:22:26 GMT"))) -@result{} 4.146122685185185 -@end example +@item size +The size (in octets) of the file. (@code{Content-Type}.) -And finally, we have @code{safe-date-to-time}, which does the same as -@code{date-to-time}, but returns a zero time if the date is -syntactically malformed. +@item permission +Valid values are @samp{read} and @samp{read-write} +(@code{Content-Type}). -The five data representations used are the following: +@end table -@table @var -@item date -An RFC822 (or similar) date string. For instance: @code{"Sat Sep 12 -12:21:54 1998 +0200"}. +Parameters for @samp{sign=smime}: -@item time -An internal Emacs time. For instance: @code{(13818 26466)}. +@table @samp -@item seconds -A floating point representation of the internal Emacs time. For -instance: @code{905595714.0}. +@item keyfile +File containing key and certificate for signer. -@item days -An integer number representing the number of days since 00000101. For -instance: @code{729644}. +@end table + +Parameters for @samp{encrypt=smime}: + +@table @samp + +@item certfile +File containing certificate for recipient. -@item decoded time -A list of decoded time. For instance: @code{(54 21 12 12 9 1998 6 t -7200)}. @end table -All the examples above represent the same moment. -These are the functions available: +@node Advanced MML Example +@section Advanced MML Example + +Here's a complex multipart message. It's a @samp{multipart/mixed} that +contains many parts, one of which is a @samp{multipart/alternative}. + +@example +<#multipart type=mixed> +<#part type=image/jpeg filename=~/rms.jpg disposition=inline> +<#multipart type=alternative> +This is a plain text part. +<#part type=text/enriched name=enriched.txt> +
This is a centered enriched part
+<#/multipart> +This is a new plain text part. +<#part disposition=attachment> +This plain text part is an attachment. +<#/multipart> +@end example + +And this is the resulting @sc{mime} message: + +@example +Content-Type: multipart/mixed; boundary="=-=-=" + + +--=-=-= -@table @code -@item date-to-time -Take a date and return a time. -@item time-to-seconds -Take a time and return seconds. -@item seconds-to-time -Take seconds and return a time. +--=-=-= +Content-Type: image/jpeg; + filename="~/rms.jpg" +Content-Disposition: inline; + filename="~/rms.jpg" +Content-Transfer-Encoding: base64 -@item time-to-days -Take a time and return days. +/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRof +Hh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/wAALCAAwADABAREA/8QAHwAA +AQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQR +BRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RF +RkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ip +qrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/9oACAEB +AAA/AO/rifFHjldNuGsrDa0qcSSHkA+gHrXKw+LtWLrMb+RgTyhbr+HSug07xNqV9fQtZrNI +AyiaE/NuBPOOOP0rvRNE880KOC8TbXXGCv1FPqjrF4LDR7u5L7SkTFT/ALWOP1xXgTuXfc7E +sx6nua6rwp4IvvEM8chCxWxOdzn7wz6V9AaB4S07w9p5itow0rDLSY5Pt9K43xO66P4xs71m +2QXiGCbA4yOVJ9+1aYORkdK434lyNH4ahCnG66VT9Nj15JFbPdX0MS43M4VQf5/yr2vSpLnw +5ZW8dlCZ8KFXjOPX0/mK6rSPEGt3Angu44fNEReHYNvIH3TzXDeKNO8RX+kSX2ouZkicTIOc +L+g7E810ulFjpVtv3bwgB3HJyK5L4quY/C9sVxk3ij/xx6850u7t1mtp/wDlpEw3An3Jr3Dw +34gsbWza4nBlhC5LDsaW6+IFgupQyCF3iHH7gA7c9R9ay7zx6t7aX9jHC4smhfBkGCvHGfrm +tLQ7hbnRrV1GPkAP1x1/Hr+Ncr8Vzjwrbf8AX6v/AKA9eQRyYlQk8Yx9K6XTNbkgia2ciSIn +7p5Ga9Atte0LTLKO6it4i7dVRFJDcZ4PvXN+JvEMF9bILVGXJLSZ4zkjivRPDaeX4b08HOTC +pOffmua+KkbS+GLVUGT9tT/0B68eeIpIFYjB70+OOVXyoOM9+M1eaWeCLzHPyHGO/NVWvJJm +jQ8KGH1NfQWhXSXmh2c8eArRLwO3HSv/2Q== -@item days-to-time -Take days and return a time. +--=-=-= +Content-Type: multipart/alternative; boundary="==-=-=" -@item date-to-day -Take a date and return days. -@item time-to-number-of-days -Take a time and return the number of days that represents. +--==-=-= -@item safe-date-to-time -Take a date and return a time. If the date is not syntactically valid, -return a "zero" date. -@item time-less-p -Take two times and say whether the first time is less (i. e., earlier) -than the second time. +This is a plain text part. -@item time-since -Take a time and return a time saying how long it was since that time. +--==-=-= +Content-Type: text/enriched; + name="enriched.txt" -@item subtract-time -Take two times and subtract the second from the first. I. e., return -the time between the two times. -@item days-between -Take two days and return the number of days between those two days. +
This is a centered enriched part
-@item date-leap-year-p -Take a year number and say whether it's a leap year. +--==-=-=-- -@item time-to-day-in-year -Take a time and return the day number within the year that the time is -in. +--=-=-= -@end table +This is a new plain text part. +--=-=-= +Content-Disposition: attachment -@node qp -@section qp -This library deals with decoding and encoding Quoted-Printable text. +This plain text part is an attachment. -Very briefly explained, qp encoding means translating all 8-bit -characters (and lots of control characters) into things that look like -@samp{=EF}; that is, an equal sign followed by the byte encoded as a hex -string. +--=-=-=-- +@end example -The following functions are defined by the library: +@node Encoding Customization +@section Encoding Customization @table @code -@item quoted-printable-decode-region -@findex quoted-printable-decode-region -QP-decode all the encoded text in the specified region. -@item quoted-printable-decode-string -@findex quoted-printable-decode-string -Decode the QP-encoded text in a string and return the results. +@item mm-body-charset-encoding-alist +@vindex mm-body-charset-encoding-alist +Mapping from MIME charset to encoding to use. This variable is +usually used except, e.g., when other requirements force a specific +encoding (digitally signed messages require 7bit encodings). The +default is @code{((iso-2022-jp . 7bit) (iso-2022-jp-2 . 7bit))}. As +an example, if you do not want to have ISO-8859-1 characters +quoted-printable encoded, you may add @code{(iso-8859-1 . 8bit)} to +this variable. You can override this setting on a per-message basis +by using the @code{encoding} MML tag (@pxref{MML Definition}). + +@item mm-coding-system-priorities +@vindex mm-coding-system-priorities +Prioritize coding systems to use for outgoing messages. The default +is nil, which means to use the defaults in Emacs. It is a list of +coding system symbols (aliases of coding systems does not work, use +@kbd{M-x describe-coding-system} to make sure you are not specifying +an alias in this variable). For example, if you have configured Emacs +to use prefer UTF-8, but wish that outgoing messages should be sent in +ISO-8859-1 if possible, you can set this variable to +@code{(iso-latin-1)}. You can override this setting on a per-message +basis by using the @code{charset} MML tag (@pxref{MML Definition}). + +@item mm-content-transfer-encoding-defaults +@vindex mm-content-transfer-encoding-defaults +Mapping from MIME types to encoding to use. This variable is usually +used except, e.g., when other requirements force a safer encoding +(digitally signed messages require 7bit encoding). Besides the normal +MIME encodings, @code{qp-or-base64} may be used to indicate that for +each case the most efficient of quoted-printable and base64 should be +used. You can override this setting on a per-message basis by using +the @code{encoding} MML tag (@pxref{MML Definition}). + +@item mm-use-ultra-safe-encoding +@vindex mm-use-ultra-safe-encoding +When this is non-nil, it means that textual parts are encoded as +quoted-printable if they contain lines longer than 76 characters or +starting with "From " in the body. Non-7bit encodings (8bit, binary) +are generally disallowed. This reduce the probability that a non-8bit +clean MTA or MDA changes the message. This should never be set +directly, but bound by other functions when necessary (e.g., when +encoding messages that are to be digitally signed). -@item quoted-printable-encode-region -@findex quoted-printable-encode-region -QP-encode all the encodable characters in the specified region. The third -optional parameter @var{fold} specifies whether to fold long lines. -(Long here means 72.) +@end table -@item quoted-printable-encode-string -@findex quoted-printable-encode-string -QP-encode all the encodable characters in a string and return the -results. +@node Charset Translation +@section Charset Translation +@cindex charsets -@end table +During translation from MML to @sc{mime}, for each @sc{mime} part which +has been composed inside Emacs, an appropriate charset has to be chosen. +@vindex mail-parse-charset +If you are running a non-@sc{mule} Emacs, this process is simple: If the +part contains any non-ASCII (8-bit) characters, the @sc{mime} charset +given by @code{mail-parse-charset} (a symbol) is used. (Never set this +variable directly, though. If you want to change the default charset, +please consult the documentation of the package which you use to process +@sc{mime} messages. +@xref{Various Message Variables, , Various Message Variables, message, + Message Manual}, for example.) +If there are only ASCII characters, the @sc{mime} charset US-ASCII is +used, of course. -@node base64 -@section base64 -@cindex base64 +@cindex MULE +@cindex UTF-8 +@cindex Unicode +@vindex mm-mime-mule-charset-alist +Things are slightly more complicated when running Emacs with @sc{mule} +support. In this case, a list of the @sc{mule} charsets used in the +part is obtained, and the @sc{mule} charsets are translated to @sc{mime} +charsets by consulting the variable @code{mm-mime-mule-charset-alist}. +If this results in a single @sc{mime} charset, this is used to encode +the part. But if the resulting list of @sc{mime} charsets contains more +than one element, two things can happen: If it is possible to encode the +part via UTF-8, this charset is used. (For this, Emacs must support +the @code{utf-8} coding system, and the part must consist entirely of +characters which have Unicode counterparts.) If UTF-8 is not available +for some reason, the part is split into several ones, so that each one +can be encoded with a single @sc{mime} charset. The part can only be +split at line boundaries, though---if more than one @sc{mime} charset is +required to encode a single line, it is not possible to encode the part. -Base64 is an encoding that encodes three bytes into four characters, -thereby increasing the size by about 33%. The alphabet used for -encoding is very resistant to mangling during transit. +When running Emacs with @sc{mule} support, the preferences for which +coding system to use is inherited from Emacs itself. This means that +if Emacs is set up to prefer UTF-8, it will be used when encoding +messages. You can modify this by altering the +@code{mm-coding-system-priorities} variable though (@pxref{Encoding +Customization}). -The following functions are defined by this library: +The charset to be used can be overriden by setting the @code{charset} +MML tag (@pxref{MML Definition}) when composing the message. -@table @code -@item base64-encode-region -@findex base64-encode-region -base64 encode the selected region. Return the length of the encoded -text. Optional third argument @var{no-line-break} means do not break -long lines into shorter lines. +The encoding of characters (quoted-printable, 8bit etc) is orthogonal +to the discussion here, and is controlled by the variables +@code{mm-body-charset-encoding-alist} and +@code{mm-content-transfer-encoding-defaults} (@pxref{Encoding +Customization}). -@item base64-encode-string -@findex base64-encode-string -base64 encode a string and return the result. +@node Conversion +@section Conversion -@item base64-decode-region -@findex base64-decode-region -base64 decode the selected region. Return the length of the decoded -text. If the region can't be decoded, return @code{nil} and don't -modify the buffer. +@findex mime-to-mml +A (multipart) @sc{mime} message can be converted to MML with the +@code{mime-to-mml} function. It works on the message in the current +buffer, and substitutes MML markup for @sc{mime} boundaries. +Non-textual parts do not have their contents in the buffer, but instead +have the contents in separate buffers that are referred to from the MML +tags. -@item base64-decode-string -@findex base64-decode-string -base64 decode a string and return the result. If the string can't be -decoded, @code{nil} is returned. +@findex mml-to-mime +An MML message can be converted back to @sc{mime} by the +@code{mml-to-mime} function. -@end table +These functions are in certain senses ``lossy''---you will not get back +an identical message if you run @sc{mime-to-mml} and then +@sc{mml-to-mime}. Not only will trivial things like the order of the +headers differ, but the contents of the headers may also be different. +For instance, the original message may use base64 encoding on text, +while @sc{mml-to-mime} may decide to use quoted-printable encoding, and +so on. +In essence, however, these two functions should be the inverse of each +other. The resulting contents of the message should remain equivalent, +if not identical. -@node binhex -@section binhex -@cindex binhex -@cindex Apple -@cindex Macintosh -@code{binhex} is an encoding that originated in Macintosh environments. -The following function is supplied to deal with these: +@node Flowed text +@section Flowed text +@cindex format=flowed -@table @code -@item binhex-decode-region -@findex binhex-decode-region -Decode the encoded text in the region. If given a third parameter, only -decode the @code{binhex} header and return the filename. +The Emacs @sc{mime} library will respect the @code{use-hard-newlines} +variable (@pxref{Hard and Soft Newlines, ,Hard and Soft Newlines, +emacs, Emacs Manual}) when encoding a message, and the +``format=flowed'' Content-Type parameter when decoding a message. -@end table +On encoding text, lines terminated by soft newline characters are +filled together and wrapped after the column decided by +@code{fill-flowed-encode-column}. This variable controls how the text +will look in a client that does not support flowed text, the default +is to wrap after 66 characters. If hard newline characters are not +present in the buffer, no flow encoding occurs. +On decoding flowed text, lines with soft newline characters are filled +together and wrapped after the column decided by +@code{fill-flowed-display-column}. The default is to wrap after +@code{fill-column}. -@node uudecode -@section uudecode -@cindex uuencode -@cindex uudecode -@code{uuencode} is probably still the most popular encoding of binaries -used on Usenet, although @code{base64} rules the mail world. -The following function is supplied by this package: -@table @code -@item uudecode-decode-region -@findex uudecode-decode-region -Decode the text in the region. -@end table +@node Interface Functions +@chapter Interface Functions +@cindex interface functions +@cindex mail-parse + +The @code{mail-parse} library is an abstraction over the actual +low-level libraries that are described in the next chapter. + +Standards change, and so programs have to change to fit in the new +mold. For instance, RFC2045 describes a syntax for the +@code{Content-Type} header that only allows ASCII characters in the +parameter list. RFC2231 expands on RFC2045 syntax to provide a scheme +for continuation headers and non-ASCII characters. + +The traditional way to deal with this is just to update the library +functions to parse the new syntax. However, this is sometimes the wrong +thing to do. In some instances it may be vital to be able to understand +both the old syntax as well as the new syntax, and if there is only one +library, one must choose between the old version of the library and the +new version of the library. + +The Emacs @sc{mime} library takes a different tack. It defines a +series of low-level libraries (@file{rfc2047.el}, @file{rfc2231.el} +and so on) that parses strictly according to the corresponding +standard. However, normal programs would not use the functions +provided by these libraries directly, but instead use the functions +provided by the @code{mail-parse} library. The functions in this +library are just aliases to the corresponding functions in the latest +low-level libraries. Using this scheme, programs get a consistent +interface they can use, and library developers are free to create +write code that handles new standards. +The following functions are defined by this library: -@node rfc1843 -@section rfc1843 -@cindex rfc1843 -@cindex HZ -@cindex Chinese +@table @code +@item mail-header-parse-content-type +@findex mail-header-parse-content-type +Parse a @code{Content-Type} header and return a list on the following +format: -RFC1843 deals with mixing Chinese and ASCII characters in messages. In -essence, RFC1843 switches between ASCII and Chinese by doing this: +@lisp +("type/subtype" + (attribute1 . value1) + (attribute2 . value2) + ...) +@end lisp + +Here's an example: @example -This sentence is in ASCII. -The next sentence is in GB.~@{<:Ky2;S@{#,NpJ)l6HK!#~@}Bye. +(mail-header-parse-content-type + "image/gif; name=\"b980912.gif\"") +@result{} ("image/gif" (name . "b980912.gif")) @end example -Simple enough, and widely used in China. - -The following functions are available to handle this encoding: +@item mail-header-parse-content-disposition +@findex mail-header-parse-content-disposition +Parse a @code{Content-Disposition} header and return a list on the same +format as the function above. -@table @code -@item rfc1843-decode-region -Decode HZ-encoded text in the region. +@item mail-content-type-get +@findex mail-content-type-get +Takes two parameters---a list on the format above, and an attribute. +Returns the value of the attribute. -@item rfc1843-decode-string -Decode a HZ-encoded string and return the result. +@example +(mail-content-type-get + '("image/gif" (name . "b980912.gif")) 'name) +@result{} "b980912.gif" +@end example -@end table +@item mail-header-encode-parameter +@findex mail-header-encode-parameter +Takes a parameter string and returns an encoded version of the string. +This is used for parameters in headers like @code{Content-Type} and +@code{Content-Disposition}. +@item mail-header-remove-comments +@findex mail-header-remove-comments +Return a comment-free version of a header. -@node mailcap -@section mailcap +@example +(mail-header-remove-comments + "Gnus/5.070027 (Pterodactyl Gnus v0.27) (Finnish Landrace)") +@result{} "Gnus/5.070027 " +@end example -The @file{~/.mailcap} file is parsed by most @sc{mime}-aware message -handlers and describes how elements are supposed to be displayed. -Here's an example file: +@item mail-header-remove-whitespace +@findex mail-header-remove-whitespace +Remove linear white space from a header. Space inside quoted strings +and comments is preserved. @example -image/*; gimp -8 %s -audio/wav; wavplayer %s -application/msword; catdoc %s ; copiousoutput ; nametemplate=%s.doc +(mail-header-remove-whitespace + "image/gif; name=\"Name with spaces\"") +@result{} "image/gif;name=\"Name with spaces\"" @end example -This says that all image files should be displayed with @code{gimp}, -that WAVE audio files should be played by @code{wavplayer}, and that -MS-WORD files should be inlined by @code{catdoc}. - -The @code{mailcap} library parses this file, and provides functions for -matching types. +@item mail-header-get-comment +@findex mail-header-get-comment +Return the last comment in a header. -@table @code -@item mailcap-mime-data -@vindex mailcap-mime-data -This variable is an alist of alists containing backup viewing rules. +@example +(mail-header-get-comment + "Gnus/5.070027 (Pterodactyl Gnus v0.27) (Finnish Landrace)") +@result{} "Finnish Landrace" +@end example -@end table +@item mail-header-parse-address +@findex mail-header-parse-address +Parse an address and return a list containing the mailbox and the +plaintext name. -Interface functions: +@example +(mail-header-parse-address + "Hrvoje Niksic ") +@result{} ("hniksic@@srce.hr" . "Hrvoje Niksic") +@end example -@table @code -@item mailcap-parse-mailcaps -@findex mailcap-parse-mailcaps -Parse the @code{~/.mailcap} file. +@item mail-header-parse-addresses +@findex mail-header-parse-addresses +Parse a string with list of addresses and return a list of elements like +the one described above. -@item mailcap-mime-info -Takes a @sc{mime} type as its argument and returns the matching viewer. +@example +(mail-header-parse-addresses + "Hrvoje Niksic , Steinar Bang ") +@result{} (("hniksic@@srce.hr" . "Hrvoje Niksic") + ("sb@@metis.no" . "Steinar Bang")) +@end example -@end table +@item mail-header-parse-date +@findex mail-header-parse-date +Parse a date string and return an Emacs time structure. +@item mail-narrow-to-head +@findex mail-narrow-to-head +Narrow the buffer to the header section of the buffer. Point is placed +at the beginning of the narrowed buffer. +@item mail-header-narrow-to-field +@findex mail-header-narrow-to-field +Narrow the buffer to the header under point. Understands continuation +headers. +@item mail-header-fold-field +@findex mail-header-fold-field +Fold the header under point. -@node Decoding and Viewing -@chapter Decoding and Viewing +@item mail-header-unfold-field +@findex mail-header-unfold-field +Unfold the header under point. -This chapter deals with decoding and viewing @sc{mime} messages on a -higher level. +@item mail-header-field-value +@findex mail-header-field-value +Return the value of the field under point. -The main idea is to first analyze a @sc{mime} article, and then allow -other programs to do things based on the list of @dfn{handles} that are -returned as a result of this analysis. +@item mail-encode-encoded-word-region +@findex mail-encode-encoded-word-region +Encode the non-ASCII words in the region. For instance, +@samp{Naïve} is encoded as @samp{=?iso-8859-1?q?Na=EFve?=}. -@menu -* Dissection:: Analyzing a @sc{mime} message. -* Non-MIME:: Analyzing a non-@sc{mime} message. -* Handles:: Handle manipulations. -* Display:: Displaying handles. -* Customization:: Variables that affect display. -* New Viewers:: How to write your own viewers. -@end menu +@item mail-encode-encoded-word-buffer +@findex mail-encode-encoded-word-buffer +Encode the non-ASCII words in the current buffer. This function is +meant to be called narrowed to the headers of a message. +@item mail-encode-encoded-word-string +@findex mail-encode-encoded-word-string +Encode the words that need encoding in a string, and return the result. -@node Dissection -@section Dissection +@example +(mail-encode-encoded-word-string + "This is naïve, baby") +@result{} "This is =?iso-8859-1?q?na=EFve,?= baby" +@end example -The @code{mm-dissect-buffer} is the function responsible for dissecting -a @sc{mime} article. If given a multipart message, it will recursively -descend the message, following the structure, and return a tree of -@sc{mime} handles that describes the structure of the message. +@item mail-decode-encoded-word-region +@findex mail-decode-encoded-word-region +Decode the encoded words in the region. -@node Non-MIME -@section Non-MIME +@item mail-decode-encoded-word-string +@findex mail-decode-encoded-word-string +Decode the encoded words in the string and return the result. -Gnus also understands some non-@sc{mime} attachments, such as -postscript, uuencode, binhex, shar, forward, gnatsweb, pgp. Each of -these features can be disabled by add an item into -@code{mm-uu-configure-list}. For example, +@example +(mail-decode-encoded-word-string + "This is =?iso-8859-1?q?na=EFve,?= baby") +@result{} "This is naïve, baby" +@end example -@lisp -(require 'mm-uu) -(add-to-list 'mm-uu-configure-list '(pgp-signed . disabled)) -@end lisp +@end table -@table @code -@item postscript -@findex postscript -Postscript file. +Currently, @code{mail-parse} is an abstraction over @code{ietf-drums}, +@code{rfc2047}, @code{rfc2045} and @code{rfc2231}. These are documented +in the subsequent sections. -@item uu -@findex uu -Uuencoded file. -@item binhex -@findex binhex -Binhex encoded file. -@item shar -@findex shar -Shar archive file. +@node Basic Functions +@chapter Basic Functions -@item forward -@findex forward -Non-@sc{mime} forwarded message. +This chapter describes the basic, ground-level functions for parsing and +handling. Covered here is parsing @code{From} lines, removing comments +from header lines, decoding encoded words, parsing date headers and so +on. High-level functionality is dealt with in the next chapter +(@pxref{Decoding and Viewing}). -@item gnatsweb -@findex gnatsweb -Gnatsweb attachment. +@menu +* rfc2045:: Encoding @code{Content-Type} headers. +* rfc2231:: Parsing @code{Content-Type} headers. +* ietf-drums:: Handling mail headers defined by RFC822bis. +* rfc2047:: En/decoding encoded words in headers. +* time-date:: Functions for parsing dates and manipulating time. +* qp:: Quoted-Printable en/decoding. +* base64:: Base64 en/decoding. +* binhex:: Binhex decoding. +* uudecode:: Uuencode decoding. +* rfc1843:: Decoding HZ-encoded text. +* mailcap:: How parts are displayed is specified by the @file{.mailcap} file +@end menu -@item pgp-signed -@findex pgp-signed -PGP signed clear text. -@item pgp-encrypted -@findex pgp-encrypted -PGP encrypted clear text. +@node rfc2045 +@section rfc2045 -@item pgp-key -@findex pgp-key -PGP public keys. +RFC2045 is the ``main'' @sc{mime} document, and as such, one would +imagine that there would be a lot to implement. But there isn't, since +most of the implementation details are delegated to the subsequent +RFCs. -@item emacs-sources -@findex emacs-sources -Emacs source code. This item works only in the groups matching -@code{mm-uu-emacs-sources-regexp}. +So @file{rfc2045.el} has only a single function: +@table @code +@item rfc2045-encode-string +@findex rfc2045-encode-string +Takes a parameter and a value and returns a @samp{PARAM=VALUE} string. +@var{value} will be quoted if there are non-safe characters in it. @end table -@node Handles -@section Handles -A @sc{mime} handle is a list that fully describes a @sc{mime} -component. +@node rfc2231 +@section rfc2231 -The following macros can be used to access elements in a handle: +RFC2231 defines a syntax for the @code{Content-Type} and +@code{Content-Disposition} headers. Its snappy name is @dfn{MIME +Parameter Value and Encoded Word Extensions: Character Sets, Languages, +and Continuations}. -@table @code -@item mm-handle-buffer -@findex mm-handle-buffer -Return the buffer that holds the contents of the undecoded @sc{mime} -part. +In short, these headers look something like this: -@item mm-handle-type -@findex mm-handle-type -Return the parsed @code{Content-Type} of the part. +@example +Content-Type: application/x-stuff; + title*0*=us-ascii'en'This%20is%20even%20more%20; + title*1*=%2A%2A%2Afun%2A%2A%2A%20; + title*2="isn't it!" +@end example -@item mm-handle-encoding -@findex mm-handle-encoding -Return the @code{Content-Transfer-Encoding} of the part. +They usually aren't this bad, though. -@item mm-handle-undisplayer -@findex mm-handle-undisplayer -Return the object that can be used to remove the displayed part (if it -has been displayed). +The following functions are defined by this library: -@item mm-handle-set-undisplayer -@findex mm-handle-set-undisplayer -Set the undisplayer object. +@table @code +@item rfc2231-parse-string +@findex rfc2231-parse-string +Parse a @code{Content-Type} header and return a list describing its +elements. -@item mm-handle-disposition -@findex mm-handle-disposition -Return the parsed @code{Content-Disposition} of the part. +@example +(rfc2231-parse-string + "application/x-stuff; + title*0*=us-ascii'en'This%20is%20even%20more%20; + title*1*=%2A%2A%2Afun%2A%2A%2A%20; + title*2=\"isn't it!\"") +@result{} ("application/x-stuff" + (title . "This is even more ***fun*** isn't it!")) +@end example -@item mm-handle-disposition -@findex mm-handle-disposition -Return the description of the part. +@item rfc2231-get-value +@findex rfc2231-get-value +Takes one of the lists on the format above and returns +the value of the specified attribute. -@item mm-get-content-id -Returns the handle(s) referred to by @code{Content-ID}. +@item rfc2231-encode-string +@findex rfc2231-encode-string +Encode a parameter in headers likes @code{Content-Type} and +@code{Content-Disposition}. @end table -@node Display -@section Display +@node ietf-drums +@section ietf-drums -Functions for displaying, removing and saving. +@dfn{drums} is an IETF working group that is working on the replacement +for RFC822. -@table @code -@item mm-display-part -@findex mm-display-part -Display the part. +The functions provided by this library include: -@item mm-remove-part -@findex mm-remove-part -Remove the part (if it has been displayed). +@table @code +@item ietf-drums-remove-comments +@findex ietf-drums-remove-comments +Remove the comments from the argument and return the results. -@item mm-inlinable-p -@findex mm-inlinable-p -Say whether a @sc{mime} type can be displayed inline. +@item ietf-drums-remove-whitespace +@findex ietf-drums-remove-whitespace +Remove linear white space from the string and return the results. +Spaces inside quoted strings and comments are left untouched. -@item mm-automatic-display-p -@findex mm-automatic-display-p -Say whether a @sc{mime} type should be displayed automatically. +@item ietf-drums-get-comment +@findex ietf-drums-get-comment +Return the last most comment from the string. -@item mm-destroy-part -@findex mm-destroy-part -Free all resources occupied by a part. +@item ietf-drums-parse-address +@findex ietf-drums-parse-address +Parse an address string and return a list that contains the mailbox and +the plain text name. -@item mm-save-part -@findex mm-save-part -Offer to save the part in a file. +@item ietf-drums-parse-addresses +@findex ietf-drums-parse-addresses +Parse a string that contains any number of comma-separated addresses and +return a list that contains mailbox/plain text pairs. -@item mm-pipe-part -@findex mm-pipe-part -Offer to pipe the part to some process. +@item ietf-drums-parse-date +@findex ietf-drums-parse-date +Parse a date string and return an Emacs time structure. -@item mm-interactively-view-part -@findex mm-interactively-view-part -Prompt for a mailcap method to use to view the part. +@item ietf-drums-narrow-to-header +@findex ietf-drums-narrow-to-header +Narrow the buffer to the header section of the current buffer. @end table -@node Customization -@section Customization - -@table @code - -@item mm-inline-media-tests -This is an alist where the key is a @sc{mime} type, the second element -is a function to display the part @dfn{inline} (i.e., inside Emacs), and -the third element is a form to be @code{eval}ed to say whether the part -can be displayed inline. - -This variable specifies whether a part @emph{can} be displayed inline, -and, if so, how to do it. It does not say whether parts are -@emph{actually} displayed inline. +@node rfc2047 +@section rfc2047 -@item mm-inlined-types -This, on the other hand, says what types are to be displayed inline, if -they satisfy the conditions set by the variable above. It's a list of -@sc{mime} media types. +RFC2047 (Message Header Extensions for Non-ASCII Text) specifies how +non-ASCII text in headers are to be encoded. This is actually rather +complicated, so a number of variables are necessary to tweak what this +library does. -@item mm-automatic-display -This is a list of types that are to be displayed ``automatically'', but -only if the above variable allows it. That is, only inlinable parts can -be displayed automatically. +The following variables are tweakable: -@item mm-attachment-override-types -Some @sc{mime} agents create parts that have a content-disposition of -@samp{attachment}. This variable allows overriding that disposition and -displaying the part inline. (Note that the disposition is only -overridden if we are able to, and want to, display the part inline.) +@table @code +@item rfc2047-default-charset +@vindex rfc2047-default-charset +Characters in this charset should not be decoded by this library. +This defaults to @code{iso-8859-1}. -@item mm-discouraged-alternatives -List of @sc{mime} types that are discouraged when viewing -@samp{multipart/alternative}. Viewing agents are supposed to view the -last possible part of a message, as that is supposed to be the richest. -However, users may prefer other types instead, and this list says what -types are most unwanted. If, for instance, @samp{text/html} parts are -very unwanted, and @samp{text/richtech} parts are somewhat unwanted, -you could say something like: +@item rfc2047-header-encoding-list +@vindex rfc2047-header-encoding-list +This is an alist of header / encoding-type pairs. Its main purpose is +to prevent encoding of certain headers. -@lisp -(setq mm-discouraged-alternatives - '("text/html" "text/richtext") - mm-automatic-display - (remove "text/html" mm-automatic-display)) -@end lisp +The keys can either be header regexps, or @code{t}. -@item mm-inline-large-images-p -When displaying inline images that are larger than the window, XEmacs -does not enable scrolling, which means that you cannot see the whole -image. To prevent this, the library tries to determine the image size -before displaying it inline, and if it doesn't fit the window, the -library will display it externally (e.g. with @samp{ImageMagick} or -@samp{xv}). Setting this variable to @code{t} disables this check and -makes the library display all inline images as inline, regardless of -their size. +The values can be either @code{nil}, in which case the header(s) in +question won't be encoded, or @code{mime}, which means that they will be +encoded. -@item mm-inline-override-type -@code{mm-inlined-types} may include regular expressions, for example to -specify that all @samp{text/.*} parts be displayed inline. If a user -prefers to have a type that matches such a regular expression be treated -as an attachment, that can be accomplished by setting this variable to a -list containing that type. For example assuming @code{mm-inlined-types} -includes @samp{text/.*}, then including @samp{text/html} in this -variable will cause @samp{text/html} parts to be treated as attachments. +@item rfc2047-charset-encoding-alist +@vindex rfc2047-charset-encoding-alist +RFC2047 specifies two forms of encoding---@code{Q} (a +Quoted-Printable-like encoding) and @code{B} (base64). This alist +specifies which charset should use which encoding. -@item mm-inline-text-html-renderer -This selects the function used to render @sc{html}. The predefined -renderers are selected by the symbols @code{w3}, -@code{w3m}@footnote{See @uref{http://emacs-w3m.namazu.org/} for more -information about emacs-w3m}, @code{links}, @code{lynx} or -@code{html2text}. You can also specify a function, which will be -called with a @sc{mime} handle as the argument. +@item rfc2047-encoding-function-alist +@vindex rfc2047-encoding-function-alist +This is an alist of encoding / function pairs. The encodings are +@code{Q}, @code{B} and @code{nil}. -@item mm-inline-text-html-with-images -Some @sc{html} mails might have the trick of spammers using -@samp{} tags. It is likely to be intended to verify whether you -have read the mail. You can prevent your personal informations from -leaking by setting this option to @code{nil} (which is the default). -It is currently ignored by Emacs/w3. For emacs-w3m, you may use the -command @kbd{t} on the image anchor to show an image even if it is -@code{nil}.@footnote{The command @kbd{T} will load all images. If you -have set the option @code{w3m-key-binding} to @code{info}, use @kbd{i} -or @kbd{I} instead.} +@item rfc2047-q-encoding-alist +@vindex rfc2047-q-encoding-alist +The @code{Q} encoding isn't quite the same for all headers. Some +headers allow a narrower range of characters, and that is what this +variable is for. It's an alist of header regexps / allowable character +ranges. -@item mm-inline-text-html-with-w3m-keymap -You can use emacs-w3m command keys in the inlined text/html part by -setting this option to non-@code{nil}. The default value is @code{t}. +@item rfc2047-encoded-word-regexp +@vindex rfc2047-encoded-word-regexp +When decoding words, this library looks for matches to this regexp. @end table +Those were the variables, and these are this functions: -@node New Viewers -@section New Viewers +@table @code +@item rfc2047-narrow-to-field +@findex rfc2047-narrow-to-field +Narrow the buffer to the header on the current line. + +@item rfc2047-encode-message-header +@findex rfc2047-encode-message-header +Should be called narrowed to the header of a message. Encodes according +to @code{rfc2047-header-encoding-alist}. -Here's an example viewer for displaying @code{text/enriched} inline: +@item rfc2047-encode-region +@findex rfc2047-encode-region +Encodes all encodable words in the region specified. -@lisp -(defun mm-display-enriched-inline (handle) - (let (text) - (with-temp-buffer - (mm-insert-part handle) - (save-window-excursion - (enriched-decode (point-min) (point-max)) - (setq text (buffer-string)))) - (mm-insert-inline handle text))) -@end lisp +@item rfc2047-encode-string +@findex rfc2047-encode-string +Encode a string and return the results. -We see that the function takes a @sc{mime} handle as its parameter. It -then goes to a temporary buffer, inserts the text of the part, does some -work on the text, stores the result, goes back to the buffer it was -called from and inserts the result. +@item rfc2047-decode-region +@findex rfc2047-decode-region +Decode the encoded words in the region. -The two important helper functions here are @code{mm-insert-part} and -@code{mm-insert-inline}. The first function inserts the text of the -handle in the current buffer. It handles charset and/or content -transfer decoding. The second function just inserts whatever text you -tell it to insert, but it also sets things up so that the text can be -``undisplayed' in a convenient manner. +@item rfc2047-decode-string +@findex rfc2047-decode-string +Decode a string and return the results. +@end table -@node Composing -@chapter Composing -@cindex Composing -@cindex MIME Composing -@cindex MML -@cindex MIME Meta Language -Creating a @sc{mime} message is boring and non-trivial. Therefore, a -library called @code{mml} has been defined that parses a language called -MML (@sc{mime} Meta Language) and generates @sc{mime} messages. +@node time-date +@section time-date -@findex mml-generate-mime -The main interface function is @code{mml-generate-mime}. It will -examine the contents of the current (narrowed-to) buffer and return a -string containing the @sc{mime} message. +While not really a part of the @sc{mime} library, it is convenient to +document this library here. It deals with parsing @code{Date} headers +and manipulating time. (Not by using tesseracts, though, I'm sorry to +say.) -@menu -* Simple MML Example:: An example MML document. -* MML Definition:: All valid MML elements. -* Advanced MML Example:: Another example MML document. -* Charset Translation:: How charsets are mapped from @sc{mule} to @sc{mime}. -* Conversion:: Going from @sc{mime} to MML and vice versa. -* Flowed text:: Soft and hard newlines. -@end menu +These functions convert between five formats: A date string, an Emacs +time structure, a decoded time list, a second number, and a day number. +Here's a bunch of time/date/second/day examples: -@node Simple MML Example -@section Simple MML Example +@example +(parse-time-string "Sat Sep 12 12:21:54 1998 +0200") +@result{} (54 21 12 12 9 1998 6 nil 7200) -Here's a simple @samp{multipart/alternative}: +(date-to-time "Sat Sep 12 12:21:54 1998 +0200") +@result{} (13818 19266) -@example -<#multipart type=alternative> -This is a plain text part. -<#part type=text/enriched> -
This is a centered enriched part
-<#/multipart> -@end example +(time-to-seconds '(13818 19266)) +@result{} 905595714.0 -After running this through @code{mml-generate-mime}, we get this: +(seconds-to-time 905595714.0) +@result{} (13818 19266 0) -@example -Content-Type: multipart/alternative; boundary="=-=-=" +(time-to-days '(13818 19266)) +@result{} 729644 +(days-to-time 729644) +@result{} (961933 65536) ---=-=-= +(time-since '(13818 19266)) +@result{} (0 430) +(time-less-p '(13818 19266) '(13818 19145)) +@result{} nil -This is a plain text part. +(subtract-time '(13818 19266) '(13818 19145)) +@result{} (0 121) ---=-=-= -Content-Type: text/enriched +(days-between "Sat Sep 12 12:21:54 1998 +0200" + "Sat Sep 07 12:21:54 1998 +0200") +@result{} 5 +(date-leap-year-p 2000) +@result{} t -
This is a centered enriched part
+(time-to-day-in-year '(13818 19266)) +@result{} 255 ---=-=-=-- +(time-to-number-of-days + (time-since + (date-to-time "Mon, 01 Jan 2001 02:22:26 GMT"))) +@result{} 4.146122685185185 @end example +And finally, we have @code{safe-date-to-time}, which does the same as +@code{date-to-time}, but returns a zero time if the date is +syntactically malformed. -@node MML Definition -@section MML Definition +The five data representations used are the following: -The MML language is very simple. It looks a bit like an SGML -application, but it's not. +@table @var +@item date +An RFC822 (or similar) date string. For instance: @code{"Sat Sep 12 +12:21:54 1998 +0200"}. -The main concept of MML is the @dfn{part}. Each part can be of a -different type or use a different charset. The way to delineate a part -is with a @samp{<#part ...>} tag. Multipart parts can be introduced -with the @samp{<#multipart ...>} tag. Parts are ended by the -@samp{<#/part>} or @samp{<#/multipart>} tags. Parts started with the -@samp{<#part ...>} tags are also closed by the next open tag. +@item time +An internal Emacs time. For instance: @code{(13818 26466)}. -There's also the @samp{<#external ...>} tag. These introduce -@samp{external/message-body} parts. +@item seconds +A floating point representation of the internal Emacs time. For +instance: @code{905595714.0}. -Each tag can contain zero or more parameters on the form -@samp{parameter=value}. The values may be enclosed in quotation marks, -but that's not necessary unless the value contains white space. So -@samp{filename=/home/user/#hello$^yes} is perfectly valid. +@item days +An integer number representing the number of days since 00000101. For +instance: @code{729644}. -The following parameters have meaning in MML; parameters that have no -meaning are ignored. The MML parameter names are the same as the -@sc{mime} parameter names; the things in the parentheses say which -header it will be used in. +@item decoded time +A list of decoded time. For instance: @code{(54 21 12 12 9 1998 6 t +7200)}. +@end table -@table @samp -@item type -The @sc{mime} type of the part (@code{Content-Type}). +All the examples above represent the same moment. -@item filename -Use the contents of the file in the body of the part -(@code{Content-Disposition}). +These are the functions available: -@item charset -The contents of the body of the part are to be encoded in the character -set speficied (@code{Content-Type}). +@table @code +@item date-to-time +Take a date and return a time. -@item name -Might be used to suggest a file name if the part is to be saved -to a file (@code{Content-Type}). +@item time-to-seconds +Take a time and return seconds. -@item disposition -Valid values are @samp{inline} and @samp{attachment} -(@code{Content-Disposition}). +@item seconds-to-time +Take seconds and return a time. -@item encoding -Valid values are @samp{7bit}, @samp{8bit}, @samp{quoted-printable} and -@samp{base64} (@code{Content-Transfer-Encoding}). +@item time-to-days +Take a time and return days. -@item description -A description of the part (@code{Content-Description}). +@item days-to-time +Take days and return a time. -@item creation-date -RFC822 date when the part was created (@code{Content-Disposition}). +@item date-to-day +Take a date and return days. -@item modification-date -RFC822 date when the part was modified (@code{Content-Disposition}). +@item time-to-number-of-days +Take a time and return the number of days that represents. -@item read-date -RFC822 date when the part was read (@code{Content-Disposition}). +@item safe-date-to-time +Take a date and return a time. If the date is not syntactically valid, +return a "zero" date. -@item recipients -Who to encrypt/sign the part to. This field is used to override any -auto-detection based on the To/CC headers. +@item time-less-p +Take two times and say whether the first time is less (i. e., earlier) +than the second time. -@item size -The size (in octets) of the part (@code{Content-Disposition}). +@item time-since +Take a time and return a time saying how long it was since that time. -@item sign -What technology to sign this MML part with (@code{smime}, @code{pgp} -or @code{pgpmime}) +@item subtract-time +Take two times and subtract the second from the first. I. e., return +the time between the two times. -@item encrypt -What technology to encrypt this MML part with (@code{smime}, -@code{pgp} or @code{pgpmime}) +@item days-between +Take two days and return the number of days between those two days. -@end table +@item date-leap-year-p +Take a year number and say whether it's a leap year. -Parameters for @samp{application/octet-stream}: +@item time-to-day-in-year +Take a time and return the day number within the year that the time is +in. -@table @samp -@item type -Type of the part; informal---meant for human readers -(@code{Content-Type}). @end table -Parameters for @samp{message/external-body}: -@table @samp -@item access-type -A word indicating the supported access mechanism by which the file may -be obtained. Values include @samp{ftp}, @samp{anon-ftp}, @samp{tftp}, -@samp{localfile}, and @samp{mailserver}. (@code{Content-Type}.) +@node qp +@section qp -@item expiration -The RFC822 date after which the file may no longer be fetched. -(@code{Content-Type}.) +This library deals with decoding and encoding Quoted-Printable text. -@item size -The size (in octets) of the file. (@code{Content-Type}.) +Very briefly explained, qp encoding means translating all 8-bit +characters (and lots of control characters) into things that look like +@samp{=EF}; that is, an equal sign followed by the byte encoded as a hex +string. -@item permission -Valid values are @samp{read} and @samp{read-write} -(@code{Content-Type}). +The following functions are defined by the library: -@end table +@table @code +@item quoted-printable-decode-region +@findex quoted-printable-decode-region +QP-decode all the encoded text in the specified region. -Parameters for @samp{sign=smime}: +@item quoted-printable-decode-string +@findex quoted-printable-decode-string +Decode the QP-encoded text in a string and return the results. -@table @samp +@item quoted-printable-encode-region +@findex quoted-printable-encode-region +QP-encode all the encodable characters in the specified region. The third +optional parameter @var{fold} specifies whether to fold long lines. +(Long here means 72.) -@item keyfile -File containing key and certificate for signer. +@item quoted-printable-encode-string +@findex quoted-printable-encode-string +QP-encode all the encodable characters in a string and return the +results. @end table -Parameters for @samp{encrypt=smime}: - -@table @samp - -@item certfile -File containing certificate for recipient. -@end table +@node base64 +@section base64 +@cindex base64 +Base64 is an encoding that encodes three bytes into four characters, +thereby increasing the size by about 33%. The alphabet used for +encoding is very resistant to mangling during transit. -@node Advanced MML Example -@section Advanced MML Example +The following functions are defined by this library: -Here's a complex multipart message. It's a @samp{multipart/mixed} that -contains many parts, one of which is a @samp{multipart/alternative}. +@table @code +@item base64-encode-region +@findex base64-encode-region +base64 encode the selected region. Return the length of the encoded +text. Optional third argument @var{no-line-break} means do not break +long lines into shorter lines. -@example -<#multipart type=mixed> -<#part type=image/jpeg filename=~/rms.jpg disposition=inline> -<#multipart type=alternative> -This is a plain text part. -<#part type=text/enriched name=enriched.txt> -
This is a centered enriched part
-<#/multipart> -This is a new plain text part. -<#part disposition=attachment> -This plain text part is an attachment. -<#/multipart> -@end example +@item base64-encode-string +@findex base64-encode-string +base64 encode a string and return the result. -And this is the resulting @sc{mime} message: +@item base64-decode-region +@findex base64-decode-region +base64 decode the selected region. Return the length of the decoded +text. If the region can't be decoded, return @code{nil} and don't +modify the buffer. -@example -Content-Type: multipart/mixed; boundary="=-=-=" +@item base64-decode-string +@findex base64-decode-string +base64 decode a string and return the result. If the string can't be +decoded, @code{nil} is returned. +@end table ---=-=-= +@node binhex +@section binhex +@cindex binhex +@cindex Apple +@cindex Macintosh +@code{binhex} is an encoding that originated in Macintosh environments. +The following function is supplied to deal with these: ---=-=-= -Content-Type: image/jpeg; - filename="~/rms.jpg" -Content-Disposition: inline; - filename="~/rms.jpg" -Content-Transfer-Encoding: base64 +@table @code +@item binhex-decode-region +@findex binhex-decode-region +Decode the encoded text in the region. If given a third parameter, only +decode the @code{binhex} header and return the filename. -/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRof -Hh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/wAALCAAwADABAREA/8QAHwAA -AQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQR -BRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RF -RkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ip -qrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/9oACAEB -AAA/AO/rifFHjldNuGsrDa0qcSSHkA+gHrXKw+LtWLrMb+RgTyhbr+HSug07xNqV9fQtZrNI -AyiaE/NuBPOOOP0rvRNE880KOC8TbXXGCv1FPqjrF4LDR7u5L7SkTFT/ALWOP1xXgTuXfc7E -sx6nua6rwp4IvvEM8chCxWxOdzn7wz6V9AaB4S07w9p5itow0rDLSY5Pt9K43xO66P4xs71m -2QXiGCbA4yOVJ9+1aYORkdK434lyNH4ahCnG66VT9Nj15JFbPdX0MS43M4VQf5/yr2vSpLnw -5ZW8dlCZ8KFXjOPX0/mK6rSPEGt3Angu44fNEReHYNvIH3TzXDeKNO8RX+kSX2ouZkicTIOc -L+g7E810ulFjpVtv3bwgB3HJyK5L4quY/C9sVxk3ij/xx6850u7t1mtp/wDlpEw3An3Jr3Dw -34gsbWza4nBlhC5LDsaW6+IFgupQyCF3iHH7gA7c9R9ay7zx6t7aX9jHC4smhfBkGCvHGfrm -tLQ7hbnRrV1GPkAP1x1/Hr+Ncr8Vzjwrbf8AX6v/AKA9eQRyYlQk8Yx9K6XTNbkgia2ciSIn -7p5Ga9Atte0LTLKO6it4i7dVRFJDcZ4PvXN+JvEMF9bILVGXJLSZ4zkjivRPDaeX4b08HOTC -pOffmua+KkbS+GLVUGT9tT/0B68eeIpIFYjB70+OOVXyoOM9+M1eaWeCLzHPyHGO/NVWvJJm -jQ8KGH1NfQWhXSXmh2c8eArRLwO3HSv/2Q== +@end table ---=-=-= -Content-Type: multipart/alternative; boundary="==-=-=" +@node uudecode +@section uudecode +@cindex uuencode +@cindex uudecode ---==-=-= +@code{uuencode} is probably still the most popular encoding of binaries +used on Usenet, although @code{base64} rules the mail world. +The following function is supplied by this package: -This is a plain text part. +@table @code +@item uudecode-decode-region +@findex uudecode-decode-region +Decode the text in the region. +@end table ---==-=-= -Content-Type: text/enriched; - name="enriched.txt" +@node rfc1843 +@section rfc1843 +@cindex rfc1843 +@cindex HZ +@cindex Chinese -
This is a centered enriched part
+RFC1843 deals with mixing Chinese and ASCII characters in messages. In +essence, RFC1843 switches between ASCII and Chinese by doing this: ---==-=-=-- +@example +This sentence is in ASCII. +The next sentence is in GB.~@{<:Ky2;S@{#,NpJ)l6HK!#~@}Bye. +@end example ---=-=-= +Simple enough, and widely used in China. -This is a new plain text part. +The following functions are available to handle this encoding: ---=-=-= -Content-Disposition: attachment +@table @code +@item rfc1843-decode-region +Decode HZ-encoded text in the region. +@item rfc1843-decode-string +Decode a HZ-encoded string and return the result. -This plain text part is an attachment. +@end table ---=-=-=-- -@end example -@node Charset Translation -@section Charset Translation -@cindex charsets +@node mailcap +@section mailcap -During translation from MML to @sc{mime}, for each @sc{mime} part which -has been composed inside Emacs, an appropriate charset has to be chosen. +The @file{~/.mailcap} file is parsed by most @sc{mime}-aware message +handlers and describes how elements are supposed to be displayed. +Here's an example file: -@vindex mail-parse-charset -If you are running a non-@sc{mule} Emacs, this process is simple: If the -part contains any non-ASCII (8-bit) characters, the @sc{mime} charset -given by @code{mail-parse-charset} (a symbol) is used. (Never set this -variable directly, though. If you want to change the default charset, -please consult the documentation of the package which you use to process -@sc{mime} messages. -@xref{Various Message Variables, , Various Message Variables, message, - Message Manual}, for example.) -If there are only ASCII characters, the @sc{mime} charset US-ASCII is -used, of course. +@example +image/*; gimp -8 %s +audio/wav; wavplayer %s +application/msword; catdoc %s ; copiousoutput ; nametemplate=%s.doc +@end example -@cindex MULE -@cindex UTF-8 -@cindex Unicode -@vindex mm-mime-mule-charset-alist -Things are slightly more complicated when running Emacs with @sc{mule} -support. In this case, a list of the @sc{mule} charsets used in the -part is obtained, and the @sc{mule} charsets are translated to @sc{mime} -charsets by consulting the variable @code{mm-mime-mule-charset-alist}. -If this results in a single @sc{mime} charset, this is used to encode -the part. But if the resulting list of @sc{mime} charsets contains more -than one element, two things can happen: If it is possible to encode the -part via UTF-8, this charset is used. (For this, Emacs must support -the @code{utf-8} coding system, and the part must consist entirely of -characters which have Unicode counterparts.) If UTF-8 is not available -for some reason, the part is split into several ones, so that each one -can be encoded with a single @sc{mime} charset. The part can only be -split at line boundaries, though---if more than one @sc{mime} charset is -required to encode a single line, it is not possible to encode the part. +This says that all image files should be displayed with @code{gimp}, +that WAVE audio files should be played by @code{wavplayer}, and that +MS-WORD files should be inlined by @code{catdoc}. -@node Conversion -@section Conversion +The @code{mailcap} library parses this file, and provides functions for +matching types. -@findex mime-to-mml -A (multipart) @sc{mime} message can be converted to MML with the -@code{mime-to-mml} function. It works on the message in the current -buffer, and substitutes MML markup for @sc{mime} boundaries. -Non-textual parts do not have their contents in the buffer, but instead -have the contents in separate buffers that are referred to from the MML -tags. +@table @code +@item mailcap-mime-data +@vindex mailcap-mime-data +This variable is an alist of alists containing backup viewing rules. -@findex mml-to-mime -An MML message can be converted back to @sc{mime} by the -@code{mml-to-mime} function. +@end table -These functions are in certain senses ``lossy''---you will not get back -an identical message if you run @sc{mime-to-mml} and then -@sc{mml-to-mime}. Not only will trivial things like the order of the -headers differ, but the contents of the headers may also be different. -For instance, the original message may use base64 encoding on text, -while @sc{mml-to-mime} may decide to use quoted-printable encoding, and -so on. +Interface functions: -In essence, however, these two functions should be the inverse of each -other. The resulting contents of the message should remain equivalent, -if not identical. +@table @code +@item mailcap-parse-mailcaps +@findex mailcap-parse-mailcaps +Parse the @code{~/.mailcap} file. +@item mailcap-mime-info +Takes a @sc{mime} type as its argument and returns the matching viewer. -@node Flowed text -@section Flowed text -@cindex format=flowed +@end table -The Emacs @sc{mime} library will respect the @code{use-hard-newlines} -variable (@pxref{Hard and Soft Newlines, ,Hard and Soft Newlines, -emacs, Emacs Manual}) when encoding a message, and the -``format=flowed'' Content-Type parameter when decoding a message. -On encoding text, lines terminated by soft newline characters are -filled together and wrapped after the column decided by -@code{fill-flowed-encode-column}. This variable controls how the text -will look in a client that does not support flowed text, the default -is to wrap after 66 characters. If hard newline characters are not -present in the buffer, no flow encoding occurs. -On decoding flowed text, lines with soft newline characters are filled -together and wrapped after the column decided by -@code{fill-flowed-display-column}. The default is to wrap after -@code{fill-column}. @node Standards @chapter Standards diff --git a/texi/gnus-ja.texi b/texi/gnus-ja.texi index a829ebb..923d2d7 100644 --- a/texi/gnus-ja.texi +++ b/texi/gnus-ja.texi @@ -8206,7 +8206,8 @@ Gnus $B$O%G%#%U%)%k%H$GFCDj$NI8=`$N;2>H$K(B@dfn{$B%\%?%s(B}$B$rIU$1$^$9(B: @item regexp $B$3$N@55,I=8=(B (regexp) $B$K9gCW$9$k$9$Y$F$NJ8$O30It;2>H$G$"$k$H$_$J$5$l$^$9!#(B $B$3$l$OKd$a9~$^$l$?(B URL $B$K9gCW$9$kE57?E*$J@55,I=8=$G(B -$B$9(B @samp{]*\\)>}$B!#(B +$B$9(B @samp{]*\\)>}$B!#$3$l$O$^$?@55,I=8=$NCM$r;}$DJQ?t$G$"$C(B +$B$F$b$h$/!"M-MQ$JJQ?t$H$7$F(B @code{gnus-button-url-regexp} $B$,$"$j$^$9!#(B @item button-par Gnus $B$O9gCW$7$?$b$N$N$I$NItJ,$,%O%$%i%$%H$5$l$k$N$+$rCN$i$J$1$l$P$J$j$^(B @@ -10631,6 +10632,14 @@ For PGP, Gnus supports two external libraries, @sc{gpg.el} and @sc{Mailcrypt}, you need to install at least one of them. The @sc{s/mime} support in Gnus requires the external program OpenSSL. +Often, you would like to sign replies to people who send you signed +messages. Even more often, you might want to encrypt messages which +are in reply to encrypted messages. Gnus offers +@code{gnus-message-replysign} to enable the former, and +@code{gnus-message-replyencrypt} for the latter. In addition, setting +@code{gnus-message-replysignencrypted} (on by default) will sign +automatically encrypted messages. + Instructing MML to perform security operations on a @sc{mime} part is done using the @kbd{C-c C-m s} key map for signing and the @kbd{C-c C-m c} key map for encryption, as follows. @@ -10639,39 +10648,39 @@ C-m c} key map for encryption, as follows. @item C-c C-m s s @kindex C-c C-m s s -@findex mml-secure-sign-smime +@findex mml-secure-message-sign-smime -Digitally sign current @sc{mime} part using @sc{s/mime}. +Digitally sign current message using @sc{s/mime}. @item C-c C-m s o @kindex C-c C-m s o -@findex mml-secure-sign-pgp +@findex mml-secure-message-sign-pgp -Digitally sign current @sc{mime} part using PGP. +Digitally sign current message using PGP. @item C-c C-m s p @kindex C-c C-m s p -@findex mml-secure-sign-pgp +@findex mml-secure-message-sign-pgp -Digitally sign current @sc{mime} part using @sc{pgp/mime}. +Digitally sign current message using @sc{pgp/mime}. @item C-c C-m c s @kindex C-c C-m c s -@findex mml-secure-encrypt-smime +@findex mml-secure-message-encrypt-smime -Digitally encrypt current @sc{mime} part using @sc{s/mime}. +Digitally encrypt current message using @sc{s/mime}. @item C-c C-m c o @kindex C-c C-m c o -@findex mml-secure-encrypt-pgp +@findex mml-secure-message-encrypt-pgp -Digitally encrypt current @sc{mime} part using PGP. +Digitally encrypt current message using PGP. @item C-c C-m c p @kindex C-c C-m c p -@findex mml-secure-encrypt-pgpmime +@findex mml-secure-message-encrypt-pgpmime -Digitally encrypt current @sc{mime} part using @sc{pgp/mime}. +Digitally encrypt current message using @sc{pgp/mime}. @item C-c C-m C-n @kindex C-c C-m C-n @@ -12694,7 +12703,7 @@ nnml:mail.others: $B%W$@$1$K;H$&$3$H$,$G$-$^$9!#(B @lisp -(: gnus-mlsplt-fancy GROUPS NO-CROSSPOST CATCH-ALL) +(: gnus-group-split-fancy GROUPS NO-CROSSPOST CATCH-ALL) @end lisp @var{groups} $B$O=PNO$NJ,3d$r@8@.$9$k$?$a$K%Q%i%a!<%?$,Av::$5$l$k%0%k!<%W(B diff --git a/texi/gnus.texi b/texi/gnus.texi index caa7442..35ba3d7 100644 --- a/texi/gnus.texi +++ b/texi/gnus.texi @@ -8345,7 +8345,8 @@ This is an alist where each entry has this form: @item regexp All text that match this regular expression will be considered an external reference. Here's a typical regexp that matches embedded URLs: -@samp{]*\\)>}. +@samp{]*\\)>}. This can also be a variable containing a +regexp, useful variables to use include @code{gnus-button-url-regexp}. @item button-par Gnus has to know which parts of the matches is to be highlighted. This @@ -11132,6 +11133,14 @@ For PGP, Gnus supports two external libraries, @sc{gpg.el} and @sc{Mailcrypt}, you need to install at least one of them. The @sc{s/mime} support in Gnus requires the external program OpenSSL. +Often, you would like to sign replies to people who send you signed +messages. Even more often, you might want to encrypt messages which +are in reply to encrypted messages. Gnus offers +@code{gnus-message-replysign} to enable the former, and +@code{gnus-message-replyencrypt} for the latter. In addition, setting +@code{gnus-message-replysignencrypted} (on by default) will sign +automatically encrypted messages. + Instructing MML to perform security operations on a @sc{mime} part is done using the @kbd{C-c C-m s} key map for signing and the @kbd{C-c C-m c} key map for encryption, as follows. @@ -11140,39 +11149,39 @@ C-m c} key map for encryption, as follows. @item C-c C-m s s @kindex C-c C-m s s -@findex mml-secure-sign-smime +@findex mml-secure-message-sign-smime -Digitally sign current @sc{mime} part using @sc{s/mime}. +Digitally sign current message using @sc{s/mime}. @item C-c C-m s o @kindex C-c C-m s o -@findex mml-secure-sign-pgp +@findex mml-secure-message-sign-pgp -Digitally sign current @sc{mime} part using PGP. +Digitally sign current message using PGP. @item C-c C-m s p @kindex C-c C-m s p -@findex mml-secure-sign-pgp +@findex mml-secure-message-sign-pgp -Digitally sign current @sc{mime} part using @sc{pgp/mime}. +Digitally sign current message using @sc{pgp/mime}. @item C-c C-m c s @kindex C-c C-m c s -@findex mml-secure-encrypt-smime +@findex mml-secure-message-encrypt-smime -Digitally encrypt current @sc{mime} part using @sc{s/mime}. +Digitally encrypt current message using @sc{s/mime}. @item C-c C-m c o @kindex C-c C-m c o -@findex mml-secure-encrypt-pgp +@findex mml-secure-message-encrypt-pgp -Digitally encrypt current @sc{mime} part using PGP. +Digitally encrypt current message using PGP. @item C-c C-m c p @kindex C-c C-m c p -@findex mml-secure-encrypt-pgpmime +@findex mml-secure-message-encrypt-pgpmime -Digitally encrypt current @sc{mime} part using @sc{pgp/mime}. +Digitally encrypt current message using @sc{pgp/mime}. @item C-c C-m C-n @kindex C-c C-m C-n @@ -13272,7 +13281,7 @@ may use it for only some of them, by using @code{nnmail-split-fancy} splits like this: @lisp -(: gnus-mlsplt-fancy GROUPS NO-CROSSPOST CATCH-ALL) +(: gnus-group-split-fancy GROUPS NO-CROSSPOST CATCH-ALL) @end lisp @var{groups} may be a regular expression or a list of group names whose diff --git a/texi/message-ja.texi b/texi/message-ja.texi index 5c8d1c8..d17fe3a 100644 --- a/texi/message-ja.texi +++ b/texi/message-ja.texi @@ -1148,9 +1148,9 @@ Message $B$O%a%C%;!<%8:n@.ItJ,$K4X$7$F$OHs>o$K@Q6KE*$G$9!#$=$l$Oo$K@Q6KE*$G$9!#$=$l$O