X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/e62e7654ac785834b72bfb8784ff34d203d3190f..60b0b6685e16dd58897922e7cecd95a821aedc38:/lisp/gnus/pop3.el diff --git a/lisp/gnus/pop3.el b/lisp/gnus/pop3.el index e288f6cace..333fb197b4 100644 --- a/lisp/gnus/pop3.el +++ b/lisp/gnus/pop3.el @@ -1,7 +1,7 @@ ;;; pop3.el --- Post Office Protocol (RFC 1460) interface -;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 -;; Free Software Foundation, Inc. +;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, +;; 2004, 2005, 2006, 2007 Free Software Foundation, Inc. ;; Author: Richard L. Pieri ;; Maintainer: FSF @@ -21,8 +21,8 @@ ;; 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, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. +;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +;; Boston, MA 02110-1301, USA. ;;; Commentary: @@ -38,7 +38,7 @@ (require 'mail-utils) (defgroup pop3 nil - "Post Office Protocol" + "Post Office Protocol." :group 'mail :group 'mail-source) @@ -46,26 +46,26 @@ (getenv "LOGNAME") (getenv "USER")) "*POP3 maildrop." - :version "21.4" ;; Oort Gnus + :version "22.1" ;; Oort Gnus :type 'string :group 'pop3) (defcustom pop3-mailhost (or (getenv "MAILHOST") ;; nil -> mismatch "pop3") "*POP3 mailhost." - :version "21.4" ;; Oort Gnus + :version "22.1" ;; Oort Gnus :type 'string :group 'pop3) (defcustom pop3-port 110 "*POP3 port." - :version "21.4" ;; Oort Gnus + :version "22.1" ;; Oort Gnus :type 'number :group 'pop3) (defcustom pop3-password-required t "*Non-nil if a password is required when connecting to POP server." - :version "21.4" ;; Oort Gnus + :version "22.1" ;; Oort Gnus :type 'boolean :group 'pop3) @@ -75,16 +75,27 @@ (defcustom pop3-authentication-scheme 'pass "*POP3 authentication scheme. -Defaults to 'pass, for the standard USER/PASS authentication. Other valid -values are 'apop." - :version "21.4" ;; Oort Gnus - :type '(choice (const :tag "USER/PASS" pass) +Defaults to `pass', for the standard USER/PASS authentication. The other +valid value is 'apop'." + :type '(choice (const :tag "Normal user/password" pass) (const :tag "APOP" apop)) + :version "22.1" ;; Oort Gnus :group 'pop3) (defcustom pop3-leave-mail-on-server nil - "*Non-nil if the mail is to be left on the POP server after fetching." - :version "21.4" ;; Oort Gnus + "*Non-nil if the mail is to be left on the POP server after fetching. + +If `pop3-leave-mail-on-server' is non-nil the mail is to be left +on the POP server after fetching. Note that POP servers maintain +no state information between sessions, so what the client +believes is there and what is actually there may not match up. +If they do not, then you may get duplicate mails or the whole +thing can fall apart and leave you with a corrupt mailbox." + ;; We can't use the UILD support from XEmacs mail-lib or cvs.m17n.org: + ;; http://thread.gmane.org/v9lld8fml4.fsf@marauder.physik.uni-ulm.de + ;; http://thread.gmane.org/b9yy8hzy9ej.fsf@jpl.org + ;; Any volunteer to re-implement this? + :version "22.1" ;; Oort Gnus :type 'boolean :group 'pop3) @@ -95,6 +106,32 @@ Used for APOP authentication.") (defvar pop3-read-point nil) (defvar pop3-debug nil) +;; Borrowed from nnheader-accept-process-output in nnheader.el. +(defvar pop3-read-timeout + (if (string-match "windows-nt\\|os/2\\|emx\\|cygwin" + (symbol-name system-type)) + ;; http://thread.gmane.org/v9655t3pjo.fsf@marauder.physik.uni-ulm.de + ;; + ;; IIRC, values lower than 1.0 didn't/don't work on Windows/DOS. + ;; + ;; There should probably be a runtime test to determine the timing + ;; resolution, or a primitive to report it. I don't know off-hand + ;; what's possible. Perhaps better, maybe the Windows/DOS primitive + ;; could round up non-zero timeouts to a minimum of 1.0? + 1.0 + 0.1) + "How long pop3 should wait between checking for the end of output. +Shorter values mean quicker response, but are more CPU intensive.") + +;; Borrowed from nnheader-accept-process-output in nnheader.el. +(defun pop3-accept-process-output (process) + (accept-process-output + process + (truncate pop3-read-timeout) + (truncate (* (- pop3-read-timeout + (truncate pop3-read-timeout)) + 1000)))) + (defun pop3-movemail (&optional crashbox) "Transfer contents of a maildrop to the specified CRASHBOX." (or crashbox (setq crashbox (expand-file-name "~/.crashbox"))) @@ -133,11 +170,14 @@ Used for APOP authentication.") (unless pop3-leave-mail-on-server (pop3-dele process n)) (setq n (+ 1 n)) - (if pop3-debug (sit-for 1) (sit-for 0.1)) - ) + (if pop3-debug (sit-for 1) (sit-for 0.1))) ; why? + (when (and pop3-leave-mail-on-server + (> n 1)) + (message "pop3.el doesn't support UIDL. Setting `pop3-leave-mail-on-server' +to %s might not give the result you'd expect." pop3-leave-mail-on-server) + (sit-for 1)) (pop3-quit process)) - (kill-buffer crashbuf) - ) + (kill-buffer crashbuf)) t) (defun pop3-get-message-count () @@ -207,7 +247,7 @@ Return the response string if optional second argument is non-nil." (goto-char pop3-read-point) (while (and (memq (process-status process) '(open run)) (not (search-forward "\r\n" nil t))) - (nnheader-accept-process-output process) + (pop3-accept-process-output process) (goto-char pop3-read-point)) (setq match-end (point)) (goto-char pop3-read-point) @@ -279,6 +319,8 @@ If NOW, use that time instead." ;; Date: 08 Jul 1996 23:22:24 -0400 ;; should be ;; Tue Jul 9 09:04:21 1996 + + ;; Fixme: This should use timezone on the date field contents. (setq date (cond ((not date) "Tue Jan 1 00:00:0 1900") @@ -315,12 +357,43 @@ If NOW, use that time instead." ;; AUTHORIZATION STATE +(eval-when-compile + (if (not (fboundp 'md5)) ;; Emacs 20 + (defalias 'md5 'ignore))) + +(eval-and-compile + (if (and (fboundp 'md5) + ;; There might be an incompatible implementation. + (condition-case nil + (md5 "Check whether the 4th argument is allowed" + nil nil 'binary) + (error nil))) + (defun pop3-md5 (string) + (md5 string nil nil 'binary)) + (defvar pop3-md5-program "md5" + "*Program to encode its input in MD5. +\"openssl\" is a popular alternative; set `pop3-md5-program-args' to +'(\"md5\") if you use it.") + (defvar pop3-md5-program-args nil + "*List of arguments passed to `pop3-md5-program'.") + (defun pop3-md5 (string) + (let ((default-enable-multibyte-characters t) + (coding-system-for-write 'binary)) + (with-temp-buffer + (insert string) + (apply 'call-process-region (point-min) (point-max) + pop3-md5-program t (current-buffer) nil + pop3-md5-program-args) + ;; The meaningful output is the first 32 characters. + ;; Don't return the newline that follows them! + (buffer-substring (point-min) (+ 32 (point-min)))))))) + (defun pop3-user (process user) "Send USER information to POP3 server." (pop3-send-command process (format "USER %s" user)) (let ((response (pop3-read-response process t))) (if (not (and response (string-match "+OK" response))) - (error (format "USER %s not valid" user))))) + (error "USER %s not valid" user)))) (defun pop3-pass (process) "Send authentication information to the server." @@ -345,28 +418,12 @@ If NOW, use that time instead." ;; TRANSACTION STATE -(eval-and-compile - (if (fboundp 'md5) - (defalias 'pop3-md5 'md5) - (defvar pop3-md5-program "md5" - "*Program to encode its input in MD5.") - - (defun pop3-md5 (string) - (with-temp-buffer - (insert string) - (call-process-region (point-min) (point-max) - pop3-md5-program - t (current-buffer) nil) - ;; The meaningful output is the first 32 characters. - ;; Don't return the newline that follows them! - (buffer-substring (point-min) (+ 32 (point-min))))))) - (defun pop3-stat (process) "Return the number of messages in the maildrop and the maildrop's size." (pop3-send-command process "STAT") (let ((response (pop3-read-response process t))) - (list (string-to-int (nth 1 (split-string response " "))) - (string-to-int (nth 2 (split-string response " ")))) + (list (string-to-number (nth 1 (split-string response " "))) + (string-to-number (nth 2 (split-string response " ")))) )) (defun pop3-list (process &optional msg) @@ -381,8 +438,7 @@ This function currently does nothing.") (save-excursion (set-buffer (process-buffer process)) (while (not (re-search-forward "^\\.\r\n" nil t)) - ;; Fixme: Shouldn't depend on nnheader. - (nnheader-accept-process-output process) + (pop3-accept-process-output process) (goto-char start)) (setq pop3-read-point (point-marker)) ;; this code does not seem to work for some POP servers... @@ -417,7 +473,7 @@ This function currently does nothing.") "Return highest accessed message-id number for the session." (pop3-send-command process "LAST") (let ((response (pop3-read-response process t))) - (string-to-int (nth 1 (split-string response " "))) + (string-to-number (nth 1 (split-string response " "))) )) (defun pop3-rset (process)