将邮件重定向到Python脚本的最佳方法是什么?

2 投票
4 回答
2275 浏览
提问于 2025-04-15 11:15

我想给我网站的用户提供一个功能,就是在注册时给他们分配一个邮箱地址(比如 firstname.lastname@mydomain.com),但我觉得通过一个网页邮箱程序来支持这么多邮箱账户并不现实。我也不确定我的网络主机是否会同意这样做。我真正想要的是能把这个邮箱无缝地整合进网站的整体系统中,因为这个邮箱主要是用来在网站内部发送消息,但我们也希望用户能使用真实的邮箱地址。所以我想的办法是,创建一个“接收所有邮件”的账户,在 mydomain 下,让这个邮箱查看收到的邮件,看看邮件是发给谁的,然后在系统中为用户添加一条消息。

所以,我有几个问题:

1) 这样做合适吗?找一个可以让我随意给我的域名分配邮箱的主机费用会有多高?我现在使用的是 WebFaction 的共享主机。
2) 如果这样做可以,那怎么把这个接收所有邮件的账户和我的 Python 脚本连接起来?我听说过 .forward,但我对 UNIX 的东西不太熟悉。一旦我搞清楚了,怎么才能让这个脚本在“Django 环境”中运行,这样我就可以用 Django 的模型功能来为用户添加新消息?
3) Django 有没有什么可以让这个过程更简单的功能?
4) 在 Python 中有没有工具可以帮助我解析邮箱地址?它们是怎么工作的?

4 个回答

0

但是我觉得通过网页邮件程序来支持所有这些邮箱账户并不现实。

我觉得你的基本想法有点问题。其实,大多数“网页邮件”程序只是用来显示和操作后台邮件系统(比如postfix等)的界面。你需要看看你的网络主机是怎么设置的。其实没有理由不能通过程序来创建这些邮箱账户,然后让它们使用像SquirrelMail或RoundCube这样的普通网页邮件界面。举个例子,我的网络主机(bluehost)允许我创建2500个邮箱账户——我不确定你的主机能支持多少——但我可以花几美元一个月升级到无限制的账户。我认为使用内置的邮件处理功能会更可靠一些。

2

可以看看我在这个类似问题上的回答。里面有一些基本的代码,可以帮助你开始在Django中解析邮件。

编辑: 想了想,这里有代码:

有一个叫做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的文档,以获取邮件的具体内容,但希望这些信息能帮助你入门。

4

直接回答你的问题:

1,2) 可以看看WebFaction网站上的这个常见问题解答。里面讲了怎么简单地把收到的邮件导入到你选择的脚本里。当你创建一个邮箱地址时,如果不指定用户名,就可以让这个邮箱接收发到这个域名的所有邮件。

3) 正如其他人提到的,你可以看看django-messages,不过也许Django Plugables会有更好的选择。

4) 可以查看一下email.parser模块,它可以处理大部分解析邮件时比较复杂的部分。

撰写回答