* lisp/gnus.el (gnus-revision-number): Increment to 08.
[elisp/gnus.git-] / lisp / gnus-ofsetup.el
1 ;;; gnus-ofsetup.el --- Setup advisor for Offline reading for Mail/News.
2 ;;;
3 ;;; $Id: gnus-ofsetup.el,v 1.1.2.16 1999-02-18 20:10:22 czkmt Exp $
4 ;;;
5 ;;; Copyright (C) 1998 Tatsuya Ichikawa
6 ;;; Author: Tatsuya Ichikawa <t-ichi@po.shiojiri.ne.jp>
7 ;;;
8 ;;; This file is part of Semi-gnus.
9 ;;;
10 ;;; GNU Emacs is free software; you can redistribute it and/or modify
11 ;;; it under the terms of the GNU General Public License as published by
12 ;;; the Free Software Foundation; either version 2, or (at your option)
13 ;;; any later version.
14
15 ;;; GNU Emacs is distributed in the hope that it will be useful,
16 ;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
17 ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 ;;; GNU General Public License for more details.
19
20 ;;; You should have received a copy of the GNU General Public License
21 ;;; along with GNU Emacs; see the file COPYING.  If not, write to the
22 ;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
23 ;;; Boston, MA 02111-1307, USA.
24 ;;;
25 ;;;; Commentary:
26 ;;; How to use.
27 ;;;
28 ;;;      M-x load[RET]gnus-ofsetup
29 ;;;      M-x gnus-setup-for-offline
30 ;;;
31
32 ;;; Code:
33
34 (defvar gnus-offline-setting-file "~/.gnus-offline.el")
35 (defvar gnus-offline-use-miee nil)
36 (defvar gnus-offline-news-fetch-method nil)
37 (defvar gnus-offline-mail-fetch-method nil)
38 (defvar gnus-offline-hangup-program nil)
39 (defvar gnus-offline-dialup-program nil)
40 (defvar pop3-fma-spool-file-alist nil)
41 (defvar pop3-fma-movemail-type nil)
42 (defvar pop3-fma-movemail-arguments nil)
43 (defvar use-miee nil)
44 (defvar address nil)
45 (defvar mail-source nil)
46 (defvar options nil)
47
48 ;;; To silence byte compiler
49 (and
50  (fboundp 'eval-when-compile)
51  (eval-when-compile
52    (save-excursion
53      (beginning-of-defun)
54      (eval-region (point-min) (point)))
55    (let (case-fold-search)
56      (mapcar
57       (function
58        (lambda (symbol)
59          (unless (boundp symbol)
60            (make-local-variable symbol)
61            (eval (list 'setq symbol nil)))))
62       '(:group
63         :prefix :type
64         sendmail-to-spool-directory
65         news-spool-request-post-directory
66         nnspool-version
67         nnagent-version
68         msspool-news-server
69         msspool-news-service
70         gnspool-get-news
71         mail-spool-send
72         news-spool-post
73         gnus-agent-handle-level
74         ))
75      (make-local-variable 'byte-compile-warnings)
76      (setq byte-compile-warnings nil))))
77
78 (defun gnus-setup-for-offline ()
79   "*Set up Gnus for offline environment."
80   (interactive)
81   
82   (if (not (file-exists-p gnus-offline-setting-file))
83       (progn
84         (let ((news-method
85                (completing-read
86                 "Method for offline News reading (TAB to completion): "
87                 '(("gnus-agent" 1) ("nnspool" 2))
88                 nil t nil))
89               (mail-method 'nnmail)
90               (program
91                (read-file-name "Dialup/Hangup program(type nil or null string you do not use): "))
92               (mta-type
93                (completing-read
94                 "Select MTA type for sending mail (TAB to completion): "
95                 '(("smtp" 1) ("sendmail" 2))
96                 nil t nil))
97               (num-of-address
98                (read-from-minibuffer "How many e-mail address do you have: "))
99               )
100           (if (string-equal news-method "nnspool")
101               (setq use-miee t)
102             (setq use-miee (y-or-n-p "Use MIEE post/send message ")))
103           ;;
104           ;; Set variables.
105           (if (string-equal news-method "gnus-agent")
106               (setq gnus-offline-news-fetch-method 'nnagent)
107             (setq gnus-offline-news-fetch-method 'nnspool))
108           ;;
109           (setq gnus-offline-mail-fetch-method mail-method)
110           (setq gnus-offline-use-miee use-miee)
111           
112           ;; Set programs.
113           (if (or (string-equal program "nil")
114                   (string-equal program ""))
115               (progn
116                 (setq gnus-offline-hangup-program nil)
117                 (setq gnus-offline-dialup-program nil))
118             (let ((options
119                    (read-from-minibuffer "Dialup program options: ")))
120               (setq gnus-offline-dialup-program-arguments
121                     (split-string options "[\t ]+")))
122             (let ((options
123                    (read-from-minibuffer "Hangup program options: ")))
124               (setq gnus-offline-hangup-program-arguments
125                     (split-string options "[\t ]+")))
126             (setq gnus-offline-hangup-program program)
127             (setq gnus-offline-dialup-program program))
128             
129             ;; Set spool directory for outgoing messages.
130           (if use-miee
131               (progn
132                 ;; Setting for MIEE with nnspool.
133                 (let ((news-spool
134                        (read-from-minibuffer
135                         "News spool directory for sending: "
136                         "/usr/spool/news.out"))
137                       (mail-spool
138                        (read-from-minibuffer
139                         "Mail spool directory for sending: "
140                         "/usr/spool/mail.out")))
141                   (setq gnus-offline-mail-spool-directory mail-spool)
142                   (setq gnus-offline-news-spool-directory news-spool)
143                   (setq gnus-offline-drafts-queue-type 'miee)
144                   
145                   ;; Load MIEE.
146                   (load "miee")
147                   ;; Set news post function for MIEE.
148                   (setq message-send-news-function 'gnspool-request-post)
149                   ;; Spool directory setting - MIEE.
150                   (if (not (file-exists-p gnus-offline-mail-spool-directory))
151                       (make-directory gnus-offline-mail-spool-directory t))
152                   (setq sendmail-to-spool-directory
153                         gnus-offline-mail-spool-directory)
154                   (if (not (file-exists-p gnus-offline-news-spool-directory))
155                       (make-directory gnus-offline-news-spool-directory t))
156                   (setq news-spool-request-post-directory
157                         gnus-offline-news-spool-directory)))
158             
159             ;; Set drafts type gnus-agent.
160             (setq gnus-offline-drafts-queue-type 'agent))
161           
162           ;; Setting for gnus-agent.
163           (if (eq gnus-offline-news-fetch-method 'nnagent)
164               (let ((agent-directory
165                      (read-from-minibuffer "Agent directory: " "~/News/agent")))
166                 (setq gnus-agent-directory agent-directory)))
167             
168           ;; Determin MTA type.
169           (if (string-equal mta-type "smtp")
170               (setq gnus-offline-MTA-type 'smtp)
171             (setq gnus-offline-MTA-type 'sendmail)
172             )
173           ;;
174           ;; Set E-Mail Address and pop3 movemail type.
175           (setq i (string-to-int num-of-address))
176           (setq address nil)
177           (if (not (locate-library "mail-source"))
178               (progn
179                 (while (> i 0)
180                   (setq address
181                         (append address
182                                 (list
183                                  (list
184                                   (concat "po:"
185                                           (read-from-minibuffer
186                                            "Email address (user@mailhost): "))
187                                   (completing-read
188                                    "Authentification Method (TAB to completion): "
189                                    '(("pass" 1) ("apop" 2)) nil t nil)))))
190                   (setq i (- i 1)))
191                 ;; Replace "hoge" -> 'hoge
192                 (mapcar
193                  (lambda (x)
194                    (if (string-equal (nth 1 x) "pass")
195                        (setcar (cdr x) 'pass)
196                      (setcar (cdr x) 'apop)))
197                  address)
198                 (setq pop3-fma-spool-file-alist address)
199                 ;; Set movemail type.
200                 (let ((movemail-type
201                        (completing-read
202                         "Select movemail type for retreave mail (TAB to completion): "
203                         '(("exe" 1) ("lisp" 2))
204                         nil t nil))
205                       )
206                   (if (string-equal movemail-type "exe")
207                       (let ((options
208                              (read-from-minibuffer "movemail options: ")))
209                         (setq pop3-fma-movemail-arguments (split-string options "[\t ]+"))))
210                   (if (string-equal movemail-type "exe")
211                       (setq pop3-fma-movemail-type 'exe)
212                     (setq pop3-fma-movemail-type 'lisp))))
213             ;;
214             ;; Use mail-source.el
215             (setq mail-source nil)
216             (while (> i 0)
217               (let ((user (read-from-minibuffer "Mail Account name : "))
218                     (server (read-from-minibuffer "Mail server : "))
219                     (auth (completing-read
220                           "Authentification Method (TAB to completion): "
221                           '(("pop" 1) ("apop" 2)) nil t nil))
222                     (islisp (y-or-n-p "Do you use pop3.el to fetch mail? ")))
223                 (if (not islisp)
224                     (let ((prog (read-file-name "movemail program name: "
225                                                 exec-directory "movemail"))
226                           (args (read-from-minibuffer "movemail options: " "-pf")))
227                       (setq mail-source
228                             (append mail-source
229                                     (list
230                                      (list
231                                       'pop
232                                       :user user
233                                       :server server
234                                       :program
235                                       (format "%s %s %s %s %s"
236                                               prog
237                                               args
238                                               "po:%u"
239                                               "%t"
240                                               "%p")
241                                               :authentication auth)))))
242                   (setq mail-source
243                         (append mail-source
244                                 (list
245                                  (list
246                                   'pop
247                                   :user user
248                                   :server server
249                                   :authentication auth))))))
250               (setq i (- i 1)))
251             ;; Replace "hoge" -> 'hoge
252             (mapcar
253              (lambda (x)
254                (if (string-equal (car (last x)) "pop")
255                    (setcar (last x) (quote 'pop))
256                  (setcar (last x) (quote 'apop))))
257              mail-source)
258             (setq gnus-offline-mail-source mail-source)))
259
260         (setq save-passwd
261               (y-or-n-p "Do you save password information to newsrc file? "))
262         
263         ;; Write to setting file.
264         (setq tmp-buffer (get-buffer-create "* Setting"))
265         (set-buffer "* Setting")
266         (erase-buffer)
267         (insert ";;\n");
268         (insert ";; This file is created by gnus-ofsetup.el\n")
269         (insert ";; Creation date : ")
270         (insert (current-time-string))
271         (insert "\n")
272         (insert ";;\n")
273
274         ;; write Basic setting
275         (insert "(setq gnus-offline-news-fetch-method '")
276         (insert (prin1-to-string gnus-offline-news-fetch-method))
277         (insert ")\n")
278         (insert "(setq gnus-offline-mail-fetch-method '")
279         (insert (prin1-to-string gnus-offline-mail-fetch-method))
280         (insert ")\n")
281         (insert "(setq gnus-offline-use-miee ")
282         (insert (prin1-to-string gnus-offline-use-miee))
283         (insert ")\n")
284         (insert "(setq gnus-offline-dialup-program ")
285         (insert (prin1-to-string gnus-offline-dialup-program))
286         (insert ")\n")
287
288         ;; write dialup/hangup program and options.
289         (if (stringp gnus-offline-dialup-program)
290             (progn
291               (insert "(setq gnus-offline-dialup-program-arguments '")
292               (insert (prin1-to-string gnus-offline-dialup-program-arguments))
293               (insert ")\n")))
294         (insert "(setq gnus-offline-hangup-program ")
295         (insert (prin1-to-string gnus-offline-hangup-program))
296         (insert ")\n")
297         (if (stringp gnus-offline-hangup-program)
298             (progn
299               (insert "(setq gnus-offline-hangup-program-arguments '")
300               (insert (prin1-to-string gnus-offline-hangup-program-arguments))
301               (insert ")\n")))
302
303         ;; write setting about MIEE.
304         (if gnus-offline-use-miee
305             (progn
306               (insert "(setq gnus-offline-mail-spool-directory ")
307               (insert (prin1-to-string gnus-offline-mail-spool-directory))
308               (insert ")\n")
309               (insert "(setq gnus-offline-news-spool-directory ")
310               (insert (prin1-to-string gnus-offline-news-spool-directory))
311               (insert ")\n")
312               (insert "(setq sendmail-to-spool-directory gnus-offline-mail-spool-directory)\n")
313               (insert "(setq news-spool-request-post-directory gnus-offline-news-spool-directory)\n")
314               (insert "(load \"miee\")\n")
315               (insert "(setq message-send-news-function '")
316               (insert (prin1-to-string message-send-news-function))
317               (insert ")\n")))
318
319         ;; write setting about nnspool and gnus-agent.
320         (if (equal gnus-offline-news-fetch-method 'nnspool)
321             (insert "(message-offline-state)\n")
322           (insert "(setq gnus-agent-directory ")
323           (insert (prin1-to-string gnus-agent-directory))
324           (insert ")\n"))
325
326         ;; write setting about queue type -- MIEE or nnagent.
327         (insert "(setq gnus-offline-drafts-queue-type '")
328         (insert (prin1-to-string gnus-offline-drafts-queue-type))
329         (insert ")\n")
330         (insert "(setq gnus-offline-MTA-type '")
331         (insert (prin1-to-string gnus-offline-MTA-type))
332         (insert ")\n")
333
334         ;; Offline setting for gnus-nntp-*
335         (insert "(setq gnus-nntp-service nil)\n")
336         (insert "(setq gnus-nntp-server nil)\n")
337
338         ;; Write setting about hooks.
339         (insert "(add-hook 'gnus-group-mode-hook 'gnus-offline-processed-by-timer t)\n")
340         (insert "(add-hook 'gnus-group-mode-hook 'gnus-offline-error-check t)\n")
341         (insert "(add-hook 'gnus-after-getting-new-news-hook 'gnus-offline-after-get-new-news)\n")
342         (insert "(add-hook 'gnus-after-getting-news-hook 'gnus-offline-after-get-new-news)\n")
343         (if (eq gnus-offline-news-fetch-method 'nnspool)
344             (progn
345               (insert "(add-hook 'after-getting-news-hook 'gnus-offline-nnspool-hangup-line)\n")
346               (insert "(add-hook 'gnus-before-startup-hook (lambda () (setq nnmail-spool-file nil)))\n")))
347         (insert "(add-hook 'message-send-hook 'gnus-offline-message-add-header)\n")
348         (insert "(autoload 'gnus-offline-setup \"gnus-offline\")\n")
349         (insert "(add-hook 'gnus-load-hook 'gnus-offline-setup)\n")
350
351         (if (not (locate-library "mail-source"))
352             (progn
353               ;; Write setting about pop3-fma.
354               (insert "(require 'pop3-fma)\n")
355               (insert "(add-hook 'message-send-hook 'pop3-fma-message-add-header)\n")
356               (insert "(setq pop3-fma-spool-file-alist '")
357               (insert (prin1-to-string pop3-fma-spool-file-alist))
358               (insert ")\n")
359               (insert "(setq pop3-fma-movemail-type '")
360               (insert (prin1-to-string pop3-fma-movemail-type))
361               (insert ")\n")
362               (if save-passwd
363                   (insert "(add-hook 'gnus-setup-news-hook \n    (lambda ()\n        (add-to-list 'gnus-variable-list 'pop3-fma-password)))\n"))
364               (if (eq pop3-fma-movemail-type 'exe)
365                   (progn
366                     (insert "(setq pop3-fma-movemail-arguments '")
367                     (insert (prin1-to-string pop3-fma-movemail-arguments))
368                     (insert ")\n"))))
369           ;; Write stting about mail-source.el
370           (insert "(setq gnus-offline-mail-source '")
371           (insert (prin1-to-string gnus-offline-mail-source))
372           (insert ")\n")
373           (insert "(setq nnmail-spool-file gnus-offline-mail-source)\n")
374           (insert "(require 'read-passwd)\n")
375           (insert "(setq mail-source-read-passwd 'read-pw-read-passwd)\n")
376           (insert "(add-hook 'gnus-setup-news-hook 'read-pw-set-mail-source-passwd-cache)\n")
377           (if save-passwd
378               (insert "(add-hook 'gnus-setup-news-hook \n    (lambda ()\n        (add-to-list 'gnus-variable-list 'mail-source-password-cache)))\n"))
379           )
380         (write-region (point-min) (point-max) gnus-offline-setting-file)
381         (kill-buffer "* Setting"))
382     )
383   (load gnus-offline-setting-file))
384 ;; gnus-ofsetup.el Ends here.