django pour envoyer et recevoir des e-mails?

je me suis familiarisé avec les capacités d'envoi d'e-mails de django, mais je n'ai rien vu à propos de la réception et du traitement des e-mails des utilisateurs. Cette fonctionnalité est disponible?

quelques recherches google n'ont pas donné des résultats très prometteurs. Bien que j'ai trouvé ceci: recevoir et envoyer des e-mails en python

est-ce que je vais devoir rouler le mien? si oui, je vais poster cette application plus vite que vous pouvez dire... ce que vous dites.

merci, Jim

update : Je n'essaie pas de faire un serveur de messagerie, j'ai juste besoin d'ajouter une fonctionnalité où vous pouvez envoyer une image au site et l'avoir pop up dans votre compte.

21
demandé sur Community 2009-04-08 19:38:53

3 réponses

il y a une application appelée jutda-helpdesk qui utilise les poplib et imaplib de Python pour traiter les e-mails entrants. Vous avez juste besoin d'avoir un compte quelque part avec un accès POP3 ou IMAP.

adapté de leur get_email.py :

def process_mail(mb):
    print "Processing: %s" % q
    if mb.email_box_type == 'pop3':
        if mb.email_box_ssl:
            if not mb.email_box_port: mb.email_box_port = 995
            server = poplib.POP3_SSL(mb.email_box_host, int(mb.email_box_port))
        else:
            if not mb.email_box_port: mb.email_box_port = 110
            server = poplib.POP3(mb.email_box_host, int(mb.email_box_port))
        server.getwelcome()
        server.user(mb.email_box_user)
        server.pass_(mb.email_box_pass)

        messagesInfo = server.list()[1]

        for msg in messagesInfo:
            msgNum = msg.split(" ")[0]
            msgSize = msg.split(" ")[1]
            full_message = "\n".join(server.retr(msgNum)[1])

            # Do something with the message

            server.dele(msgNum)
        server.quit()

    elif mb.email_box_type == 'imap':
        if mb.email_box_ssl:
            if not mb.email_box_port: mb.email_box_port = 993
            server = imaplib.IMAP4_SSL(mb.email_box_host, int(mb.email_box_port))
        else:
            if not mb.email_box_port: mb.email_box_port = 143
            server = imaplib.IMAP4(mb.email_box_host, int(mb.email_box_port))
        server.login(mb.email_box_user, mb.email_box_pass)
        server.select(mb.email_box_imap_folder)
        status, data = server.search(None, 'ALL')
        for num in data[0].split():
            status, data = server.fetch(num, '(RFC822)')
            full_message = data[0][1]

            # Do something with the message

            server.store(num, '+FLAGS', '\Deleted')
        server.expunge()
        server.close()
        server.logout()

mb est juste un objet pour stocker toutes les informations du serveur de messagerie, le reste devrait être assez clair.

probablement besoin de vérifier les docs sur poplib et imaplib pour obtenir des parties spécifiques du message, mais j'espère que c'est assez pour vous obtenir allant.

18
répondu tghw 2009-04-08 19:43:37

je sais que cette question est assez ancienne maintenant mais j'ai juste pensé que je voudrais ajouter pour référence future que vous pourriez vouloir donner http://cloudmailin.com a go. Nous avons pas mal d'utilisateurs de django qui utilisent le système et il devrait être un peu plus simple que la solution proposée.

5
répondu Steve Smith 2011-03-16 16:07:24

Django est vraiment conçu comme un serveur web (et bien, comme un framework qui s'adapte à un serveur web), et non comme un serveur de messagerie. Je suppose que vous pourriez mettre un peu de code dans une application web Django qui démarre un serveur de messagerie, en utilisant le genre de code montré dans cette question à laquelle vous avez fait référence, mais je ne le recommande vraiment pas; c'est un abus des capacités de la programmation web dynamique.

la pratique normale est d'avoir des serveurs de courrier électronique et web séparés, et pour cela vous voudrait regarder dans quelque chose comme Sendmail ou (mieux encore) Postfix. Pour POP3, vous auriez aussi besoin de quelque chose comme Dovecot ou Courier, je pense. (Il est certainement possible que le serveur de messagerie prévienne votre application web lorsque des e-mails sont reçus afin qu'elle puisse agir sur eux, si c'est ce que vous voulez faire.)

MODIFIER : en réponse à vos commentaires: oui vous essayez de faire (ou au moins utiliser) un serveur de messagerie. Un serveur de messagerie est juste un programme qui reçoit des e-mails (et peut être capable de les envoyer aussi, mais vous n'avez pas besoin de cela).

vous pouvez certainement écrire un petit serveur de messagerie en Python qui reçoit ces e-mails et sauvegarde les images dans le système de fichiers ou une base de données ou autre. (Peut-être vaut-il la peine de poser une nouvelle question, à propos de) mais ne l'intégrez pas à votre application web Django; gardez-la comme son propre programme séparé.

2
répondu David Z 2009-04-09 22:00:35