将邮件重定向到Python脚本的最佳方法是什么?
我想给我网站的用户提供一个功能,就是在注册时给他们分配一个邮箱地址(比如 firstname.lastname@mydomain.com),但我觉得通过一个网页邮箱程序来支持这么多邮箱账户并不现实。我也不确定我的网络主机是否会同意这样做。我真正想要的是能把这个邮箱无缝地整合进网站的整体系统中,因为这个邮箱主要是用来在网站内部发送消息,但我们也希望用户能使用真实的邮箱地址。所以我想的办法是,创建一个“接收所有邮件”的账户,在 mydomain 下,让这个邮箱查看收到的邮件,看看邮件是发给谁的,然后在系统中为用户添加一条消息。
所以,我有几个问题:
1) 这样做合适吗?找一个可以让我随意给我的域名分配邮箱的主机费用会有多高?我现在使用的是 WebFaction 的共享主机。
2) 如果这样做可以,那怎么把这个接收所有邮件的账户和我的 Python 脚本连接起来?我听说过 .forward,但我对 UNIX 的东西不太熟悉。一旦我搞清楚了,怎么才能让这个脚本在“Django 环境”中运行,这样我就可以用 Django 的模型功能来为用户添加新消息?
3) Django 有没有什么可以让这个过程更简单的功能?
4) 在 Python 中有没有工具可以帮助我解析邮箱地址?它们是怎么工作的?
4 个回答
但是我觉得通过网页邮件程序来支持所有这些邮箱账户并不现实。
我觉得你的基本想法有点问题。其实,大多数“网页邮件”程序只是用来显示和操作后台邮件系统(比如postfix等)的界面。你需要看看你的网络主机是怎么设置的。其实没有理由不能通过程序来创建这些邮箱账户,然后让它们使用像SquirrelMail或RoundCube这样的普通网页邮件界面。举个例子,我的网络主机(bluehost)允许我创建2500个邮箱账户——我不确定你的主机能支持多少——但我可以花几美元一个月升级到无限制的账户。我认为使用内置的邮件处理功能会更可靠一些。
可以看看我在这个类似问题上的回答。里面有一些基本的代码,可以帮助你开始在Django中解析邮件。
编辑: 想了想,这里有代码:
有一个叫做jutda-helpdesk的应用,它使用Python的poplib
和imaplib
来处理收到的邮件。你只需要在某个地方有一个支持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
只是一个用来存储所有邮件服务器信息的对象,其他部分应该比较简单明了。
你可能需要查看一下poplib
和imaplib
的文档,以获取邮件的具体内容,但希望这些信息能帮助你入门。
直接回答你的问题:
1,2) 可以看看WebFaction网站上的这个常见问题解答。里面讲了怎么简单地把收到的邮件导入到你选择的脚本里。当你创建一个邮箱地址时,如果不指定用户名,就可以让这个邮箱接收发到这个域名的所有邮件。
3) 正如其他人提到的,你可以看看django-messages,不过也许Django Plugables会有更好的选择。
4) 可以查看一下email.parser模块,它可以处理大部分解析邮件时比较复杂的部分。