我正在研究如何制作一个可以直接与电子邮件交互的网络应用程序。就像您发送到 something@myapp.com 一样,该应用程序会将其拆开并确定它来自谁、它们是否在数据库中、主题行是什么等。
我正在使用/最熟悉 python 和烧瓶。
谁能让我朝着正确的方向开始如何让电子邮件与我的烧瓶应用程序代码交互?
您可以采取几种方法:
我最近做了一些类似的事情,一个简单的书签网络应用程序。我有通常的书签方式为它添加书签,但我也希望能够从我的 iPhone 上的 Reeder 等应用程序通过电子邮件发送指向它的链接。你可以在 GitHub 上看到我最终得到的结果:subMarks。
我将 Google Apps for your Domain 用于我的电子邮件,因此我创建了一个特殊地址供我的应用查看 - 我真的不想尝试构建/配置我自己的电子邮件服务器。
上面的mail_daemon.py
文件作为 cron 作业每 5 分钟运行一次。它使用 Python 包连接到电子邮件服务器poplib
,处理那里的电子邮件,然后断开连接(我不得不指出的一部分是,我在处理电子邮件之前检查电子邮件是否来自我 :))
然后,我的 Flask 应用程序为书签提供前端,从数据库中显示它们。
我决定不将电子邮件处理代码放入实际的烧瓶应用程序中,因为它可能相当慢并且只会在访问页面时运行,但如果你愿意,你可以这样做。
这是一些让事情顺利进行的准系统代码:
import poplib
from email import parser
from email.header import decode_header
import os
import sys
pop_conn = poplib.POP3_SSL('pop.example.com')
pop_conn.user('my-app@example.com')
pop_conn.pass_('password')
#Get messages from server:
messages = [pop_conn.retr(i) for i in range(1, len(pop_conn.list()[1]) + 1)]
# Concat message pieces:
messages = ["\n".join(mssg[1]) for mssg in messages]
#Parse message into an email object:
messages = [parser.Parser().parsestr(mssg) for mssg in messages]
for message in messages:
# check message is from a safe recipient
if 'me@example.com' in message['from']:
# Get the message body text
if message['Content-Type'][:4] == 'text':
text = message.get_payload() #plain text messages only have one payload
else:
text = message.get_payload()[0].get_payload() #HTML messages have more payloads
# decode the subject (odd symbols cause it to be encoded sometimes)
subject = decode_header(message['subject'])[0]
if subject[1]:
bookmark_title = subject[0].decode(subject[1]).encode('ascii', 'ignore') # icky
else:
bookmark_title = subject[0]
# in my system, you can use google's address+tag@gmail.com feature to specifiy
# where something goes, a useful feature.
project = message['to'].split('@')[0].split('+')
### Do something here with the message ###
pop_conn.quit()