1 ;;; gnus-ofsetup.el --- Setup advisor for Offline reading for Mail/News.
3 ;;; $Id: gnus-ofsetup.el,v 1.1.2.19.4.1 1999-08-04 08:19:12 yamaoka Exp $
5 ;;; Copyright (C) 1998 Tatsuya Ichikawa
6 ;;; Author: Tatsuya Ichikawa <t-ichi@po.shiojiri.ne.jp>
8 ;;; This file is part of Semi-gnus.
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.
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.
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.
28 ;;; M-x load[RET]gnus-ofsetup
29 ;;; M-x gnus-setup-for-offline
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 gnus-offline-mail-spool-directory nil)
41 (defvar gnus-offline-news-spool-directory nil)
42 (defvar pop3-fma-spool-file-alist nil)
43 (defvar pop3-fma-movemail-type nil)
44 (defvar pop3-fma-movemail-arguments nil)
47 (defvar mail-source nil)
50 ;;; To silence byte compiler
52 (fboundp 'eval-when-compile)
56 (eval-region (point-min) (point)))
57 (let (case-fold-search)
61 (unless (boundp symbol)
62 (make-local-variable symbol)
63 (eval (list 'setq symbol nil)))))
66 sendmail-to-spool-directory
67 news-spool-request-post-directory
75 gnus-agent-handle-level
77 (make-local-variable 'byte-compile-warnings)
78 (setq byte-compile-warnings nil))))
80 (defun gnus-setup-for-offline ()
81 "*Set up Gnus for offline environment."
84 (if (not (file-exists-p gnus-offline-setting-file))
88 "Method for offline News reading (TAB to completion): "
89 '(("gnus-agent" 1) ("nnspool" 2))
93 (read-file-name "Dialup/Hangup program(type nil or null string you do not use): "))
96 "Select MTA type for sending mail (TAB to completion): "
97 '(("smtp" 1) ("sendmail" 2))
100 (read-from-minibuffer "How many e-mail address do you have: "))
102 (if (string-equal news-method "nnspool")
104 (setq use-miee (y-or-n-p "Use MIEE post/send message ")))
107 (if (string-equal news-method "gnus-agent")
108 (setq gnus-offline-news-fetch-method 'nnagent)
109 (setq gnus-offline-news-fetch-method 'nnspool))
111 (setq gnus-offline-mail-fetch-method mail-method)
112 (setq gnus-offline-use-miee use-miee)
115 (if (or (string-equal program "nil")
116 (string-equal program ""))
118 (setq gnus-offline-hangup-program nil)
119 (setq gnus-offline-dialup-program nil))
121 (read-from-minibuffer "Dialup program options: ")))
122 (setq gnus-offline-dialup-program-arguments
123 (split-string options "[\t ]+")))
125 (read-from-minibuffer "Hangup program options: ")))
126 (setq gnus-offline-hangup-program-arguments
127 (split-string options "[\t ]+")))
128 (setq gnus-offline-hangup-program program)
129 (setq gnus-offline-dialup-program program))
131 ;; Set spool directory for outgoing messages.
134 ;; Setting for MIEE with nnspool.
136 (read-from-minibuffer
137 "News spool directory for sending: "
138 "/usr/spool/news.out"))
140 (read-from-minibuffer
141 "Mail spool directory for sending: "
142 "/usr/spool/mail.out")))
143 (setq gnus-offline-mail-spool-directory mail-spool)
144 (setq gnus-offline-news-spool-directory news-spool)
145 (setq gnus-offline-drafts-queue-type 'miee)
147 (gnus-ofsetup-prepare-for-miee)))
149 ;; Set drafts type gnus-agent.
150 (setq gnus-offline-drafts-queue-type 'agent))
152 ;; Setting for gnus-agent.
153 (if (eq gnus-offline-news-fetch-method 'nnagent)
154 (let ((agent-directory
155 (read-from-minibuffer "Agent directory: " "~/News/agent")))
156 (setq gnus-agent-directory agent-directory)))
158 ;; Determin MTA type.
159 (if (string-equal mta-type "smtp")
160 (setq gnus-offline-MTA-type 'smtp)
161 (setq gnus-offline-MTA-type 'sendmail)
164 ;; Set E-Mail Address and pop3 movemail type.
165 (setq i (string-to-int num-of-address))
167 (if (not (locate-library "mail-source"))
175 (read-from-minibuffer
176 "Email address (user@mailhost): "))
178 "Authentification Method (TAB to completion): "
179 '(("pass" 1) ("apop" 2)) nil t nil)))))
181 ;; Replace "hoge" -> 'hoge
184 (if (string-equal (nth 1 x) "pass")
185 (setcar (cdr x) 'pass)
186 (setcar (cdr x) 'apop)))
188 (setq pop3-fma-spool-file-alist address)
189 ;; Set movemail type.
192 "Select movemail type for retreave mail (TAB to completion): "
193 '(("exe" 1) ("lisp" 2))
196 (if (string-equal movemail-type "exe")
198 (read-from-minibuffer "movemail options: ")))
199 (setq pop3-fma-movemail-arguments (split-string options "[\t ]+"))))
200 (if (string-equal movemail-type "exe")
201 (setq pop3-fma-movemail-type 'exe)
202 (setq pop3-fma-movemail-type 'lisp))))
204 ;; Use mail-source.el
205 (setq mail-source nil)
207 (let ((user (read-from-minibuffer "Mail Account name : "))
208 (server (read-from-minibuffer "Mail server : "))
209 (auth (completing-read
210 "Authentification Method (TAB to completion): "
211 '(("password") ("apop")) nil t nil))
212 (islisp (y-or-n-p "Do you use pop3.el to fetch mail? "))
215 (let ((prog (read-file-name "movemail program name: "
216 exec-directory "movemail"))
217 (args (read-from-minibuffer "movemail options: "
219 (setq source (list 'pop
222 :program (format "%s %s %s %s %s"
228 (setq source (list 'pop
234 (if (string-equal "apop" auth)
235 (nconc source '(:authentication apop))
238 (setq gnus-offline-mail-source mail-source)))
241 (y-or-n-p "Do you save password information to newsrc file? "))
243 (gnus-ofsetup-write-setting-file)))
244 (load gnus-offline-setting-file))
246 (defun gnus-ofsetup-prepare-for-miee ()
248 (if (not (boundp 'miee-version))
250 ;; Set news post function for MIEE.
251 (setq message-send-news-function 'gnspool-request-post)
252 ;; Spool directory setting - MIEE.
253 (if (not (file-exists-p gnus-offline-mail-spool-directory))
254 (make-directory gnus-offline-mail-spool-directory t))
255 (setq sendmail-to-spool-directory
256 gnus-offline-mail-spool-directory)
257 (if (not (file-exists-p gnus-offline-news-spool-directory))
258 (make-directory gnus-offline-news-spool-directory t))
259 (setq news-spool-request-post-directory
260 gnus-offline-news-spool-directory))
262 (defun gnus-ofsetup-write-setting-file ()
263 ;; Write to setting file.
264 (setq tmp-buffer (get-buffer-create "* Setting"))
265 (set-buffer "* Setting")
268 (insert ";; This file is created by gnus-ofsetup.el\n")
269 (insert ";; Creation date : ")
270 (insert (current-time-string))
274 ;; write Basic setting
275 (insert "(setq gnus-offline-news-fetch-method '")
276 (insert (prin1-to-string gnus-offline-news-fetch-method))
278 (insert "(setq gnus-offline-mail-fetch-method '")
279 (insert (prin1-to-string gnus-offline-mail-fetch-method))
281 (insert "(setq gnus-offline-use-miee ")
282 (insert (prin1-to-string gnus-offline-use-miee))
284 (insert "(setq gnus-offline-dialup-program ")
285 (insert (prin1-to-string gnus-offline-dialup-program))
288 ;; write dialup/hangup program and options.
289 (if (stringp gnus-offline-dialup-program)
291 (insert "(setq gnus-offline-dialup-program-arguments '")
292 (insert (prin1-to-string gnus-offline-dialup-program-arguments))
294 (insert "(setq gnus-offline-hangup-program ")
295 (insert (prin1-to-string gnus-offline-hangup-program))
297 (if (stringp gnus-offline-hangup-program)
299 (insert "(setq gnus-offline-hangup-program-arguments '")
300 (insert (prin1-to-string gnus-offline-hangup-program-arguments))
303 (if (boundp 'gnus-offline-interval-time)
305 (insert "(setq gnus-offline-interval-time ")
306 (insert (prin1-to-string gnus-offline-interval-time))
309 ;; write setting about MIEE.
310 (if gnus-offline-use-miee
312 (insert "(setq gnus-offline-mail-spool-directory ")
313 (insert (prin1-to-string gnus-offline-mail-spool-directory))
315 (insert "(setq gnus-offline-news-spool-directory ")
316 (insert (prin1-to-string gnus-offline-news-spool-directory))
318 (insert "(setq sendmail-to-spool-directory gnus-offline-mail-spool-directory)\n")
319 (insert "(setq news-spool-request-post-directory gnus-offline-news-spool-directory)\n")
320 (insert "(load \"miee\")\n")
321 (insert "(setq message-send-news-function '")
322 (insert (prin1-to-string message-send-news-function))
325 ;; write setting about nnspool and gnus-agent.
326 (if (equal gnus-offline-news-fetch-method 'nnspool)
327 (insert "(message-offline-state)\n")
328 (insert "(setq gnus-agent-directory ")
329 (insert (prin1-to-string gnus-agent-directory))
332 ;; write setting about queue type -- MIEE or nnagent.
333 (insert "(setq gnus-offline-drafts-queue-type '")
334 (insert (prin1-to-string gnus-offline-drafts-queue-type))
336 (insert "(setq gnus-offline-MTA-type '")
337 (insert (prin1-to-string gnus-offline-MTA-type))
340 ;; Offline setting for gnus-nntp-*
341 (insert "(setq gnus-nntp-service nil)\n")
342 (insert "(setq gnus-nntp-server nil)\n")
344 ;; Write setting about hooks.
345 (insert "(add-hook 'gnus-group-mode-hook 'gnus-offline-processed-by-timer t)\n")
346 (insert "(add-hook 'gnus-group-mode-hook 'gnus-offline-error-check t)\n")
347 (insert "(add-hook 'gnus-after-getting-new-news-hook 'gnus-offline-after-get-new-news)\n")
348 (insert "(add-hook 'gnus-after-getting-news-hook 'gnus-offline-after-get-new-news)\n")
349 (if (eq gnus-offline-news-fetch-method 'nnspool)
351 (insert "(add-hook 'after-getting-news-hook 'gnus-offline-nnspool-hangup-line)\n")
352 (insert "(add-hook 'gnus-before-startup-hook (lambda () (setq nnmail-spool-file nil)))\n")))
353 (insert "(add-hook 'message-send-hook 'gnus-offline-message-add-header)\n")
354 (insert "(autoload 'gnus-offline-setup \"gnus-offline\")\n")
355 (insert "(add-hook 'gnus-load-hook 'gnus-offline-setup)\n")
357 (if (not (locate-library "mail-source"))
359 ;; Write setting about pop3-fma.
360 (insert "(require 'pop3-fma)\n")
361 (insert "(add-hook 'message-send-hook 'pop3-fma-message-add-header)\n")
362 (insert "(setq pop3-fma-spool-file-alist '")
363 (insert (prin1-to-string pop3-fma-spool-file-alist))
365 (insert "(setq pop3-fma-movemail-type '")
366 (insert (prin1-to-string pop3-fma-movemail-type))
369 (insert "(add-hook 'gnus-setup-news-hook \n (lambda ()\n (setq pop3-fma-save-password-information t)\n (add-to-list 'gnus-variable-list 'pop3-fma-password)))\n"))
370 (if (eq pop3-fma-movemail-type 'exe)
372 (insert "(setq pop3-fma-movemail-arguments '")
373 (insert (prin1-to-string pop3-fma-movemail-arguments))
375 ;; Write stting about mail-source.el
376 (insert "(setq gnus-offline-mail-source '")
377 (insert (prin1-to-string gnus-offline-mail-source))
379 (insert "(setq nnmail-spool-file gnus-offline-mail-source)\n")
380 (insert "(require 'read-passwd)\n")
381 (insert "(setq mail-source-read-passwd 'read-pw-read-passwd)\n")
382 (insert "(add-hook 'gnus-setup-news-hook 'read-pw-set-mail-source-passwd-cache)\n")
384 (insert "(add-hook 'gnus-setup-news-hook \n (lambda ()\n (add-to-list 'gnus-variable-list 'mail-source-password-cache)))\n"))
386 (write-region (point-min) (point-max) gnus-offline-setting-file)
387 (kill-buffer "* Setting"))
390 ;;; Suppport for customizing gnus-ofsetup parameters.
392 (autoload 'gnus-custom-mode "gnus-cus" nil t)
394 (defun gnus-ofsetup-parameters ()
395 "Return alist of gnus-offline configuration parameters."
397 (choice :tag "News Method" :value ,gnus-offline-news-fetch-method
398 (const :tag "Gnus Agent" nnagent)
399 (const :tag "nnspool" nnspool)) "\
400 Method to fetch news articles.")
403 (choice :tag "Dialup Program" :value ,gnus-offline-dialup-program
404 (string :tag "Use Program..")
405 (const :tag "Don't auto-dial." nil)) "\
406 Program which does dial.")
409 (repeat :tag "Dialup Program Arguments"
410 :value ,gnus-offline-dialup-program-arguments
411 (string :tag "Argument"))"\
412 Program arguments of gnus-offline-dialup-program.")
415 (choice :tag "Hangup Program" :value ,gnus-offline-hangup-program
416 (string :tag "Use Program..")
417 (const :tag "Don't auto-hangup." nil)) "\
418 Program which does hangup.")
421 (repeat :tag "Hangup Program Arguments"
422 :value ,gnus-offline-hangup-program-arguments
423 (string :tag "Argument")) "\
424 Program arguments of gnus-offline-hangup-program.")
427 (integer :tag "Interval between Jobs"
428 :value ,gnus-offline-interval-time) "\
429 Interval time(minutes) to do online jobs.
430 If set to 0 , timer call is disabled.")
433 (choice :tag "Drafts Queue Type" :value ,gnus-offline-drafts-queue-type
434 (const :tag "Gnus Draft for queuing." agent)
435 (const :tag "I prefer MIEE for queuing." miee)) "\
436 Type of queue used for draft messages.
438 If the select method for news is nnspool, you must choose MIEE.
439 MIEE is another library for offline messaging. It isn't part of
440 Semi-gnus. If you want to know about MIEE, see README-offline.{en,ja}.")
443 (directory :tag "Mail Spool Directory for MIEE"
444 :value ,(cond (gnus-offline-mail-spool-directory
445 gnus-offline-mail-spool-directory)
446 ((and (boundp 'sendmail-to-spool-directory)
447 sendmail-to-spool-directory)
448 sendmail-to-spool-directory)
452 (directory :tag "News Spool Directory for MIEE"
453 :value ,(cond (gnus-offline-news-spool-directory
454 gnus-offline-news-spool-directory)
455 ((and (boundp 'news-spool-request-post-directory)
456 news-spool-request-post-directory)
457 news-spool-request-post-directory)
461 (choice :tag "MTA Type" :value ,gnus-offline-MTA-type
462 (const :tag "Use smtp.el" smtp)
463 (const :tag "Use sendmail" sendmail)) "\
464 Type of MTA used for sending mail.")
467 (choice :tag "Save Password in Startup File"
468 :value ,(if (memq 'mail-source-password-cache gnus-variable-list)
471 (const :tag "OK, I'm sure it's safe." t)
472 (const :tag "No way, it's too dangerous!" nil)) "\
473 Whether you want your POP passwords written in .newsrc.eld or not.")
476 (sexp :tag "Mail Sources" :value ,gnus-offline-mail-source) "\
477 Information of mail sources. Actually, a list of `Mail Source Specifiers'.
479 The format of this variable is just the same as `mail-sources' (or
480 `nnmail-spool-file' which seems obsolete).
482 `Mail Source Specifiers' can take a lot of keywords. For example,
483 if you want to use movemail instead of pop3.el which comes with
484 Gnus, you can set a specifier using the kerword :program as shown
487 (pop :program \"movemail -pf po:%u %t %p\")
489 If you want to know more about mail source specifiers and keywords,
490 click the button below.")))
492 (defun gnus-ofsetup-customize ()
493 "Edit the gnus-offline parameters."
495 (let* ((params (gnus-ofsetup-parameters))
496 (types (mapcar (lambda (entry)
497 `(cons :format "%v%h\n"
499 (const :format "" ,(nth 0 entry))
503 (kill-buffer (gnus-get-buffer-create "*Gnus Offline Customize*"))
504 (switch-to-buffer (gnus-get-buffer-create "*Gnus Offline Customize*"))
506 (widget-insert "Customize the Gnus Offline Parameters, and press ")
507 (widget-create 'push-button
509 :help-echo "Push me when done customizing."
510 :action 'gnus-ofsetup-customize-done)
511 (widget-insert "\n\n")
512 (make-local-variable 'gnus-ofsetup-params)
513 (setq gnus-ofsetup-params
514 (widget-create 'group
520 These paramerters will be saved in ~/.gnus-offline.el.
522 Note: Touching these parameters may require Gnus or even Emacs to be
526 (widget-create 'info-link
527 :help-echo "Push me to learn more."
528 :tag "<Info> mail sources"
529 "(gnus)Mail Sources")
531 (use-local-map widget-keymap)
532 (local-set-key "q" 'bury-buffer)
534 (goto-char (point-min))))
536 (defun gnus-ofsetup-customize-done (&rest ignore)
537 "Apply changes and bury the buffer."
539 (let ((params (widget-value gnus-ofsetup-params))
540 (combi '((news-method . gnus-offline-news-fetch-method)
541 (dialup-program . gnus-offline-dialup-program)
542 (dialup-prog-args . gnus-offline-dialup-program-arguments)
543 (hangup-program . gnus-offline-hangup-program)
544 (hangup-prog-args . gnus-offline-hangup-program-arguments)
545 (interval . gnus-offline-interval-time)
546 (draft-type . gnus-offline-drafts-queue-type)
547 (mail-spool . gnus-offline-mail-spool-directory)
548 (news-spool . gnus-offline-news-spool-directory)
549 (mta-type . gnus-offline-MTA-type)
550 (mail-source . gnus-offline-mail-source)
551 (save-password . save-passwd)))
552 (save-passwd (and (memq 'mail-source-password-cache gnus-variable-list)
555 (gnus-message 4 "(No changes need to be saved)")
559 (set (cdr (assq sym combi)) val)
560 (cond ((eq sym 'news-method)
561 (if (eq val 'nnspool)
562 (setq gnus-offline-use-miee t)))
563 ((eq sym 'draft-type)
564 (setq gnus-offline-use-miee
565 (if (eq val 'miee) t nil)))
566 ((eq sym 'save-password)
568 (add-to-list 'gnus-variable-list
569 'mail-source-password-cache)
570 (setq gnus-variable-list
571 (delq 'mail-source-password-cache
572 gnus-variable-list)))))))
574 (if (and (eq gnus-offline-news-fetch-method 'nnspool)
575 (not (eq gnus-offline-drafts-queue-type 'miee)))
576 (error "Invalid parameters. Check the news method and drafts queue type."))
577 (if gnus-offline-use-miee
578 (gnus-ofsetup-prepare-for-miee))
579 (gnus-ofsetup-write-setting-file)))
581 (switch-to-buffer gnus-group-buffer))
583 ;; gnus-ofsetup.el Ends here.