Thursday, February 11, 2010

KaMail and IMAP

KamailでGMAILのIMAPフォルダアクセスしても何も表示されなかったので、
imap.lの一部を下記のように変更した。正規表現の部分を直した。

Modified IMAP related part of KaMail (regular expression) as below.
用Kamail不能访问GMAIL的IMAP账户,原因是由于程序的正规表现有点问题。

(defun imap4-fetch (stream num &optional part)
  "IMAP4 FETCH"
  (unless part
    (setq part "RFC822"))
  (let ((return "")
    (flags "")
    mail
    last
    total)
    (message "Fetching ~A as ~A: " num part)
    (format (imapstream-stream stream) "~A FETCH ~A (FLAGS ~A)~%" (imap4-tag-increment stream) num part)
    (format *imap4-stream-output* "~A FETCH ~A (FLAGS ~A)~%" (imap4-tag-current stream) num part)
    (setq return (imap4-read-line stream))
    (if (string-match (format nil "^\*[ \t]+~A[ \t]+FETCH[ \t]+(\\(FLAGS[ \t]+(\\)*\\([^)]*\\))*[^{]*{\\([0-9]+\\)}" num) return)
    (progn
      (setq flags (substring return (match-beginning 2) (match-end 2)))
      (setq total (substring return (match-beginning 3) (match-end 3)))
      (setq return (imap4-read-line stream))
    )
      (return-from imap4-fetch nil))
    (kamail-interval-message (300)
      (while (not (string-match (concat "^" (imap4-tag-current stream) "[ \t]+\\(OK\\|NO\\|BAD\\)") return))
    (setq last (length return))
    (if mail
        (setq mail (concat mail "\n" return))
      (setq mail return))
    (message "Fetching ~A as ~A: ~D/~A" num part (length mail) total)
    (setq return (imap4-read-line stream)))
    )
    ;最後の行を取り除く
    (setq mail (substring mail 0 (- (length mail) last)))
    (message "~A" return)
    (values (imap4-return-ok-p stream return) mail flags total)
  )
)

(defun imap4-fetch-to-stream (stream num os)
  "IMAP4 FETCH"
  (let ((return "")
    (flags "")
    (part "RFC822")
    mail
    last
    (len 0)
    total)
    (message "Fetching ~A as ~A" num part)
    (format (imapstream-stream stream) "~A FETCH ~A (FLAGS ~A)~%" (imap4-tag-increment stream) num part)
    (format *imap4-stream-output* "~A FETCH ~A (FLAGS ~A)~%" (imap4-tag-current stream) num part)
    (setq return (imap4-read-line stream))
    (if (string-match (format nil "^\*[ \t]+~A[ \t]+FETCH[ \t]+(\\(FLAGS[ \t]+(\\)*\\([^)]*\\))*[^{]*{\\([0-9]+\\)}" num) return)
    (progn
      (setq flags (substring return (match-beginning 2) (match-end 2)))
      (setq total (substring return (match-beginning 3) (match-end 3))))
      (return-from imap4-fetch-to-stream nil))
    ;(msgbox "~S" total)
    (message "Fetching ~A as ~A ..." num part)
    (read-bytes-from-stream (imapstream-stream stream) os (parse-integer total))
    (while (not (string-match (concat "^" (imap4-tag-current stream) "[ \t]+\\(OK\\|NO\\|BAD\\)") return))
      (setq return (imap4-read-line stream)))
    (message "~A" return)
    (imap4-return-ok-p stream return)
  ))

No comments:

Post a Comment