在Django中,我想通过发送邮件插入数据库记录?
我在考虑为我的待办事项应用增加一个新功能……我觉得如果能通过发送邮件到一个特定的邮箱,把我需要完成的待办任务发过去,然后我的网页应用能读取这封邮件并把任务存入数据库,那就太好了……这样,当我登录我的应用时,我发的待办任务就会出现在应用里。
这可能实现吗?我有一个用 SliceHost 的服务器(其实就是一个专用服务器),所以我可以完全控制要安装什么。我现在使用的是Python/Django/MySQL。
有没有什么建议,告诉我该怎么做才能实现这个功能?
4 个回答
我以前解决这个问题的一种方法是使用qmail的.qmail
文件(文档)。
简单来说,你需要设置qmail,然后把你的邮箱地址(为了方便,假设你的邮箱是proc@whatever.com)指向你的主目录。在这个目录里,你需要创建一个.qmail-proc
文件来处理邮件。
这样,你就可以在自己的服务器上使用一个完整的SMTP服务器,包括垃圾邮件过滤、邮件转发、别名等各种功能。然后你可以把邮件中的数据传送到一个应用程序里。在你的情况下,我建议在Django中创建一个管理命令来处理邮件(我称它为proc_email
)。因此,你的.qmail-proc
文件可能看起来像这样:
/var/spool/mail/proc
| /www/django/myproject/manage.py proc_email
这个文件会把邮件的副本存储在/var/spool/mail/proc
中,然后把邮件传递给第二行的脚本。邮件内容通过sys.stdin
传递给proc_email
。你只需从那里读取邮件,并通过Django模型存储它。
如果你以后需要处理不同地址的邮件,你也可以设置别名,指向你的主目录,并为每个别名使用.qmail-<用户名>
文件。这样,如果需要的话,你可以将其他标志(比如每个别名的用户名)传递给proc_email
。
我得说明一下,这不是最简单的解决方案,但它可以扩展,并且相当可靠。
我也需要完全一样的东西。我使用Lamson项目(这是用Python写的)来处理电子邮件,比如根据规则转发邮件到我的www.evernote.com和thinking rock www.trgtd.com.au账户,更新防火墙的网页过滤规则,更新我的垃圾邮件过滤器的允许/拒绝列表,读取和写入数据库等等……
我喜欢把它看作是电子邮件服务器的自动化和电子邮件应用的开发。
www.lamsonproject.org
Troy
如果我要实现这个功能,我会使用一个调度器和一个需要被调度的任务。
这个任务会连接到邮件服务器(无论是POP3还是IMAP),然后查看那些未读的邮件(或者说是这个任务未读的邮件)。根据这些信息,我会把记录插入到数据库里。
这样你会得到两种类型的记录。一种是已经处理过的邮件的ID列表(这样就不会重复处理邮件),另一种是任务列表。
不过缺点是,你需要等一段时间才能看到任务,因为这个任务每隔X分钟或X秒才会执行一次。
如果这个方法不够好,我会选择一个永久的IMAP连接,但这样你就需要处理更多的错误情况;你不能每隔X分钟就自动重试一次。
在网上搜索“Django + scheduler”可以帮助你入门。
另外,可以看看这个StackOverflow的讨论,没必要重新发明轮子 :)