作者:少唇_200 | 来源:互联网 | 2023-06-08 15:07
我理解如何通过Django发送电子邮件,但我希望用户能够回复电子邮件.如果他们发送的电子邮件(我收到的)包含与某个字符串匹配的消息,我将调用一个函数.我做了一些谷歌搜索,但似乎除了自己制作脚本之外没有
我理解如何通过Django发送电子邮件,但我希望用户能够回复电子邮件.如果他们发送的电子邮件(我收到的)包含与某个字符串匹配的消息,我将调用一个函数.
我做了一些谷歌搜索,但似乎除了自己制作脚本之外没有其他好的解决方案.如果有什么东西可以做到这一点,请纠正我;否则,我可以用什么来开始编写我自己的脚本来执行此操作?
谢谢!
解决方法:
我们正在做与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 "
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 view / mail-inbound,它接收邮件并完成你需要它做的事情.在您的请求中:
> mail – 完整的电子邮件
>收件人 – 原始收件人(当您没有捕获特定电子邮件地址但整个域/子域时很有用)
您可以使用python电子邮件模块解析电子邮件:
import email
msg = email.message_from_string(request.get('mail'))
由于我不是后缀专家,我不确定编辑/ etc / postfix / virtual和/ etc / aliases是否足够.有关详细信息,请参阅postfix文档.