2012-03-24 10 views
3

Ich verwende den folgenden Code, um eine IMAP-Verbindung herzustellen. Ich möchte E-Mails lesen. Ich lese diese Dokumentation link und konnte nicht von hier fortfahren.E-Mails mit IMAP im Rack lesen

mein Code:

#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)) 

ich die Anzahl der E-Mails und Zählung der letzten E-Mails von diesem zu bekommen. Wie gehe ich von hier aus vor? welche Funktionen ich aufrufen sollte, um E-Mails zu lesen. Vielen Dank im Voraus.

Antwort

4

versuchen, etwas wie folgt aus:

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

Dies sollte eine Liste zurück, die „Felder“ beschrieben durch die Flaggen halten, wo header Sie die komplette Kopfteil gibt, und body ist die E-Mail-Körper. (Dies ist nur ein schnelles Experiment, um zu sehen, dass die Dinge funktionieren, müssen Sie wissen, welche Nachrichten abgerufen werden, usw. - alle in the documentation beschrieben.)

Hier ist ein komplettes Programm, das eine Liste der Header Sie zurückgibt für jede Nachricht in der INBOX, wo jede Nachricht eine Alist der Header und ihrer Werte als Zeichenfolgen erhält. Beachten Sie jedoch, dass E-Mails für solche Dinge nicht wirklich zuverlässig sind. Sie können unabhängig davon, was im Feld To: angezeigt wird, eine Nachricht erhalten, und es gibt viele andere Header mit ähnlicher Semantik (z. B. Resent-To: ähnelt To:, manchmal gibt es eine Sender: Header, der zuverlässiger sein kann als From:, etc.).

#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))) 
+0

Vielen Dank für die Lösung. – chom

+0

Ich habe den Rückgabewert, wenn ich imap-get-messages nur mit Header-Feld aufrufen. Ich möchte nur Absender-E-Mail-Adresse, Empfänger-E-Mail-Adresse, Datum und Betreff von diesem Rückgabewert. Der Rückgabewert ist keine Zeichenfolge. Es ist eine Liste. Ich verstehe nicht, wie man diesen Teil von Daten aus einer Liste holt oder diese Liste in eine Zeichenkette umwandelt. Welchen Code soll ich verwenden, um diese Informationen zu erhalten? Danke im Voraus. – chom

+0

Aktualisiert mit Beispielcode. –