emacs-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

multiple POP support for RMAIL


From: Thien-Thi Nguyen
Subject: multiple POP support for RMAIL
Date: Sat, 21 Feb 2004 22:56:37 +0100

RMS asks in message:

 http://mail.gnu.org/archive/html/emacs-devel/2003-04/msg00216.html

if anyone wants to implement multiple POP support for RMAIL.

please find below a diff against cvs HEAD rmail.el that does the job, w/
the design constraint of being backward compatible w/ the user command
`rmail-set-pop-password'.  if this constraint can be avoided, it should
be possible to come up w/ a cleaner design, but IMHO it's not worth it.
(put enough design effort to RMAIL pop support and you wind up w/ Gnus
and/or the question of "why not use Gnus?".)

this has been tested (by an interested non-programmer emacs user -- i
don't use POP mail personally so i don't have a way to test it w/ cvs
HEAD) by back porting the change to 21.3 rmail.el.

here is a small blurb that can be massaged into the docs:

 If you wish to receive mail from more than one POP
 account, you must set @code{rmail-pop-password} to
 nil, @code{rmail-pop-password-required} non-nil, and
 include appropriate @code{po:USER:HOSTNAME} entries
 in @code{rmail-primary-inbox-list}.  This causes
 Emacs to prompt you for each account's password once
 per session; there is currently no way to specify
 multiple passwords non-interactively.

that last part sticks in my craw a bit, but fwiw the tester doesn't seem
to mind the extra interaction w/ emacs in exchange for the new support.

thi




Index: rmail.el
===================================================================
RCS file: /cvsroot/emacs/emacs/lisp/mail/rmail.el,v
retrieving revision 1.385
diff -c -p -w -c -r1.385 rmail.el
*** rmail.el    17 Feb 2004 19:54:49 -0000      1.385
--- rmail.el    19 Feb 2004 08:43:13 -0000
*************** unknown user name or bad password"
*** 122,127 ****
--- 122,129 ----
  If you get an incorrect-password error that this expression does not match,
  please report it with \\[report-emacs-bug].")

+ ;; Alist associating pop server w/ password.  If there is only one pop server
+ ;; specified in `rmail-primary-inbox-list', key `t' is used for that.
  (defvar rmail-encoded-pop-password nil)

  (defcustom rmail-preserve-inbox nil
*************** It returns t if it got any new messages.
*** 1518,1524 ****
    (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 password)
      (while files
        ;; Handle POP mailbox names specially; don't expand as filenames
        ;; in case the userid contains a directory separator.
--- 1520,1532 ----
    (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 password
!              ;; wasteful --ttn
!              (popcount (apply '+ (mapcar (function
!                                           (lambda (file)
!                                             (if (string-match "^po:" file)
!                                                 1 0)))
!                                          files))))
      (while files
        ;; Handle POP mailbox names specially; don't expand as filenames
        ;; in case the userid contains a directory separator.
*************** It returns t if it got any new messages.
*** 1557,1564 ****
                                             file)))))
        (cond (popmail
             (if rmail-pop-password-required
!                (progn (setq got-password (not (rmail-have-password)))
!                       (setq password (rmail-get-pop-password))))
             (if (memq system-type '(windows-nt cygwin))
                 ;; cannot have "po:" in file name
                 (setq tofile
--- 1565,1575 ----
                                             file)))))
        (cond (popmail
             (if rmail-pop-password-required
!                  (let ((host (unless (= 1 popcount)
!                                (string-match ".+:" file)
!                                (substring file (match-end 0)))))
!                    (setq got-password (not (rmail-have-password host)))
!                    (setq password (rmail-get-pop-password host))))
             (if (memq system-type '(windows-nt cygwin))
                 ;; cannot have "po:" in file name
                 (setq tofile
*************** TEXT and INDENT are not used."
*** 3824,3850 ****
  ; nor is it meant to be.

  ;;;###autoload
! (defun rmail-set-pop-password (password)
    "Set PASSWORD to be used for retrieving mail from a POP server."
    (interactive "sPassword: ")
    (if password
        (setq rmail-encoded-pop-password
!           (rmail-encode-string password (emacs-pid)))
      (setq rmail-pop-password nil)
      (setq rmail-encoded-pop-password nil)))

! (defun rmail-get-pop-password ()
    "Get the password for retrieving mail from a POP server.  If none
! has been set, then prompt the user for one."
!   (if (not rmail-encoded-pop-password)
!       (progn (if (not rmail-pop-password)
!                (setq rmail-pop-password (read-passwd "POP password: ")))
!            (rmail-set-pop-password rmail-pop-password)
!            (setq rmail-pop-password nil)))
!   (rmail-encode-string rmail-encoded-pop-password (emacs-pid)))
!
! (defun rmail-have-password ()
!   (or rmail-pop-password rmail-encoded-pop-password))

  (defun rmail-encode-string (string mask)
   "Encode STRING with integer MASK, by taking the exclusive OR of the
--- 3835,3871 ----
  ; nor is it meant to be.

  ;;;###autoload
! (defun rmail-set-pop-password (password &optional host)
    "Set PASSWORD to be used for retrieving mail from a POP server."
    (interactive "sPassword: ")
    (if password
        (setq rmail-encoded-pop-password
!             (cons (cons (or host t) (rmail-encode-string password 
(emacs-pid)))
!                   rmail-encoded-pop-password))
      (setq rmail-pop-password nil)
      (setq rmail-encoded-pop-password nil)))

! (defun rmail-get-pop-password (&optional host)
    "Get the password for retrieving mail from a POP server.  If none
! has been set, then prompt the user for one.  Optional arg HOST means
! this password is to be used for HOST only."
!   (when (or (not rmail-encoded-pop-password)
!             (and host (not (assoc host rmail-encoded-pop-password))))
!     (when (not rmail-pop-password)
!       (setq rmail-pop-password
!             (read-passwd (format "POP password%s: "
!                                  (if (stringp host)
!                                      (concat " for " host)
!                                    "")))))
!     (rmail-set-pop-password rmail-pop-password host)
!     (setq rmail-pop-password nil))
!   (rmail-encode-string (cdr (assoc (or host t) rmail-encoded-pop-password))
!                        (emacs-pid)))
!
! (defun rmail-have-password (&optional host)
!   (or rmail-pop-password
!       (and rmail-encoded-pop-password
!            (assoc (or host t) rmail-encoded-pop-password))))

  (defun rmail-encode-string (string mask)
   "Encode STRING with integer MASK, by taking the exclusive OR of the




reply via email to

[Prev in Thread] Current Thread [Next in Thread]