;;; epop3mail.el --- retrieve mail using epop3.el ("extended" pop3.el) ;; ;; Author: Franklin Lee ;; Created: 11/1997 ;; Keywords: mail pop3 ;; Version: 0.8 ;; ;; Copyright (C) 1997, 1998 Franklin Lee ;; ;; This program is free software; you can redistribute it and/or modify it ;; under the terms of the GNU General Public License as published by the ;; Free Software Foundation; either version 2, or (at your option) any ;; later version. ;; ;; epop3mail.el is distributed in the hope that it will be useful, but ;; WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ;; General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License along ;; with GNU Emacs; see the file COPYING. If not, write to the Free ;; Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. ;; ;;; Commentary: ;; The following redefines `rmail-insert-inbox-text' so that it will ;; call `epop3-mail' rather than movemail. ;; ;; This is the emacs 20.2 version ;; ;;; History: ;; -------- ;; ;; 2/15/1997 broke this out to a separate file from epop3mail. ;;; Code: ;; ;; Look for "pop3-mail change" in comment ;; (defun rmail-insert-inbox-text (files renamep) ;; Detect a locked file now, so that we avoid moving mail ;; out of the real inbox file. (That could scare people.) (or (memq (file-locked-p buffer-file-name) '(nil t)) (error "RMAIL file %s is locked" (file-name-nondirectory buffer-file-name))) (let (file tofile delete-files movemail popmail got-password) (while files (setq file (file-truename (expand-file-name (substitute-in-file-name (car files)))) tofile (expand-file-name ;; Generate name to move to from inbox name, ;; in case of multiple inboxes that need moving. (concat ".newmail-" (file-name-nondirectory file)) ;; Use the directory of this rmail file ;; because it's a nuisance to use the homedir ;; if that is on a full disk and this rmail ;; file isn't. (file-name-directory (expand-file-name buffer-file-name)))) ;; Always use movemail to rename the file, ;; since there can be mailboxes in various directories. (setq movemail t) ;;; ;; If getting from mail spool directory, ;;; ;; use movemail to move rather than just renaming, ;;; ;; so as to interlock with the mailer. ;;; (setq movemail (string= file ;;; (file-truename ;;; (concat rmail-spool-directory ;;; (file-name-nondirectory file))))) (setq popmail (string-match "^po:" (file-name-nondirectory file))) (if popmail (setq file (file-name-nondirectory file) renamep t)) (if movemail (progn ;; On some systems, /usr/spool/mail/foo is a directory ;; and the actual inbox is /usr/spool/mail/foo/foo. (if (file-directory-p file) (setq file (expand-file-name (user-login-name) file))))) (cond (popmail (if (and rmail-pop-password-required (not rmail-pop-password)) (setq rmail-pop-password (rmail-read-passwd (format "Password for %s: " (substring file (+ popmail 3)))) got-password t)) (if (eq system-type 'windows-nt) ;; cannot have "po:" in file name (setq tofile (expand-file-name (concat ".newmail-pop-" (substring file (+ popmail 3))) (file-name-directory (expand-file-name buffer-file-name))))) (message "Getting mail from post office ...")) ((and (file-exists-p tofile) (/= 0 (nth 7 (file-attributes tofile)))) (message "Getting mail from %s..." tofile)) ((and (file-exists-p file) (/= 0 (nth 7 (file-attributes file)))) (message "Getting mail from %s..." file))) ;; Set TOFILE if have not already done so, and ;; rename or copy the file FILE to TOFILE if and as appropriate. (cond ((not renamep) (setq tofile file)) ((or (file-exists-p tofile) (and (not popmail) (not (file-exists-p file)))) nil) ((and (not movemail) (not popmail)) ;; Try copying. If that fails (perhaps no space) and ;; we're allowed to blow away the inbox, rename instead. (if rmail-preserve-inbox (copy-file file tofile nil) (condition-case nil (copy-file file tofile nil) (error ;; Third arg is t so we can replace existing file TOFILE. (rename-file file tofile t)))) ;; Make the real inbox file empty. ;; Leaving it deleted could cause lossage ;; because mailers often won't create the file. (if (not rmail-preserve-inbox) (condition-case () (write-region (point) (point) file) (file-error nil)))) ;; <<<<<<<< pop3-mail change >>>>>>>> ;; Don't run movemail to pop mail for user@host, use elisp ((string-match "@" file) (epop3-mail file tofile)) ;; <<<<<<<< end of pop3-mail change >>>>>>>> (t (let ((errors nil)) (unwind-protect (save-excursion (setq errors (generate-new-buffer " *rmail loss*")) (buffer-disable-undo errors) (let ((args (append (list (or rmail-movemail-program (expand-file-name "movemail" exec-directory)) nil errors nil) (if rmail-preserve-inbox (list "-p") nil) (list file tofile) (if rmail-pop-password (list rmail-pop-password) nil)))) (apply 'call-process args)) (if (not (buffer-modified-p errors)) ;; No output => movemail won nil (set-buffer errors) (subst-char-in-region (point-min) (point-max) ?\n ?\ ) (goto-char (point-max)) (skip-chars-backward " \t") (delete-region (point) (point-max)) (goto-char (point-min)) (if (looking-at "movemail: ") (delete-region (point-min) (match-end 0))) (beep t) (message "movemail: %s" (buffer-substring (point-min) (point-max))) ;; If we just read the password, most likely it is ;; wrong. Otherwise, see if there is a specific ;; reason to think that the problem is a wrong passwd. (if (or got-password (re-search-forward rmail-pop-password-error nil t)) (setq rmail-pop-password nil)) (sit-for 3) nil)) (if errors (kill-buffer errors)))))) ;; At this point, TOFILE contains the name to read: ;; Either the alternate name (if we renamed) ;; or the actual inbox (if not renaming). (if (file-exists-p tofile) (let ((coding-system-for-read 'no-conversion) size) (goto-char (point-max)) (setq size (nth 1 (insert-file-contents tofile))) (goto-char (point-max)) (or (= (preceding-char) ?\n) (zerop size) (insert ?\n)) (if (not (and rmail-preserve-inbox (string= file tofile))) (setq delete-files (cons tofile delete-files))))) (message "") (setq files (cdr files))) delete-files)) ;;; epop3-riit20.el ends here