处理收到的Python或Django电子邮件?

时间:2013-01-02 19:36:07

标签: python django

我了解如何通过Django发送电子邮件,但我希望用户能够回复电子邮件。如果他们发送的电子邮件(我收到的)包含与某个字符串匹配的消息,我将调用一个函数。

我已经完成了一些谷歌搜索,但除了自己编写脚本之外似乎没有其他好的解决方案。如果有什么东西可以做到这一点,请纠正我;否则,我可以用什么来开始编写自己的脚本来执行此操作?

谢谢!

3 个答案:

答案 0 :(得分:4)

我们正在做与plone类似的事情,通过配置postfix在接收到特定域的电子邮件时执行HTTP请求。这也应该可以通过django轻松实现,因此您只需配置服务器并在django中编写一个接收电子邮件的视图。

你可以这样做:

1)设置DNS,使域的MX记录指向您的服务器。

2)配置后缀虚拟别名/etc/postfix/virtual

example.com anything
django@example.com django-mail-in

3)和/etc/aliases

django-mail-in: "|/usr/local/bin/mta2django.py http://127.0.0.1:8000/mail-inbound"

4)postscript调用/usr/local/bin/mta2django.py并将邮件发送到mail-inbound django视图。这个mta2django.py应该有效:

#!/usr/bin/python

import sys, urllib
import os


def post_message(url, recipient, message_txt):
    """ post an email message to the given url
    """

    if not url:
        print "Invalid url."
        print "usage: mta2django.py url <recipient>"
        sys.exit(64)

    data = {'mail': message_txt}
    if recipient and len(recipient) > 0:
        data ['recipient'] = recipient

    try:
        result = urllib.urlopen(url, urllib.urlencode(data)).read()
    except (IOError,EOFError),e:
        print "error: could not connect to server",e
        sys.exit(73)

    try:
        exitcode, errormsg = result.split(':')
        if exitcode != '0':
            print 'Error %s: %s' % (exitcode, errormsg)
            sys.exit(int(exitcode))
    except ValueError:
        print 'Unknown error.'
        sys.exit(69)

    sys.exit(0)


if __name__ == '__main__':
    # This gets called by the MTA when a new message arrives.
    # The mail message file gets passed in on the stdin

    # Get the raw mail
    message_txt = sys.stdin.read()

    url = ''
    if len(sys.argv)>1:
        url = sys.argv[1]

    recipient = ''
    # If mta2django is executed as external command by the MTA, the
    # environment variable ORIGINAL_RECIPIENT contains the entire
    # recipient address, before any address rewriting or aliasing
    recipient = os.environ.get('ORIGINAL_RECIPIENT')

    if len(sys.argv)>2:
        recipient = sys.argv[2]

    post_message(url, recipient, message_txt)

5)写一个django视图/mail-inbound,它接收邮件并完成你需要做的事情。在您的请求中:

  • mail - 完整的电子邮件
  • recipient - 原始收件人(当您未捕获特定电子邮件地址但整个域/子域时非常有用)

您可以使用python email模块解析电子邮件:

import email

msg = email.message_from_string(request.get('mail'))

由于我不是后缀专家,我不确定编辑/etc/postfix/virtual/etc/aliases是否足够。有关详细信息,请参阅postfix文档。

答案 1 :(得分:1)

使用Mailgun。

您需要为MailGun提供一个POST的URL,您可以解析该电子邮件。

http://documentation.mailgun.net/quickstart.html#receiving-and-parsing-email

答案 2 :(得分:0)

Django不提供任何接收支持的电子邮件。

Lamson可能是一个不错的选择,如果你需要比使用poplib检查电子邮件更先进的东西,或者比与postfix交互更pythonic的东西。