Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将电子邮件输入python/flask应用程序代码的第一步是什么?_Python_Flask_Email - Fatal编程技术网

将电子邮件输入python/flask应用程序代码的第一步是什么?

将电子邮件输入python/flask应用程序代码的第一步是什么?,python,flask,email,Python,Flask,Email,我正在研究如何制作一个可以直接与电子邮件交互的web应用程序。就像你寄给我的一样something@myapp.com应用程序会把它拆开,确定它来自谁,如果他们在数据库中,主题行是什么,等等 我正在使用/最熟悉python和flask 有人能告诉我如何让电子邮件与我的flask应用程序代码交互的正确方向吗?您可以采取以下几种方法: 编写一些代码,使用IMAP或POP来检索和处理电子邮件。可以从crontab(或类似的东西)运行它,也可以将它添加到您的flask应用程序中,并在其中触发它,或者通

我正在研究如何制作一个可以直接与电子邮件交互的web应用程序。就像你寄给我的一样something@myapp.com应用程序会把它拆开,确定它来自谁,如果他们在数据库中,主题行是什么,等等

我正在使用/最熟悉python和flask


有人能告诉我如何让电子邮件与我的flask应用程序代码交互的正确方向吗?

您可以采取以下几种方法:

  • 编写一些代码,使用IMAP或POP来检索和处理电子邮件。可以从crontab(或类似的东西)运行它,也可以将它添加到您的flask应用程序中,并在其中触发它,或者通过请求神奇URL的crontab,或者设置自定义计时器线程
  • 配置您的MTA以为发送电子邮件something@myapp.com通过将其馈送到您编写的程序(例如,在Exim中,您可以使用)。在该程序中,您可以直接处理它,也可以将其发布到flask应用程序中

最近,我用一个简单的书签web应用程序做了一些类似的事情。我有一种常用的bookmarklet方式,可以为它添加书签,但我也希望能够通过电子邮件从iPhone上的Reeder等应用程序链接到它。你可以看到我在GitHub上得到的结果:

我使用Google Apps for your Domain发送电子邮件,因此我为我的应用程序创建了一个特殊地址以供查看-我真的不想尝试构建/配置我自己的电子邮件服务器

上面的
mail_daemon.py
文件作为cron作业每5分钟运行一次。它使用
poplib
Python包连接到电子邮件服务器,处理那里的电子邮件,然后断开连接(我不得不指出的一点是,在处理电子邮件之前,我会检查电子邮件是否来自我:)

然后,我的Flask应用程序为书签提供前端,从数据库中显示书签

我决定不将电子邮件处理代码放入实际的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()

您是否有可以将电子邮件转发到Python进程的工作程序?是否要实现电子邮件服务器?这不是一种非常有效的方式——我建议使用已经投入生产的邮件服务器,并实现一个客户端,用于轮询新邮件(或使用IMAP实时接收邮件)。我应该提到:我正在与heroku合作,它可能有一个MDA附加项。这也是最后一个选择,那就是使用第三方帮助实现这一点。我写了一篇特定于rails的博客文章(但应该可以很容易地应用于Python),内容是关于仍然相关的选项。().