django发送和接收电子邮件?

时间:2009-04-08 15:38:54

标签: python django email pop3 django-email

我对django的电子邮件发送能力非常熟悉,但我没有看到任何关于它接收和处理来自用户的电子邮件的信息。这个功能可用吗?

一些谷歌搜索没有出现非常有希望的结果。虽然我找到了这个:Receive and send emails in python

我是否必须自己动手?如果是这样的话,我会比你说的更快地发布那个应用程序...无论你说什么。

感谢, 吉姆

更新:我不打算制作电子邮件服务器,我只需要添加一些功能,您可以将图像通过电子邮件发送到网站并将其弹出到您的帐户中。

3 个答案:

答案 0 :(得分:18)

有一个名为jutda-helpdesk的应用,它使用Python的poplibimaplib来处理传入的电子邮件。您只需拥有一个具有POP3或IMAP访问权限的帐户。

这是根据他们的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只是存储所有邮件服务器信息的对象,其余的应该非常清楚。

您可能需要检查poplibimaplib上的文档以获取邮件的特定部分,但希望这足以让您前进。

答案 1 :(得分:5)

我知道这个问题现在已经很久了,但我想我会添加以供你今后参考,你可能想给http://cloudmailin.com一个去。我们有相当多的django用户使用该系统,它应该比建议的解决方案更简单。

答案 2 :(得分:2)

Django真的是作为一个Web服务器(好吧,作为一个适合Web服务器的框架),而不是一个电子邮件服务器。我想你可以把一些代码放到一个启动电子邮件服务器的Django web应用程序中,使用你链接的问题中显示的那种代码,但我真的不推荐它;这是对动态网络编程功能的滥用。

通常的做法是使用单独的电子邮件和Web服务器,为此您需要查看类似Sendmail或(更好)Postfix的内容。对于POP3,我认为你还需要像Dovecot或Courier这样的东西。 (当收到电子邮件时,当然可以让电子邮件服务器通知您的Web应用程序,以便它可以对它们采取行动,如果这是您想要做的事情。)

编辑:回复您的评论:是的,您正在尝试制作(或至少使用)电子邮件服务器。电子邮件服务器只是一个接收电子邮件的程序(也可以发送它们,但你不需要它)。

你绝对可以在Python中编写一个小型电子邮件服务器,只接收这些电子邮件并将图像保存到文件系统或数据库或其他任何地方。 (可能值得问一个新问题,但是不要让它成为你的Django网络应用程序的一部分;把它作为自己独立的程序。