(gnus-setup-message): Setup `message-startup-parameter-alist'.
[elisp/gnus.git-] / lisp / pop3-fma.el
index 74eae7d..e95c147 100644 (file)
@@ -1,14 +1,16 @@
 ;; pop3-fma.el.el --- POP3 for Multiple Account for Gnus.
 ;; Copyright (C) 1996,97,98 Free Software Foundation, Inc. , Tatsuya Ichikawa
+;;                                                           Yasuo Okabe
 ;; Author: Tatsuya Ichikawa <t-ichi@po.shiojiri.ne.jp>
-;; Version: 0.13
+;;         Yasuo OKABE <okabe@kuis.kyoto-u.ac.jp>
+;; Version: 1.11
 ;; Keywords: mail , gnus , pop3
 ;;
 ;; SPECIAL THANKS
 ;;    Keiichi Suzuki <kei-suzu@mail.wbs.or.jp>
 ;;    Katsumi Yamaoka <yamaoka@jpl.org>
 ;;
-;; This file is part of GNU Emacs.
+;; This file is not part of GNU Emacs.
 
 ;; GNU Emacs is free software; you can redistribute it and/or modify
 ;; it under the terms of the GNU General Public License as published by
 
 ;;; Commentary:
 ;;
+;; Note.
+;;
+;; This file store pop3 password in variable "pop3-fma-password".
+;; Please take care by yourself to treat pop3 password.
 ;;
 ;; How to use.
 ;;
 ;; add your .emacs following codes.
 ;;
-;;  (autoload 'pop3-fma-set-pop3-password "pop3-fma")
+;;  (require 'pop3-fma)
 ;;  (setq pop3-fma-spool-file-alist
 ;;        '(
-;;         "po:username0@mailhost0.your.domain0"
-;;         "po:username1@mailhost1.your.domain1"
+;;         ("po:username0@mailhost0.your.domain0" pass)
+;;         ("po:username1@mailhost1.your.domain1" apop)
 ;;                         :
 ;;                         :
 ;;        ))
 ;;
+;;     pass means normal authentication USER/PASS.
+;;     apop means authentication using APOP.
+;;
+;; When using apop , Please set pop3-fma-movemail-type 'lisp.
+;; movemail.exe does not work on APOP protocol.
+;;
 ;; Variables
 ;;
 ;;  pop3-fma-spool-file-alist      ... Spool file alist of POP3 protocol
     (` (defvar (, symbol) (, value) (, doc))))
   )
 
+(unless (and (fboundp 'pop3-fma-encode-string)
+            (fboundp 'pop3-fma-decode-string))
+  (require 'mel-b)
+  (fset 'pop3-fma-encode-string 'base64-encode-string)
+  (fset 'pop3-fma-decode-string 'base64-decode-string))
+
 (defgroup pop3-fma nil
   "Multile POP3 account utility for Gnus."
   :prefix "pop3-fma-"
   :group 'mail
   :group 'news)
 
-(defconst pop3-fma-version-number "0.13")
+(defconst pop3-fma-version-number "1.11")
 (defconst pop3-fma-codename
 ;;  "Feel the wind"            ; 0.10
 ;;  "My home town"             ; 0.11
 ;;  "On the road"              ; 0.12
-  "Rock'n Roll city"           ; 0.13
-;;  "Money"                    ; 0.xx
-;;  "Midnight blue train"      ; 0.xx
-;;  "Still 19"                 ; 0.xx
-;;  "J boy"                    ; 0.xx
-;;  "Blood line"               ; 0.xx
-;;  "Star ring"                        ; 0.xx
+;;  "Rock'n Roll city"         ; 0.13
+;;  "Money"                    ; 0.20
+;;  "Still 19"                 ; 0.21
+;;  "J boy"                    ; 1.00
+;;  "Blood line"               ; 1.10
+  "Star ring"                  ; 0.xx
 ;;  "Goodbye Game"             ; 0.xx
   )
 (defconst pop3-fma-version (format "Multiple POP3 account utiliy for Gnus v%s - \"%s\""
                                       pop3-fma-codename))
 
 (defcustom pop3-fma-spool-file-alist nil
-  "*Spoolfile to get mail using pop3 protocol.
+  "*Spool file to get mail using pop3 protocol.
 You should specify this variable like
  '(
-   \"po:user1@mailhost1\"
-   \"po:user2@mailhost2\"
-  )"
+   (\"po:user1@mailhost1\" type)
+   (\"po:user2@mailhost2\" type)
+  )
+Type must be pass or apop."
+  :group 'pop3-fma
+  :type 'alist)
+
+(defcustom pop3-fma-local-spool-file-alist nil
+  "*List of Local spool file to get mail."
   :group 'pop3-fma
   :type 'alist)
 
@@ -127,56 +150,86 @@ Please do not set this valiable non-nil if you do not use Meadow.")
 (defvar passwd nil)
 (defvar str nil)
 (defvar pop3-fma-movemail-options pop3-fma-movemail-arguments)
-(defvar pop3-fma-cypher-key (1+ (random 92)))
+(defvar spool nil)
+(defvar movemail-output-buffer " *movemail-out*")
 
-(defun pop3-fma-init-hooks ()
+(defun pop3-fma-init-message-hook ()
   (add-hook 'message-send-hook 'pop3-fma-message-add-header))
 
 (eval-after-load "message"
-  '(pop3-fma-init-hooks))
+  '(pop3-fma-init-message-hook))
 
 (add-hook 'gnus-after-exiting-gnus-hook
          '(lambda () (setq pop3-fma-password nil)))
 (add-hook 'gnus-before-startup-hook 'pop3-fma-set-pop3-password)
+
 ;;
 ;;
 ;; Gnus POP3 additional utility...
 ;;
 (defun pop3-fma-movemail (inbox crashbox)
   "Function to move mail from INBOX on a pop3 server to file CRASHBOX."
-  (let ((pop3-maildrop
-        (substring inbox (match-end (string-match "^po:" inbox))
-                   (- (match-end (string-match "^.*@" inbox)) 1)))
-       (pop3-mailhost
-        (substring inbox (match-end (string-match "^.*@" inbox)))))
-    (let ((pop3-password
-          (pop3-fma-read-passwd pop3-mailhost)))
-      (message "Checking new mail user %s at %s..." pop3-maildrop pop3-mailhost)
-      (if (and (eq system-type 'windows-nt)
-              (eq pop3-fma-movemail-type 'exe))
-         (progn
-           (setenv "MAILHOST" pop3-mailhost)
-           (if (and (not (memq pop3-password pop3-fma-movemail-arguments))
-                    (not (memq (concat "po:" pop3-maildrop) pop3-fma-movemail-arguments)))
-               (progn
-                 (setq pop3-fma-movemail-arguments nil)
-                 (setq pop3-fma-movemail-arguments
-                     (append pop3-fma-movemail-options
-                             (list
-                              (concat "po:" pop3-maildrop)
-                              crashbox
-                              pop3-password)))))
-           (apply 'call-process (concat
-                                 exec-directory
-                                 pop3-fma-movemail-program)
-                  nil nil nil
-                  pop3-fma-movemail-arguments))
-       (pop3-movemail crashbox)))))
+  (if (string-match "^po:" inbox)
+      (progn
+       (let ((pop3-maildrop
+              (substring inbox (match-end (string-match "^po:" inbox))
+                         (- (match-end (string-match "^.*@" inbox)) 1)))
+             (pop3-mailhost
+              (substring inbox (match-end (string-match "^.*@" inbox))))
+             (pop3-password
+              (pop3-fma-read-passwd (substring inbox (match-end (string-match "^.*@" inbox)))))
+             (pop3-authentication-scheme
+              (nth 1 (assoc inbox pop3-fma-spool-file-alist)))
+             (pop3-fma-movemail-type (pop3-fma-get-movemail-type inbox)))
+         (if (eq pop3-authentication-scheme 'pass)
+             (message "Checking new mail user %s at %s using USER/PASS ..." pop3-maildrop pop3-mailhost)
+           (message "Checking new mail user %s at %s using APOP ..." pop3-maildrop pop3-mailhost))
+         (if (and (eq system-type 'windows-nt)
+                  (eq pop3-fma-movemail-type 'exe))
+             (progn
+               (setenv "MAILHOST" pop3-mailhost)
+               (if (and (not (memq pop3-password pop3-fma-movemail-arguments))
+                        (not (memq (concat "po:" pop3-maildrop) pop3-fma-movemail-arguments)))
+                   (progn
+                     (setq pop3-fma-movemail-arguments nil)
+                     (setq pop3-fma-movemail-arguments
+                           (append pop3-fma-movemail-options
+                                   (list
+                                    (concat "po:" pop3-maildrop)
+                                    crashbox
+                                    pop3-password)))))
+               (if (not (get-buffer movemail-output-buffer))
+                   (get-buffer-create movemail-output-buffer))
+               (set-buffer movemail-output-buffer)
+               (erase-buffer)
+               (apply 'call-process (concat
+                                     exec-directory
+                                     pop3-fma-movemail-program)
+                      nil movemail-output-buffer nil
+                      pop3-fma-movemail-arguments)
+               (let ((string (buffer-string)))
+                 (if (> (length string) 0)
+                     (progn
+                       (if (y-or-n-p
+                            (concat (substring string 0
+                                               (- (length string) 1))
+                                               " continue ??"))
+                           nil
+                         nil)))))
+           (pop3-movemail crashbox))))
+    (message "Checking new mail at %s ... " inbox)
+    (call-process (concat exec-directory pop3-fma-movemail-program)
+                 nil
+                 nil
+                 nil
+                 inbox
+                 crashbox)
+    (message "Checking new mail at %s ... done." inbox)))
 ;;
 ;;
 (defun pop3-fma-read-passwd (mailhost)
   (setq passwd (nth 2 (assoc mailhost pop3-fma-password)))
-  (pop3-fma-cypher-string passwd nil t))
+  (pop3-fma-decode-string passwd))
 
 (setq pop3-read-passwd 'pop3-fma-read-passwd)
 ;;
@@ -192,11 +245,11 @@ Please do not set this valiable non-nil if you do not use Meadow.")
                     (list
                      pop3-mailhost
                      pop3-maildrop
-                     (pop3-fma-cypher-string passwd)))))                     
+                     (pop3-fma-encode-string passwd)))))                     
     (setcar (cdr (cdr (assoc pop3-mailhost pop3-fma-password)))
-           passwd))
+           (pop3-fma-encode-string passwd)))
   (message "POP password registered.")
-  passwd)
+  (pop3-fma-encode-string passwd))
 ;;
 ;;;###autoload
 (defun pop3-fma-set-pop3-password()
@@ -204,14 +257,20 @@ Please do not set this valiable non-nil if you do not use Meadow.")
   (mapcar
    (lambda (x)
      (let ((pop3-maildrop
-           (substring x (match-end (string-match "^po:" x))
-                      (- (match-end (string-match "^.*@" x)) 1)))
+           (substring (car x) (match-end (string-match "^po:" (car x)))
+                      (- (match-end (string-match "^.*@" (car x))) 1)))
           (pop3-mailhost
-           (substring x (match-end (string-match "^.*@" x)))))
+           (substring (car x) (match-end (string-match "^.*@" (car x))))))
        (call-interactively 'pop3-fma-store-password)))
    pop3-fma-spool-file-alist)
   (setq nnmail-movemail-program 'pop3-fma-movemail)
-  (setq nnmail-spool-file pop3-fma-spool-file-alist))
+;;  (setq nnmail-spool-file pop3-fma-spool-file-alist))
+  (setq nnmail-spool-file (append
+                          pop3-fma-local-spool-file-alist
+                          (mapcar
+                           (lambda (spool)
+                             (car spool))
+                           pop3-fma-spool-file-alist))))
 ;;
 (defun pop3-fma-read-noecho (prompt &optional stars)
   "Read a single line of text from user without echoing, and return it.
@@ -258,7 +317,6 @@ Argument PROMPT ."
   
 ;;
 ;; Add your custom header.
-;;
 (defun pop3-fma-add-custom-header (header string)
   (let ((delimline
         (progn (goto-char (point-min))
@@ -276,29 +334,13 @@ Argument PROMPT ."
          (setq hdr (concat str "\n"))
          (insert-string hdr)))))
 ;;
-;; Crypt password string
 ;;
-(defun pop3-fma-cypher-string (string &optional key flag)
-  (let ((r nil)
-       (i 0)
-       (rot (if flag (- 94 (or key pop3-fma-cypher-key 13))
-              (or key pop3-fma-cypher-key 13))))
-    (mapcar (lambda (x)
-             (setq r
-                   (concat r 
-                           (cond
-                            ((and (<= 32 x) (<= x 126))
-                             (char-to-string
-                              (+ (% (+ (- x 32)
-                                       (if flag
-                                           (+ rot (- 94 i))
-                                         (+ rot i)))
-                                    94) 32)))
-                            (t (char-to-string x)))))
-             (setq i (1+ i)))
-           (string-to-char-list string))
-    r))
+(defun pop3-fma-get-movemail-type (inbox)
+  (if (eq (nth 1 (assoc inbox pop3-fma-spool-file-alist)) 'apop)
+      'lisp
+    pop3-fma-movemail-type))
 ;;
 (provide 'pop3-fma)
 ;;
 ;; pop3-fma.el ends here.
+