Function: mail-source-fetch-pop

mail-source-fetch-pop is a byte-compiled function defined in mail-source.el.gz.

Signature

(mail-source-fetch-pop SOURCE CALLBACK)

Documentation

Fetcher for single-file sources.

Source Code

;; Defined in /usr/src/emacs/lisp/gnus/mail-source.el.gz
(defun mail-source-fetch-pop (source callback)
  "Fetcher for single-file sources."
  (mail-source-bind (pop source)
    ;; fixme: deal with stream type in format specs
    (mail-source-run-script
     prescript
     `((?p . ,password) (?t . ,mail-source-crash-box)
       (?s . ,server) (?P . ,port) (?u . ,user))
     prescript-delay)
    (let ((from (format "%s:%s:%s" server user port))
	  (mail-source-string (format "pop:%s@%s" user server))
	  (process-environment (if server
				   (cons (concat "MAILHOST=" server)
					 process-environment)
				 process-environment))
	  result)
      (when (eq authentication 'password)
	(setq password
	      (or password
		  (cdr (assoc from mail-source-password-cache))
		  (read-passwd
		   (format "Password for %s at %s: " user server)))))
      (setq result
	    (cond
	     (program
	      (mail-source-fetch-with-program
	       (format-spec
		program
                `((?p . ,password) (?t . ,mail-source-crash-box)
                  (?s . ,server) (?P . ,port) (?u . ,user)))))
	     (function
	      (funcall function mail-source-crash-box))
	     ;; The default is to use pop3.el.
	     (t
	      (require 'pop3)
	      (dlet ((pop3-password password)
		     (pop3-maildrop user)
		     (pop3-mailhost server)
		     (pop3-port port)
		     (pop3-authentication-scheme
		      (if (eq authentication 'apop) 'apop 'pass))
		     (pop3-stream-type stream)
		     (pop3-leave-mail-on-server leave))
		(if (or debug-on-quit debug-on-error)
		    (save-excursion (pop3-movemail mail-source-crash-box))
		  (condition-case err
		      (save-excursion (pop3-movemail mail-source-crash-box))
		    (error
		     ;; We nix out the password in case the error
		     ;; was because of a wrong password being given.
		     (setq mail-source-password-cache
			   (delq (assoc from mail-source-password-cache)
				 mail-source-password-cache))
		     (signal (car err) (cdr err)))))))))
      (if result
	  (progn
	    (when (eq authentication 'password)
	      (unless (assoc from mail-source-password-cache)
		(push (cons from password) mail-source-password-cache)))
	    (prog1
		(mail-source-callback callback server)
	      ;; Update display-time's mail flag, if relevant.
	      (if (equal source mail-source-primary-source)
		  (setq mail-source-new-mail-available nil))
	      (mail-source-run-script
	       postscript
               `((?p . ,password) (?t . ,mail-source-crash-box)
                 (?s . ,server) (?P . ,port) (?u . ,user)))
	      (mail-source-delete-crash-box)))
	;; We nix out the password in case the error
	;; was because of a wrong password being given.
	(setq mail-source-password-cache
	      (delq (assoc from mail-source-password-cache)
		    mail-source-password-cache))
	0))))