4

我正在研究如何制作一个可以直接与电子邮件交互的网络应用程序。就像您发送到 something@myapp.com 一样,该应用程序会将其拆开并确定它来自谁、它们是否在数据库中、主题行是什么等。

我正在使用/最熟悉 python 和烧瓶。

谁能让我朝着正确的方向开始如何让电子邮件与我的烧瓶应用程序代码交互?

4

2 回答 2

2

您可以采取几种方法:

  • 编写一些使用 IMAP 或 POP 检索电子邮件并处理它们的代码。要么从 crontab(或类似的东西)运行它,要么将它添加到你的烧瓶应用程序并在那里触发它,要么通过请求魔法 URL 的 crontab 或设置自定义计时器线程。
  • 将您的 MTA 配置为通过将其提供给您编写的程序(例如在 Exim 中您可以使用管道传输)来为 something@myapp.com 发送电子邮件。在该程序中,您可以直接处理它,也可以将其发布到您的烧瓶应用程序中。
于 2012-11-08T14:39:18.967 回答
0

我最近做了一些类似的事情,一个简单的书签网络应用程序。我有通常的书签方式为它添加书签,但我也希望能够从我的 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()
于 2012-11-12T12:16:34.580 回答