Sync up with remi-1_6_0.
[elisp/semi.git] / mime-edit.el
index 4952369..4924c8d 100644 (file)
@@ -1,16 +1,15 @@
 ;;; mime-edit.el --- Simple MIME Composer for GNU Emacs
 
-;; Copyright (C) 1993,1994,1995,1996,1997 Free Software Foundation, Inc.
+;; Copyright (C) 1993,1994,1995,1996,1997,1998 Free Software Foundation, Inc.
 
 ;; Author: UMEDA Masanobu <umerin@mse.kyutech.ac.jp>
 ;;         MORIOKA Tomohiko <morioka@jaist.ac.jp>
 ;; Maintainer: MORIOKA Tomohiko <morioka@jaist.ac.jp>
 ;; Created: 1994/08/21 renamed from mime.el
 ;;     Renamed: 1997/2/21 from tm-edit.el
-;; Version: $Revision: 0.81 $
 ;; Keywords: MIME, multimedia, multilingual, mail, news
 
-;; This file is part of SEMI (SEMI is Emacs MIME Interfaces).
+;; This file is part of SEMI (Sophisticated Emacs MIME Interfaces).
 
 ;; This program is free software; you can redistribute it and/or
 ;; modify it under the terms of the GNU General Public License as
@@ -92,7 +91,7 @@
 ;;
 ;; This is a conventional plain text.  It should be translated into
 ;; text/plain.
-;; 
+;;
 ;;--[[text/plain]]
 ;; This is also a plain text.  But, it is explicitly specified as is.
 ;;--[[text/plain; charset=ISO-8859-1]]
 ;;; @ version
 ;;;
 
-(defconst mime-edit-RCS-ID
-  "$Id: mime-edit.el,v 0.81 1997-05-27 03:12:56 morioka Exp $")
-
-(defconst mime-edit-version (get-version-string mime-edit-RCS-ID))
-
-(defconst mime-edit-version-name
-  (concat "SEMI MIME-Edit " mime-edit-version))
+(defconst mime-edit-version-string
+  `,(concat (car mime-module-version) " "
+           (mapconcat #'number-to-string (cddr mime-module-version) ".")
+           " - \"" (cadr mime-module-version) "\""))
 
 
 ;;; @ variables
 ;;;
 
-(defvar mime-ignore-preceding-spaces nil
-  "*Ignore preceding white spaces if non-nil.")
+(defgroup mime-edit nil
+  "MIME edit mode"
+  :group 'mime)
+
+(defcustom mime-ignore-preceding-spaces nil
+  "*Ignore preceding white spaces if non-nil."
+  :group 'mime-edit
+  :type 'boolean)
 
-(defvar mime-ignore-trailing-spaces nil
-  "*Ignore trailing white spaces if non-nil.")
+(defcustom mime-ignore-trailing-spaces nil
+  "*Ignore trailing white spaces if non-nil."
+  :group 'mime-edit
+  :type 'boolean)
 
-(defvar mime-ignore-same-text-tag t
+(defcustom mime-ignore-same-text-tag t
   "*Ignore preceding text content-type tag that is same with new one.
-If non-nil, the text tag is not inserted unless something different.")
+If non-nil, the text tag is not inserted unless something different."
+  :group 'mime-edit
+  :type 'boolean)
 
-(defvar mime-auto-hide-body t
-  "*Hide non-textual body encoded in base64 after insertion if non-nil.")
+(defcustom mime-auto-hide-body t
+  "*Hide non-textual body encoded in base64 after insertion if non-nil."
+  :group 'mime-edit
+  :type 'boolean)
 
-(defvar mime-edit-voice-recorder
+(defcustom mime-edit-voice-recorder
   (function mime-edit-voice-recorder-for-sun)
-  "*Function to record a voice message and encode it. [mime-edit.el]")
+  "*Function to record a voice message and encode it."
+  :group 'mime-edit
+  :type 'function)
 
-(defvar mime-edit-mode-hook nil
-  "*Hook called when enter MIME mode.")
+(defcustom mime-edit-mode-hook nil
+  "*Hook called when enter MIME mode."
+  :group 'mime-edit
+  :type 'hook)
 
-(defvar mime-edit-translate-hook nil
+(defcustom mime-edit-translate-hook nil
   "*Hook called before translating into a MIME compliant message.
 To insert a signature file automatically, call the function
-`mime-edit-insert-signature' from this hook.")
+`mime-edit-insert-signature' from this hook."
+  :group 'mime-edit
+  :type 'hook)
 
-(defvar mime-edit-exit-hook nil
-  "*Hook called when exit MIME mode.")
+(defcustom mime-edit-exit-hook nil
+  "*Hook called when exit MIME mode."
+  :group 'mime-edit
+  :type 'hook)
 
 (defvar mime-content-types
   '(("text"
@@ -221,8 +237,18 @@ To insert a signature file automatically, call the function
     )
   "*Alist of content-type, subtype, parameters and its values.")
 
-(defvar mime-file-types
-  '(("\\.rtf$"
+(defcustom mime-file-types
+  '(("\\.txt$"
+     "text"    "plain"         nil
+     nil
+     "inline"          (("filename" . file))
+     )
+    ("\\.pln$"
+     "text"    "plain"         nil
+     nil
+     "inline"          (("filename" . file))
+     )
+    ("\\.rtf$"
      "text"    "richtext"      nil
      nil
      nil               nil)
@@ -346,15 +372,56 @@ To insert a signature file automatically, call the function
      "attachment"      (("filename" . file))
      )
     ("\\.signature"
-     "text"    "plain"         nil     nil)
+     "text"    "plain"         nil     nil     nil     nil)
     (".*"
      "application" "octet-stream" nil
      nil
-     "attachment"      (("filename" . file))
-     )
+     "attachment"      (("filename" . file)))
     )
   "*Alist of file name, types, parameters, and default encoding.
-If encoding is nil, it is determined from its contents.")
+If encoding is nil, it is determined from its contents."
+  :type `(repeat
+         (list regexp
+               ;; primary-type
+               (choice :tag "Primary-Type"
+                       ,@(nconc (mapcar (lambda (cell)
+                                          (list 'item (car cell))
+                                          )
+                                        mime-content-types)
+                                '(string)))
+               ;; subtype
+               (choice :tag "Sub-Type"
+                       ,@(nconc
+                          (apply #'nconc
+                                 (mapcar (lambda (cell)
+                                           (mapcar (lambda (cell)
+                                                     (list 'item (car cell))
+                                                     )
+                                                   (cdr cell)))
+                                         mime-content-types))
+                          '(string)))
+               ;; parameters
+               (repeat :tag "Parameters of Content-Type field"
+                       (cons string (choice string symbol)))
+               ;; content-transfer-encoding
+               (choice :tag "Encoding"
+                       ,@(cons
+                          '(const nil)
+                          (mapcar (lambda (cell)
+                                    (list 'item (car cell))
+                                    )
+                                  mime-file-encoding-method-alist)))
+               ;; disposition-type
+               (choice :tag "Disposition-Type"
+                       (item nil)
+                       (item "inline")
+                       (item "attachment")
+                       string)
+               ;; parameters
+               (repeat :tag "Parameters of Content-Disposition field"
+                       (cons string (choice string symbol)))
+               ))
+  :group 'mime-edit)
 
 
 ;;; @@ about charset, encoding and transfer-level
@@ -374,10 +441,11 @@ If encoding is nil, it is determined from its contents.")
     (iso-2022-jp       7 "base64")
     (iso-2022-kr       7 "base64")
     (euc-kr            8 "base64")
-    (cn-gb2312         8 "quoted-printable")
+    (cn-gb2312         8 "base64")
+    (gb2312            8 "base64")
     (cn-big5           8 "base64")
-    (gb2312            8 "quoted-printable")
     (big5              8 "base64")
+    (shift_jis         8 "base64")
     (iso-2022-jp-2     7 "base64")
     (iso-2022-int-1    7 "base64")
     ))
@@ -397,23 +465,6 @@ If encoding is nil, it is determined from its contents.")
   "A string formatted version of mime-transfer-level")
 (make-variable-buffer-local 'mime-transfer-level-string)
 
-(defun mime-make-charset-default-encoding-alist (transfer-level)
-  (mapcar (function
-          (lambda (charset-type)
-            (let ((charset  (car charset-type))
-                  (type     (nth 1 charset-type))
-                  (encoding (nth 2 charset-type))
-                  )
-              (if (<= type transfer-level)
-                  (cons charset (mime-encoding-name type))
-                (cons charset encoding)
-                ))))
-         mime-charset-type-list))
-
-(defvar mime-edit-charset-default-encoding-alist
-  (mime-make-charset-default-encoding-alist mime-transfer-level))
-(make-variable-buffer-local 'mime-edit-charset-default-encoding-alist)
-
 
 ;;; @@ about message inserting
 ;;;
@@ -423,7 +474,7 @@ If encoding is nil, it is determined from its contents.")
     "Xref" "X-UIDL" "X-Filter" "X-Gnus-.*" "X-VM-.*")
   "Delete these fields from original message when it is inserted
 as message/rfc822 part.
-Each elements are regexp of field-name. [mime-edit.el]")
+Each elements are regexp of field-name.")
 
 (defvar mime-edit-yank-ignored-field-regexp
   (concat "^"
@@ -437,20 +488,26 @@ Each elements are regexp of field-name. [mime-edit.el]")
 ;;; @@ about message splitting
 ;;;
 
-(defvar mime-edit-split-message t
-  "*Split large message if it is non-nil. [mime-edit.el]")
+(defcustom mime-edit-split-message t
+  "*Split large message if it is non-nil."
+  :group 'mime-edit
+  :type 'boolean)
 
-(defvar mime-edit-message-default-max-lines 1000
-  "*Default maximum lines of a message. [mime-edit.el]")
+(defcustom mime-edit-message-default-max-lines 1000
+  "*Default maximum lines of a message."
+  :group 'mime-edit
+  :type 'integer)
 
-(defvar mime-edit-message-max-lines-alist
+(defcustom mime-edit-message-max-lines-alist
   '((news-reply-mode . 500))
   "Alist of major-mode vs maximum lines of a message.
 If it is not specified for a major-mode,
-`mime-edit-message-default-max-lines' is used. [mime-edit.el]")
+`mime-edit-message-default-max-lines' is used."
+  :group 'mime-edit
+  :type 'list)
 
 (defconst mime-edit-split-ignored-field-regexp
-  "\\(^Content-\\|^Subject:\\|^Mime-Version:\\)")
+  "\\(^Content-\\|^Subject:\\|^Mime-Version:\\|Message-Id:\\)")
 
 (defvar mime-edit-split-blind-field-regexp
   "\\(^[BDFbdf]cc:\\|^cc:[ \t]*$\\)")
@@ -460,16 +517,6 @@ If it is not specified for a major-mode,
 (defvar mime-edit-news-reply-mode-server-running nil)
 
 
-;;; @@ about PGP
-;;;
-
-(defvar mime-edit-signing-type 'pgp-elkins
-  "*PGP signing type (pgp-elkins, pgp-kazu or nil). [mime-edit.el]")
-
-(defvar mime-edit-encrypting-type 'pgp-elkins
-  "*PGP encrypting type (pgp-elkins, pgp-kazu or nil). [mime-edit.el]")
-
-
 ;;; @@ about tag
 ;;;
 
@@ -518,17 +565,27 @@ If it is not specified for a major-mode,
   "*If non-nil, insert X-Emacs header field.")
 
 (defvar mime-edit-x-emacs-value
-  (if running-xemacs
-      (concat emacs-version
-             (if (featurep 'mule)
-                 " with mule"
-               " without mule"))
+  (if (featurep 'xemacs)
+      (concat emacs-version (if (featurep 'mule)
+                               " with mule"
+                             " without mule"))
     (let ((ver (if (string-match "\\.[0-9]+$" emacs-version)
                   (substring emacs-version 0 (match-beginning 0))
                 emacs-version)))
       (if (featurep 'mule)
-         (concat "Emacs " ver ", MULE " mule-version)
-       ver))))
+         (if (boundp 'enable-multibyte-characters)
+             (concat "Emacs " ver
+                     (if enable-multibyte-characters
+                         (concat ", MULE " mule-version)
+                       " (with raw setting)")
+                     (if (featurep 'meadow)
+                         (concat ", " (Meadow-version))
+                       ))
+           (concat "MULE " mule-version " based on Emacs " ver))
+       ver)))
+  "Body of X-Emacs field.
+If variable `mime-edit-insert-x-emacs-field' is not nil, it is
+inserted into message header.")
 
 \f
 ;;; @ constants
@@ -539,9 +596,13 @@ If it is not specified for a major-mode,
 Tspecials means any character that matches with it in header must be quoted.")
 
 (defconst mime-edit-mime-version-value
-  (concat "1.0 (generated by " mime-edit-version-name ")")
+  (concat "1.0 (generated by " mime-edit-version-string ")")
   "MIME version number.")
 
+(defconst mime-edit-mime-version-field-for-message/partial
+  (concat "MIME-Version: 1.0 (split by " mime-edit-version-string ")\n")
+  "MIME version field for message/partial.")
+
 
 ;;; @ keymap and menu
 ;;;
@@ -549,65 +610,59 @@ Tspecials means any character that matches with it in header must be quoted.")
 (defvar mime-edit-mode-flag nil)
 (make-variable-buffer-local 'mime-edit-mode-flag)
 
+(defvar mime-edit-mode-entity-prefix "\C-c\C-x"
+  "Keymap prefix for MIME-Edit mode commands to insert entity or set status.")
+(defvar mime-edit-mode-entity-map (make-sparse-keymap)
+  "Keymap for MIME-Edit mode commands to insert entity or set status.")
+
+(define-key mime-edit-mode-entity-map "\C-t" 'mime-edit-insert-text)
+(define-key mime-edit-mode-entity-map "\C-i" 'mime-edit-insert-file)
+(define-key mime-edit-mode-entity-map "\C-e" 'mime-edit-insert-external)
+(define-key mime-edit-mode-entity-map "\C-v" 'mime-edit-insert-voice)
+(define-key mime-edit-mode-entity-map "\C-y" 'mime-edit-insert-message)
+(define-key mime-edit-mode-entity-map "\C-m" 'mime-edit-insert-mail)
+(define-key mime-edit-mode-entity-map "\C-w" 'mime-edit-insert-signature)
+(define-key mime-edit-mode-entity-map "\C-s" 'mime-edit-insert-signature)
+(define-key mime-edit-mode-entity-map "\C-k" 'mime-edit-insert-key)
+(define-key mime-edit-mode-entity-map "t"    'mime-edit-insert-tag)
+
+(define-key mime-edit-mode-entity-map "7" 'mime-edit-set-transfer-level-7bit)
+(define-key mime-edit-mode-entity-map "8" 'mime-edit-set-transfer-level-8bit)
+(define-key mime-edit-mode-entity-map "/" 'mime-edit-set-split)
+(define-key mime-edit-mode-entity-map "s" 'mime-edit-set-sign)
+(define-key mime-edit-mode-entity-map "v" 'mime-edit-set-sign)
+(define-key mime-edit-mode-entity-map "e" 'mime-edit-set-encrypt)
+(define-key mime-edit-mode-entity-map "h" 'mime-edit-set-encrypt)
+(define-key mime-edit-mode-entity-map "p" 'mime-edit-preview-message)
+(define-key mime-edit-mode-entity-map "\C-z" 'mime-edit-exit)
+(define-key mime-edit-mode-entity-map "?" 'mime-edit-help)
+
+(defvar mime-edit-mode-enclosure-prefix "\C-c\C-m"
+  "Keymap prefix for MIME-Edit mode commands about enclosure.")
+(defvar mime-edit-mode-enclosure-map (make-sparse-keymap)
+  "Keymap for MIME-Edit mode commands about enclosure.")
+
+(define-key mime-edit-mode-enclosure-map
+  "\C-a" 'mime-edit-enclose-alternative-region)
+(define-key mime-edit-mode-enclosure-map
+  "\C-p" 'mime-edit-enclose-parallel-region)
+(define-key mime-edit-mode-enclosure-map
+  "\C-m" 'mime-edit-enclose-mixed-region)
+(define-key mime-edit-mode-enclosure-map
+  "\C-d" 'mime-edit-enclose-digest-region)
+(define-key mime-edit-mode-enclosure-map
+  "\C-s" 'mime-edit-enclose-pgp-signed-region)
+(define-key mime-edit-mode-enclosure-map
+  "\C-e" 'mime-edit-enclose-pgp-encrypted-region)
+(define-key mime-edit-mode-enclosure-map
+  "\C-q" 'mime-edit-enclose-quote-region)
+
 (defvar mime-edit-mode-map (make-sparse-keymap)
   "Keymap for MIME-Edit mode commands.")
-
-(define-key mime-edit-mode-map
-  "\C-c\C-x\C-t"       'mime-edit-insert-text)
-(define-key mime-edit-mode-map
-  "\C-c\C-x\C-i"       'mime-edit-insert-file)
-(define-key mime-edit-mode-map
-  "\C-c\C-x\C-e"       'mime-edit-insert-external)
-(define-key mime-edit-mode-map
-  "\C-c\C-x\C-v"       'mime-edit-insert-voice)
-(define-key mime-edit-mode-map
-  "\C-c\C-x\C-y"       'mime-edit-insert-message)
-(define-key mime-edit-mode-map
-  "\C-c\C-x\C-m"       'mime-edit-insert-mail)
-(define-key mime-edit-mode-map
-  "\C-c\C-x\C-w"       'mime-edit-insert-signature)
-(define-key mime-edit-mode-map
-  "\C-c\C-x\C-s"       'mime-edit-insert-signature)
 (define-key mime-edit-mode-map
-  "\C-c\C-x\C-k"       'mime-edit-insert-key)
+  mime-edit-mode-entity-prefix mime-edit-mode-entity-map)
 (define-key mime-edit-mode-map
-  "\C-c\C-xt"          'mime-edit-insert-tag)
-
-(define-key mime-edit-mode-map
-  "\C-c\C-m\C-a"       'mime-edit-enclose-alternative-region)
-(define-key mime-edit-mode-map
-  "\C-c\C-m\C-p"       'mime-edit-enclose-parallel-region)
-(define-key mime-edit-mode-map
-  "\C-c\C-m\C-m"       'mime-edit-enclose-mixed-region)
-(define-key mime-edit-mode-map
-  "\C-c\C-m\C-d"       'mime-edit-enclose-digest-region)
-(define-key mime-edit-mode-map
-  "\C-c\C-m\C-s"       'mime-edit-enclose-signed-region)
-(define-key mime-edit-mode-map
-  "\C-c\C-m\C-e"       'mime-edit-enclose-encrypted-region)
-(define-key mime-edit-mode-map
-  "\C-c\C-m\C-q"       'mime-edit-enclose-quote-region)
-
-(define-key mime-edit-mode-map
-  "\C-c\C-x7"          'mime-edit-set-transfer-level-7bit)
-(define-key mime-edit-mode-map
-  "\C-c\C-x8"          'mime-edit-set-transfer-level-8bit)
-(define-key mime-edit-mode-map
-  "\C-c\C-x/"          'mime-edit-set-split)
-(define-key mime-edit-mode-map
-  "\C-c\C-xs"          'mime-edit-set-sign)
-(define-key mime-edit-mode-map
-  "\C-c\C-xv"          'mime-edit-set-sign)
-(define-key mime-edit-mode-map
-  "\C-c\C-xe"          'mime-edit-set-encrypt)
-(define-key mime-edit-mode-map
-  "\C-c\C-xh"          'mime-edit-set-encrypt)
-(define-key mime-edit-mode-map
-  "\C-c\C-x\C-p"       'mime-edit-preview-message)
-(define-key mime-edit-mode-map
-  "\C-c\C-x\C-z"       'mime-edit-exit)
-(define-key mime-edit-mode-map
-  "\C-c\C-x?"          'mime-edit-help)
+  mime-edit-mode-enclosure-prefix mime-edit-mode-enclosure-map)
 
 (defconst mime-edit-menu-title "MIME-Edit")
 
@@ -626,8 +681,8 @@ Tspecials means any character that matches with it in header must be quoted.")
     (parallel  "Enclose as parallel"   mime-edit-enclose-parallel-region)
     (mixed     "Enclose as serial"     mime-edit-enclose-mixed-region)
     (digest    "Enclose as digest"     mime-edit-enclose-digest-region)
-    (signed    "Enclose as signed"     mime-edit-enclose-signed-region)
-    (encrypted "Enclose as encrypted"  mime-edit-enclose-encrypted-region)
+    (signed    "Enclose as signed"     mime-edit-enclose-pgp-signed-region)
+    (encrypted "Enclose as encrypted"  mime-edit-enclose-pgp-encrypted-region)
     (quote     "Verbatim region"       mime-edit-enclose-quote-region)
     (key       "Insert Public Key"     mime-edit-insert-key)
     (split     "About split"           mime-edit-set-split)
@@ -656,7 +711,7 @@ Tspecials means any character that matches with it in header must be quoted.")
                                  ))
                               mime-edit-menu-list)))
                )))
-       
+
        ;; modified by Steven L. Baur <steve@miranova.com>
        ;;      1995/12/6 (c.f. [tm-en:209])
        (or (boundp 'mime-edit-popup-menu-for-xemacs)
@@ -688,6 +743,8 @@ Tspecials means any character that matches with it in header must be quoted.")
 ;;; @ functions
 ;;;
 
+(defvar mime-edit-touched-flag nil)
+
 ;;;###autoload
 (defun mime-edit-mode ()
   "MIME minor mode for editing the tagged MIME message.
@@ -743,24 +800,27 @@ Following commands are available in addition to major mode commands:
 \\[mime-edit-insert-tag]       insert a new MIME tag.
 
 \[make enclosure (maybe multipart)\]
-\\[mime-edit-enclose-alternative-region]       enclose as multipart/alternative.
-\\[mime-edit-enclose-parallel-region]  enclose as multipart/parallel.
-\\[mime-edit-enclose-mixed-region]     enclose as multipart/mixed.
-\\[mime-edit-enclose-digest-region]    enclose as multipart/digest.
-\\[mime-edit-enclose-signed-region]    enclose as PGP signed.
-\\[mime-edit-enclose-encrypted-region] enclose as PGP encrypted.
-\\[mime-edit-enclose-quote-region]     enclose as verbose mode (to avoid to expand tags)
+\\[mime-edit-enclose-alternative-region]   enclose as multipart/alternative.
+\\[mime-edit-enclose-parallel-region]     enclose as multipart/parallel.
+\\[mime-edit-enclose-mixed-region]        enclose as multipart/mixed.
+\\[mime-edit-enclose-digest-region]       enclose as multipart/digest.
+\\[mime-edit-enclose-pgp-signed-region]           enclose as PGP signed.
+\\[mime-edit-enclose-pgp-encrypted-region] enclose as PGP encrypted.
+\\[mime-edit-enclose-quote-region]        enclose as verbose mode
+                                          (to avoid to expand tags)
 
 \[other commands\]
 \\[mime-edit-set-transfer-level-7bit]  set transfer-level as 7.
 \\[mime-edit-set-transfer-level-8bit]  set transfer-level as 8.
-\\[mime-edit-set-split]        set message splitting mode.
-\\[mime-edit-set-sign] set PGP-sign mode.
-\\[mime-edit-set-encrypt]      set PGP-encryption mode.
-\\[mime-edit-preview-message]  preview editing MIME message.
-\\[mime-edit-exit]     exit and translate into a MIME compliant message.
-\\[mime-edit-help]     show this help.
-\\[mime-edit-maybe-translate]  exit and translate if in MIME mode, then split.
+\\[mime-edit-set-split]                        set message splitting mode.
+\\[mime-edit-set-sign]                 set PGP-sign mode.
+\\[mime-edit-set-encrypt]              set PGP-encryption mode.
+\\[mime-edit-preview-message]          preview editing MIME message.
+\\[mime-edit-exit]                     exit and translate into a MIME
+                                       compliant message.
+\\[mime-edit-help]                     show this help.
+\\[mime-edit-maybe-translate]          exit and translate if in MIME mode,
+                                       then split.
 
 Additional commands are available in some major modes:
 C-c C-c                exit, translate and run the original command.
@@ -823,8 +883,7 @@ User customizable variables (not documented all of them):
   (interactive)
   (if mime-edit-mode-flag
       (mime-edit-exit)
-    (if (and (boundp 'mime-edit-touched-flag)
-            mime-edit-touched-flag)
+    (if mime-edit-touched-flag
        (mime-edit-again)
       (make-local-variable 'mime-edit-touched-flag)
       (setq mime-edit-touched-flag t)
@@ -856,20 +915,20 @@ User customizable variables (not documented all of them):
   (if mime-edit-mode-flag
       (error "You are already editing a MIME message.")
     (setq mime-edit-mode-flag t)
-    
+
     ;; Set transfer level into mode line
     ;;
     (setq mime-transfer-level-string
          (mime-encoding-name mime-transfer-level 'not-omit))
     (force-mode-line-update)
-    
+
     ;; Define menu for XEmacs.
     (if running-xemacs
        (mime-edit-define-menu-for-xemacs)
       )
-    
+
     (enable-invisible)
-    
+
     ;; I don't care about saving these.
     (setq paragraph-start
          (regexp-or mime-edit-single-part-tag-regexp
@@ -926,26 +985,27 @@ just return to previous mode."
     (princ (documentation 'mime-edit-mode))
     (print-help-return-message)))
 
-(defun mime-edit-insert-text ()
+(defun mime-edit-insert-text (&optional subtype)
   "Insert a text message.
-Charset is automatically obtained from the `charsets-mime-charset-alist'."
+Charset is automatically obtained from the `charsets-mime-charset-alist'.
+If optional argument SUBTYPE is not nil, text/SUBTYPE tag is inserted."
   (interactive)
-  (let ((ret (mime-edit-insert-tag "text" nil nil)))
-  (if ret
-      (progn
-       (if (looking-at mime-edit-single-part-tag-regexp)
-           (progn
-             ;; Make a space between the following message.
-             (insert "\n")
-             (forward-char -1)
-             ))
-       (if (and (member (second ret) '("enriched" "richtext"))
-                (fboundp 'enriched-mode)
-                )
-           (enriched-mode t)
-         (if (boundp 'enriched-mode)
-             (enriched-mode nil)
-           ))))))
+  (let ((ret (mime-edit-insert-tag "text" subtype nil)))
+    (when ret
+      (if (looking-at mime-edit-single-part-tag-regexp)
+         (progn
+           ;; Make a space between the following message.
+           (insert "\n")
+           (forward-char -1)
+           ))
+      (if (and (member (cadr ret) '("enriched" "richtext"))
+              (fboundp 'enriched-mode)
+              )
+         (enriched-mode t)
+       (if (boundp 'enriched-mode)
+           (enriched-mode -1)
+         ))
+      )))
 
 (defun mime-edit-insert-file (file &optional verbose)
   "Insert a message from a file."
@@ -1046,8 +1106,9 @@ Charset is automatically obtained from the `charsets-mime-charset-alist'."
   (let ((signature-insert-hook
          (function
           (lambda ()
-            (apply (function mime-edit-insert-tag)
-                   (mime-find-file-type signature-file-name))
+           (let ((items (mime-find-file-type signature-file-name)))
+             (apply (function mime-edit-insert-tag)
+                    (car items) (cadr items) (list (caddr items))))
             )))
         )
     (insert-signature arg)
@@ -1164,7 +1225,7 @@ Optional argument ENCODING specifies an encoding method such as base64."
            (t
             (goto-char (point-max))
             ))
-      ;; Then search for the beginning. 
+      ;; Then search for the beginning.
       (re-search-backward mime-edit-end-tag-regexp nil t)
       (or (looking-at mime-edit-beginning-tag-regexp)
          ;; Restore previous point.
@@ -1449,7 +1510,7 @@ Parameter must be '(PROMPT CHOICE1 (CHOISE2 ...))."
     ))
 
 (defun mime-prompt-for-encoding (default)
-  "Ask for Content-Transfer-Encoding. [mime-edit.el]"
+  "Ask for Content-Transfer-Encoding."
   (let (encoding)
     (while (string=
            (setq encoding
@@ -1493,21 +1554,17 @@ Parameter must be '(PROMPT CHOICE1 (CHOISE2 ...))."
       (let ((bb (match-beginning 0))
            (be (match-end 0))
            (type (buffer-substring (match-beginning 1)(match-end 1)))
-           end-exp eb ee)
+           end-exp eb)
        (setq end-exp (format "--}-<<%s>>\n" type))
        (widen)
        (if (re-search-forward end-exp nil t)
-           (progn
-             (setq eb (match-beginning 0))
-             (setq ee (match-end 0))
-             )
+           (setq eb (match-beginning 0))
          (setq eb (point-max))
-         (setq ee (point-max))
          )
        (narrow-to-region be eb)
        (goto-char be)
        (if (re-search-forward mime-edit-multipart-beginning-regexp nil t)
-           (let (ret)
+           (progn
              (narrow-to-region (match-beginning 0)(point-max))
              (mime-edit-find-inmost)
              )
@@ -1540,21 +1597,18 @@ Parameter must be '(PROMPT CHOICE1 (CHOISE2 ...))."
          (cond ((string-equal type "quote")
                 (mime-edit-enquote-region bb eb)
                 )
-               ((string-equal type "signed")
-                (cond ((eq mime-edit-signing-type 'pgp-elkins)
-                       (mime-edit-sign-pgp-elkins bb eb boundary)
-                       )
-                      ((eq mime-edit-signing-type 'pgp-kazu)
-                       (mime-edit-sign-pgp-kazu bb eb boundary)
-                       ))
+               ((string-equal type "pgp-signed")
+                (mime-edit-sign-pgp-mime bb eb boundary)
+                )
+               ((string-equal type "pgp-encrypted")
+                (mime-edit-encrypt-pgp-mime bb eb boundary)
+                )
+               ((string-equal type "kazu-signed")
+                (mime-edit-sign-pgp-kazu bb eb boundary)
+                )
+               ((string-equal type "kazu-encrypted")
+                (mime-edit-encrypt-pgp-kazu bb eb boundary)
                 )
-               ((string-equal type "encrypted")
-                (cond ((eq mime-edit-encrypting-type 'pgp-elkins)
-                       (mime-edit-encrypt-pgp-elkins bb eb boundary)
-                       )
-                      ((eq mime-edit-encrypting-type 'pgp-kazu)
-                       (mime-edit-encrypt-pgp-kazu bb eb boundary)
-                       )))
                (t
                 (setq boundary
                       (nth 2 (mime-edit-translate-region bb eb
@@ -1588,7 +1642,7 @@ Parameter must be '(PROMPT CHOICE1 (CHOISE2 ...))."
          (replace-match (concat "-" (substring tag 2)))
          )))))
 
-(defun mime-edit-sign-pgp-elkins (beg end boundary)
+(defun mime-edit-sign-pgp-mime (beg end boundary)
   (save-excursion
     (save-restriction
       (narrow-to-region beg end)
@@ -1596,17 +1650,16 @@ Parameter must be '(PROMPT CHOICE1 (CHOISE2 ...))."
              (mime-edit-translate-region beg end boundary))
             (ctype    (car ret))
             (encoding (nth 1 ret))
-            (parts    (nth 3 ret))
-            (pgp-boundary (concat "pgp-sign-" boundary))
-            )
+            (pgp-boundary (concat "pgp-sign-" boundary)))
        (goto-char beg)
        (insert (format "Content-Type: %s\n" ctype))
        (if encoding
            (insert (format "Content-Transfer-Encoding: %s\n" encoding))
          )
        (insert "\n")
-       (or (funcall (pgp-function 'mime-sign)
-                    (point-min)(point-max) nil nil pgp-boundary)
+       (or (as-binary-process
+            (funcall (pgp-function 'mime-sign)
+                     (point-min)(point-max) nil nil pgp-boundary))
            (throw 'mime-edit-error 'pgp-error)
            )
        ))))
@@ -1645,7 +1698,7 @@ Parameter must be '(PROMPT CHOICE1 (CHOISE2 ...))."
     (vector from recipients header)
     ))
 
-(defun mime-edit-encrypt-pgp-elkins (beg end boundary)
+(defun mime-edit-encrypt-pgp-mime (beg end boundary)
   (save-excursion
     (save-restriction
       (let (from recipients header)
@@ -1659,9 +1712,7 @@ Parameter must be '(PROMPT CHOICE1 (CHOISE2 ...))."
                (mime-edit-translate-region beg end boundary))
               (ctype    (car ret))
               (encoding (nth 1 ret))
-              (parts    (nth 3 ret))
-              (pgp-boundary (concat "pgp-" boundary))
-              )
+              (pgp-boundary (concat "pgp-" boundary)))
          (goto-char beg)
          (insert header)
          (insert (format "Content-Type: %s\n" ctype))
@@ -1696,9 +1747,7 @@ Content-Transfer-Encoding: 7bit
       (let* ((ret
              (mime-edit-translate-region beg end boundary))
             (ctype    (car ret))
-            (encoding (nth 1 ret))
-            (parts    (nth 3 ret))
-            )
+            (encoding (nth 1 ret)))
        (goto-char beg)
        (insert (format "Content-Type: %s\n" ctype))
        (if encoding
@@ -1718,10 +1767,9 @@ Content-Transfer-Encoding: 7bit
 
 (defun mime-edit-encrypt-pgp-kazu (beg end boundary)
   (save-excursion
-    (let (from recipients header)
+    (let (recipients header)
       (let ((ret (mime-edit-make-encrypt-recipient-header)))
-       (setq from (aref ret 0)
-             recipients (aref ret 1)
+       (setq recipients (aref ret 1)
              header (aref ret 2))
        )
       (save-restriction
@@ -1729,9 +1777,7 @@ Content-Transfer-Encoding: 7bit
        (let* ((ret
                (mime-edit-translate-region beg end boundary))
               (ctype    (car ret))
-              (encoding (nth 1 ret))
-              (parts    (nth 3 ret))
-              )
+              (encoding (nth 1 ret)))
          (goto-char beg)
          (insert header)
          (insert (format "Content-Type: %s\n" ctype))
@@ -1807,7 +1853,7 @@ Content-Transfer-Encoding: 7bit
                 (insert mime-edit-x-emacs-value)
                 ))
        ;; Make primary MIME headers.
-       (or (mail-position-on-field "Mime-Version")
+       (or (mail-position-on-field "MIME-Version")
            (insert mime-edit-mime-version-value))
        ;; Remove old Content-Type and other fields.
        (save-restriction
@@ -1826,17 +1872,15 @@ Content-Transfer-Encoding: 7bit
              (insert encoding)))
        ))))
 
-(defun mime-edit-translate-single-part-tag (&optional prefix)
+(defun mime-edit-translate-single-part-tag (boundary &optional prefix)
   "Translate single-part-tag to MIME header."
   (if (re-search-forward mime-edit-single-part-tag-regexp nil t)
       (let* ((beg (match-beginning 0))
             (end (match-end 0))
-            (tag (buffer-substring beg end))
-            )
+            (tag (buffer-substring beg end)))
        (delete-region beg end)
        (let ((contype (mime-edit-get-contype tag))
-             (encoding (mime-edit-get-encoding tag))
-             )
+             (encoding (mime-edit-get-encoding tag)))
          (insert (concat prefix "--" boundary "\n"))
          (save-restriction
            (narrow-to-region (point)(point))
@@ -1881,9 +1925,8 @@ Content-Transfer-Encoding: 7bit
         (t
          ;; It's a multipart message.
          (goto-char (point-min))
-         (and (mime-edit-translate-single-part-tag)
-              (while (mime-edit-translate-single-part-tag "\n"))
-              )
+         (and (mime-edit-translate-single-part-tag boundary)
+              (while (mime-edit-translate-single-part-tag boundary "\n")))
          ;; Define Content-Type as "multipart/mixed".
          (setq contype
                (concat "multipart/mixed;\n boundary=\"" boundary "\""))
@@ -1969,14 +2012,47 @@ Content-Transfer-Encoding: 7bit
        ;; Define encoding and encode text if necessary.
        (or encoding    ;Encoding is not specified.
            (let* ((encoding
-                   (cdr
-                    (assq charset
-                          mime-edit-charset-default-encoding-alist)
-                    ))
-                  (beg (mime-edit-content-beginning))
-                  )
+                   (let (bits conv)
+                     (let ((ret (cdr (assq charset mime-charset-type-list))))
+                       (if ret
+                           (setq bits (car ret)
+                                 conv (nth 1 ret))
+                         (setq bits 8
+                               conv "quoted-printable")))
+                     (if (<= bits mime-transfer-level)
+                         (mime-encoding-name bits)
+                       conv)))
+                  (beg (mime-edit-content-beginning)))
              (encode-mime-charset-region beg (mime-edit-content-end)
                                          charset)
+             ;; Protect "From " in beginning of line
+             (save-restriction
+               (narrow-to-region beg (mime-edit-content-end))
+               (goto-char beg)
+               (let (case-fold-search)
+                 (if (re-search-forward "^From " nil t)
+                     (unless encoding
+                       (if (memq charset '(iso-2022-jp
+                                           iso-2022-jp-2
+                                           iso-2022-int-1
+                                           x-ctext))
+                           (while (progn
+                                    (replace-match "\e(BFrom ")
+                                    (re-search-forward "^From " nil t)
+                                    ))
+                         (setq encoding "quoted-printable")
+                         )))))
+             ;; canonicalize line break code
+             (or (member encoding '(nil "7bit" "8bit" "quoted-printable"))
+                 (save-restriction
+                   (narrow-to-region beg (mime-edit-content-end))
+                   (goto-char beg)
+                   (while (re-search-forward "\\([^\r]\\)\n" nil t)
+                     (replace-match
+                      (concat (buffer-substring (match-beginning 0)
+                                                (match-end 1)) "\r\n"))
+                     )))
+             (goto-char beg)
              (mime-encode-region beg (mime-edit-content-end) encoding)
              (mime-edit-define-encoding encoding)
              ))
@@ -1988,9 +2064,7 @@ Content-Transfer-Encoding: 7bit
        ;; encoded.
        (let* ((encoding "base64")      ;Encode in BASE64 by default.
               (beg (mime-edit-content-beginning))
-              (end (mime-edit-content-end))
-              (body (buffer-substring beg end))
-              )
+              (end (mime-edit-content-end)))
          (mime-encode-region beg end encoding)
          (mime-edit-define-encoding encoding))
        (forward-line 1)
@@ -2015,7 +2089,7 @@ Content-Transfer-Encoding: 7bit
 
 (defun mime-edit-voice-recorder-for-sun (encoding)
   "Record voice in a buffer using Sun audio device,
-and insert data encoded as ENCODING. [mime-edit.el]"
+and insert data encoded as ENCODING."
   (message "Start the recording on %s.  Type C-g to finish the recording..."
           (system-name))
   (mime-insert-encoded-file "/dev/audio" encoding)
@@ -2074,61 +2148,66 @@ and insert data encoded as ENCODING. [mime-edit.el]"
 ;;; @ multipart enclosure
 ;;;
 
-(defun mime-edit-enclose-region (type beg end)
+(defun mime-edit-enclose-region-internal (type beg end)
   (save-excursion
     (goto-char beg)
-    (let ((current (point)))
-      (save-restriction
-       (narrow-to-region beg end)
-       (insert (format "--<<%s>>-{\n" type))
-       (goto-char (point-max))
-       (insert (format "--}-<<%s>>\n" type))
-       (goto-char (point-max))
+    (save-restriction
+      (narrow-to-region beg end)
+      (insert (format "--<<%s>>-{\n" type))
+      (goto-char (point-max))
+      (insert (format "--}-<<%s>>\n" type))
+      (goto-char (point-max))
+      )
+    (or (looking-at mime-edit-beginning-tag-regexp)
+       (eobp)
+       (insert (mime-make-text-tag) "\n")
        )
-      (or (looking-at mime-edit-beginning-tag-regexp)
-         (eobp)
-         (insert (mime-make-text-tag) "\n")
-         )
-      )))
+    ))
 
 (defun mime-edit-enclose-quote-region (beg end)
   (interactive "*r")
-  (mime-edit-enclose-region "quote" beg end)
+  (mime-edit-enclose-region-internal 'quote beg end)
   )
 
 (defun mime-edit-enclose-mixed-region (beg end)
   (interactive "*r")
-  (mime-edit-enclose-region "mixed" beg end)
+  (mime-edit-enclose-region-internal 'mixed beg end)
   )
 
 (defun mime-edit-enclose-parallel-region (beg end)
   (interactive "*r")
-  (mime-edit-enclose-region "parallel" beg end)
+  (mime-edit-enclose-region-internal 'parallel beg end)
   )
 
 (defun mime-edit-enclose-digest-region (beg end)
   (interactive "*r")
-  (mime-edit-enclose-region "digest" beg end)
+  (mime-edit-enclose-region-internal 'digest beg end)
   )
 
 (defun mime-edit-enclose-alternative-region (beg end)
   (interactive "*r")
-  (mime-edit-enclose-region "alternative" beg end)
+  (mime-edit-enclose-region-internal 'alternative beg end)
   )
 
-(defun mime-edit-enclose-signed-region (beg end)
+(defun mime-edit-enclose-pgp-signed-region (beg end)
   (interactive "*r")
-  (if mime-edit-signing-type
-      (mime-edit-enclose-region "signed" beg end)
-    (message "Please specify signing type.")
-    ))
+  (mime-edit-enclose-region-internal 'pgp-signed beg end)
+  )
 
-(defun mime-edit-enclose-encrypted-region (beg end)
+(defun mime-edit-enclose-pgp-encrypted-region (beg end)
   (interactive "*r")
-  (if mime-edit-signing-type
-      (mime-edit-enclose-region "encrypted" beg end)
-    (message "Please specify encrypting type.")
-    ))
+  (mime-edit-enclose-region-internal 'pgp-encrypted beg end)
+  )
+
+(defun mime-edit-enclose-kazu-signed-region (beg end)
+  (interactive "*r")
+  (mime-edit-enclose-region-internal 'kazu-signed beg end)
+  )
+
+(defun mime-edit-enclose-kazu-encrypted-region (beg end)
+  (interactive "*r")
+  (mime-edit-enclose-region-internal 'kazu-encrypted beg end)
+  )
 
 (defun mime-edit-insert-key (&optional arg)
   "Insert a pgp public key."
@@ -2145,7 +2224,7 @@ and insert data encoded as ENCODING. [mime-edit.el]"
 (defun mime-edit-set-split (arg)
   (interactive
    (list
-    (y-or-n-p "Do you want to enable split?")
+    (y-or-n-p "Do you want to enable split? ")
     ))
   (setq mime-edit-split-message arg)
   (if arg
@@ -2164,8 +2243,6 @@ Optional TRANSFER-LEVEL is a number of transfer-level, 7 or 8."
        (setq mime-transfer-level 8)
       (setq mime-transfer-level 7)
       ))
-  (setq mime-edit-charset-default-encoding-alist
-       (mime-make-charset-default-encoding-alist mime-transfer-level))
   (message (format "Current transfer-level is %d bit"
                   mime-transfer-level))
   (setq mime-transfer-level-string
@@ -2187,18 +2264,18 @@ Optional TRANSFER-LEVEL is a number of transfer-level, 7 or 8."
 ;;; @ pgp
 ;;;
 
+(defvar mime-edit-pgp-processing nil)
+(make-variable-buffer-local 'mime-edit-pgp-processing)
+
 (defun mime-edit-set-sign (arg)
   (interactive
    (list
-    (y-or-n-p "Do you want to sign?")
+    (y-or-n-p "Do you want to sign? ")
     ))
   (if arg
-      (if mime-edit-signing-type
-         (progn
-           (setq mime-edit-pgp-processing 'sign)
-           (message "This message will be signed.")
-           )
-       (message "Please specify signing type.")
+      (progn
+       (setq mime-edit-pgp-processing 'sign)
+       (message "This message will be signed.")
        )
     (if (eq mime-edit-pgp-processing 'sign)
        (setq mime-edit-pgp-processing nil)
@@ -2209,15 +2286,12 @@ Optional TRANSFER-LEVEL is a number of transfer-level, 7 or 8."
 (defun mime-edit-set-encrypt (arg)
   (interactive
    (list
-    (y-or-n-p "Do you want to encrypt?")
+    (y-or-n-p "Do you want to encrypt? ")
     ))
   (if arg
-      (if mime-edit-encrypting-type
-         (progn
-           (setq mime-edit-pgp-processing 'encrypt)
-           (message "This message will be encrypt.")
-           )
-       (message "Please specify encrypting type.")
+      (progn
+       (setq mime-edit-pgp-processing 'encrypt)
+       (message "This message will be encrypt.")
        )
     (if (eq mime-edit-pgp-processing 'encrypt)
        (setq mime-edit-pgp-processing nil)
@@ -2225,9 +2299,6 @@ Optional TRANSFER-LEVEL is a number of transfer-level, 7 or 8."
     (message "This message will not be encrypt.")
     ))
 
-(defvar mime-edit-pgp-processing nil)
-(make-variable-buffer-local 'mime-edit-pgp-processing)
-
 (defun mime-edit-pgp-enclose-buffer ()
   (let ((beg (save-excursion
               (goto-char (point-min))
@@ -2238,10 +2309,10 @@ Optional TRANSFER-LEVEL is a number of transfer-level, 7 or 8."
        )
     (if beg
        (cond ((eq mime-edit-pgp-processing 'sign)
-              (mime-edit-enclose-signed-region beg end)
+              (mime-edit-enclose-pgp-signed-region beg end)
               )
              ((eq mime-edit-pgp-processing 'encrypt)
-              (mime-edit-enclose-encrypted-region beg end)
+              (mime-edit-enclose-pgp-encrypted-region beg end)
               ))
       )))
 
@@ -2249,12 +2320,11 @@ Optional TRANSFER-LEVEL is a number of transfer-level, 7 or 8."
 ;;; @ split
 ;;;
 
-(defun mime-edit-insert-partial-header
-  (fields subject id number total separator)
+(defun mime-edit-insert-partial-header (fields subject
+                                              id number total separator)
   (insert fields)
   (insert (format "Subject: %s (%d/%d)\n" subject number total))
-  (insert (format "Mime-Version: 1.0 (split by %s)\n"
-                 mime-edit-version-name))
+  (insert mime-edit-mime-version-field-for-message/partial)
   (insert (format "\
 Content-Type: message/partial; id=%s; number=%d; total=%d\n%s\n"
                  id number total separator))
@@ -2272,7 +2342,7 @@ Content-Type: message/partial; id=%s; number=%d; total=%d\n%s\n"
            (or (cdr (assq major-mode mime-edit-message-max-lines-alist))
                mime-edit-message-default-max-lines))
       )
-  (let* ((mime-edit-draft-file-name 
+  (let* ((mime-edit-draft-file-name
          (or (buffer-file-name)
              (make-temp-name
               (expand-file-name "mime-draft" mime-temp-directory))))
@@ -2380,7 +2450,7 @@ Content-Type: message/partial; id=%s; number=%d; total=%d\n%s\n"
 (defvar mime-edit-buffer nil) ; buffer local variable
 
 (defun mime-edit-preview-message ()
-  "preview editing MIME message. [mime-edit.el]"
+  "preview editing MIME message."
   (interactive)
   (let* ((str (buffer-string))
         (separator mail-header-separator)
@@ -2403,7 +2473,7 @@ Content-Type: message/partial; id=%s; number=%d; total=%d\n%s\n"
     (setq mail-header-separator separator)
     (make-local-variable 'mime-edit-buffer)
     (setq mime-edit-buffer the-buf)
-    
+
     (run-hooks 'mime-edit-translate-hook)
     (mime-edit-translate-buffer)
     (goto-char (point-min))
@@ -2418,17 +2488,16 @@ Content-Type: message/partial; id=%s; number=%d; total=%d\n%s\n"
   "Quitting method for mime-view."
   (let ((temp mime-raw-buffer)
        buf)
-    (mime-view-kill-buffer)
+    (mime-preview-kill-buffer)
     (set-buffer temp)
     (setq buf mime-edit-buffer)
     (kill-buffer temp)
     (switch-to-buffer buf)
     ))
 
-(set-alist 'mime-view-quitting-method-alist
+(set-alist 'mime-preview-quitting-method-alist
           'mime-temp-message-mode
-          (function mime-edit-quitting-method)
-          )
+          #'mime-edit-quitting-method)
 
 
 ;;; @ edit again
@@ -2443,23 +2512,16 @@ Content-Type: message/partial; id=%s; number=%d; total=%d\n%s\n"
 (defun mime-edit-decode-buffer (not-decode-text)
   (save-excursion
     (goto-char (point-min))
-    (let ((ctl (mime/Content-Type)))
+    (let ((ctl (mime-read-Content-Type)))
       (if ctl
-         (let ((ctype (car ctl))
-               (params (cdr ctl))
-               type stype)
-           (if (string-match "/" ctype)
-               (progn
-                 (setq type (substring ctype 0 (match-beginning 0)))
-                 (setq stype (substring ctype (match-end 0)))
-                 )
-             (setq type ctype)
-             )
+         (let ((type (mime-content-type-primary-type ctl))
+               (stype (mime-content-type-subtype ctl))
+               (params (mime-content-type-parameters ctl)))
            (cond
-            ((string= ctype "application/pgp-signature")
+            ((and (eq type 'application)(eq stype 'pgp-signature))
              (delete-region (point-min)(point-max))
              )
-            ((string= type "multipart")
+            ((eq type 'multipart)
              (let* ((boundary (cdr (assoc "boundary" params)))
                     (boundary-pat
                      (concat "\n--" (regexp-quote boundary) "[ \t]*\n"))
@@ -2502,12 +2564,13 @@ Content-Type: message/partial; id=%s; number=%d; total=%d\n%s\n"
                                     )))
                ))
             (t
-             (let* (charset
+             (let* ((ctype (format "%s/%s" type stype))
+                    charset
                     (pstr
                      (let ((bytes (+ 14 (length ctype))))
                        (mapconcat (function
                                    (lambda (attr)
-                                     (if (string-equal (car attr) "charset")
+                                     (if (string= (car attr) "charset")
                                          (progn
                                            (setq charset (cdr attr))
                                            "")
@@ -2537,7 +2600,7 @@ Content-Type: message/partial; id=%s; number=%d; total=%d\n%s\n"
                              (eliminate-top-spaces
                               (std11-unfold-string
                                (buffer-substring hbeg end))))
-                       (if (or charset (string-equal type "text"))
+                       (if (or charset (eq type 'text))
                            (progn
                              (delete-region beg (1+ end))
                              (goto-char (point-min))
@@ -2564,12 +2627,14 @@ Content-Type: message/partial; id=%s; number=%d; total=%d\n%s\n"
                        (insert
                         (concat "\n"
                                 (mime-create-tag
-                                 (concat type "/" stype pstr) encoding)))
+                                 (format "%s/%s%s" type stype pstr)
+                                 encoding)))
                        )
                    (delete-region (point-min) he)
                    (insert
                     (mime-create-tag
-                     (concat type "/" stype pstr) encoding))
+                     (format "%s/%s%s" type stype pstr)
+                     encoding))
                    ))
                ))))
        (or not-decode-text