在球拍中使用IMAP阅读电子邮件

时间:2012-03-24 22:26:44

标签: imap racket

我使用以下代码来建立IMAP连接。我想阅读电子邮件。我读了这篇文档 link 并且无法从这里继续。

我的代码:

#lang racket

(define imap-server "*****")
(define imap-port-no ***)
(define username "*****")
(define pw "*****")
(define mailbox-name "INBOX") 

(require openssl/mzssl
         net/imap
         mzlib/etc)

(define (test-connect)
  (let ([c (ssl-make-client-context)])
    (let-values ([(in out) (ssl-connect imap-server imap-port-no c)])
      (imap-connect* in out username pw mailbox-name))))

(define-values (imap cnt recent) (test-connect))

我收到了电子邮件的数量和最近的邮件数量。怎么从这里开始。我应该打电话来阅读电子邮件。 提前谢谢。

1 个答案:

答案 0 :(得分:4)

尝试这样的事情:

(imap-get-messages imap '(1) '(uid flags header body))

这应该返回一个包含标志所描述的“字段”的列表,其中header为您提供完整的标题部分,body是电子邮件正文。 (这只是一个快速的实验,看到事情正在发挥作用,你需要知道要检索哪些消息等等 - 所有这些都在the documentation中描述。)

这是一个完整的程序,它返回INBOX中每条消息所需的标题列表,其中每条消息都获得标题的列表及其值作为字符串。但请注意,电子邮件对于此类事情并不真正可靠 - 无论To:字段中出现什么内容,您都可以收到消息,并且还有许多其他标题具有相似的语义(例如,Resent-To:是与To:类似,有时会有一个Sender:标题比From:等更可靠。)

#lang racket/base

(define imap-server "imap.somewhere.com")
(define imap-port-no 1234)
(define username "----")
(define pw "----")
(define mailbox-name "INBOX")

(require racket/list openssl/mzssl net/imap net/head)

(define (test-connect)
  (let ([c (ssl-make-client-context)])
    (let-values ([(in out) (ssl-connect imap-server imap-port-no c)])
      (imap-connect* in out username pw mailbox-name))))

(define-values [imap messages recent] (test-connect))

(define (get-interesting-headers ns)
  (for/list ([x (imap-get-messages imap ns '(header))])
    (filter-map
     (λ (x)
       (define s
         (string->symbol (string-downcase (bytes->string/utf-8 (car x)))))
       (and (memq s '(from to date subject))
            (cons s (bytes->string/utf-8 (cdr x)))))
     (extract-all-fields (car x)))))
(get-interesting-headers (for/list ([i messages]) (add1 i)))