Чтение писем с использованием IMAP в ракетке - PullRequest
3 голосов
/ 25 марта 2012

Я использую следующий код, чтобы установить соединение IMAP.Я хочу читать электронные письма.Я прочитал эту документацию ссылка и не смог продолжить отсюда.

мой код:

#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 Ответ

4 голосов
/ 25 марта 2012

Попробуйте что-то вроде этого:

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

Это должно вернуть список, содержащий "поля", описанные флагами, где header дает вам полную часть заголовка, а body - это электронная почтатело.(Это всего лишь быстрый эксперимент, чтобы увидеть, что все работает, вам нужно знать, какие сообщения извлекать и т. Д. - все описано в документации .)

Вот полныйПрограмма, которая возвращает список заголовков, которые вы хотите для каждого сообщения в 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)))
...