用于接收入站电子邮件的django应用程序。

django-inbound-email的Python项目详细描述


Django入站电子邮件

此软件包现在支持python3和django1.11或更高版本。有关以前版本的支持,请参阅python2分支。

Django的入站电子邮件处理程序。

当前状态

我们有一个工作实现,有sendgrid、mailgun和mandrill后端。 (SendGrid和Mandrill都已用于生产环境。)

test_应用程序被部署到heroku和发送到 任何 @ django inbound email 都将由实时版本的 测试应用程序。

这个测试应用程序只是做了一个反弹-任何到那个地址的邮件 发送回发件人的地址。这使得测试"真实世界"变得很容易 电子邮件示例。请随时发送电子邮件到该地址-如果您是 在中国的windows xp上使用outlook 97 你。你在github上听不太多。

注意,部署在Heroku上的应用程序当前使用 Mailtrap应用程序,所以你不会真正收到电子邮件,但我可以给有限的 访问贡献者以便他们可以看到所有贡献者。我会截断邮件陷阱 不定期收件箱。

什么?

一个django应用程序,可以通过 托管事务性电子邮件服务(例如SendGrid、邮戳、Mandrill, 等)

包含在这个项目中的是django应用程序本身,以及 一个正在工作的django项目,使用该应用程序,并且可以单独部署 为了测试的目的。这个应用程序有很好的测试覆盖率,但是 在没有真实数据的情况下很难测试入站电子邮件,而且 这需要一个公共端点,您可以使用该端点连接 首选电子邮件提供商的网络挂钩。

为什么?

如果您的项目接受入站电子邮件,您可能正在使用 大型交易性电子邮件提供商。

这些服务都提供了接收入站电子邮件的机制 其中包括他们(服务)解析入站电子邮件,然后 将内容发布到项目中的http端点。这是一个 很好的服务,但它通常很难集成到你的应用程序中 它加强了服务锁定,因为每个服务的回调稍微 不同。

还有一个重要的SMTP-HTTP"阻抗不匹配"。你发送 通过django(smtp)邮件库发送电子邮件,它提供 emailMessage和emailMultiAlternative对象,但您接收电子邮件 作为一个http帖子。如果你能同时发送和接收 Django物体?

此应用程序将传入的httprequest转换回 emailmultialternations对象,并激发一个信号,该信号发送 新对象和原始请求对象。你只需要听 对于此信号,并根据应用程序的需要处理电子邮件。

邮件解析器处理非utf-8字符集(因此那些讨厌的pc outlook的电子邮件不会被完全混淆)和文件附件。

H3>如何?

虽然这是django应用程序,但它(目前)不包含任何模型。它的 普林西比e组件是一个执行解析的单视图函数。 只有一个配置设置- 入站电子邮件分析器 , 必须是支持的后端之一。

此设置预计可从 django.conf.settings 中为应用程序提供, 如果应用程序不存在,则会引发错误。

入站电子邮件的默认URL仅为"/inbound/"。

应用程序的流程非常简单:

  1. 当新的电子邮件时,将调用app view函数 我们将从您的服务提供商处收到邮件。
  2. 此函数查找入站电子邮件分析器,加载 适当的后端,并解析 请求。 变成一个新的 django.core.mail.emailmultialternatives 对象。
  3. 接收到的电子邮件信号被触发,新的 emailmultialternations 实例与 原始的 httprequest 你需要-例如dkim/spf信息,如果你的提供商通过了 沿着)
  4. < > >

    如果电子邮件在某些方面不可接受(例如附件太大), 然后,将触发接收到的电子邮件不可接受的信号。这个信号 有一个描述问题的参数 异常

安装

作为django项目中的应用程序,使用 pip

$ pip install django-inbound-email

对于项目的黑客攻击,请从git中提取:

$ git pull git@github.com:yunojuno/django-inbound-email.git
$ cd django-inbound-email
django-inbound-email$
# use virtualenvwrapper, and install Django to allow tests to run
django-inbound-email$ mkvirtualenv django-inbound-email
(django-inbound-email) django-inbound-email$ pip install django

用法

在安装和配置应用程序之后,您主要关心的是处理 收到的电子邮件信号:

# This snippet goes somewhere inside your project,# wherever you need to react to incoming emails.importloggingfrominbound_email.signalsimportemail_receiveddefon_email_received(sender,**kwargs):"""Handle inbound emails."""email=kwargs.pop('email')request=kwargs.pop('request')# your code goes here - save the email, respond to it, etc.logging.debug("New email received from %s: %s",email.from_email,email.subject)# pass dispatch_uid to prevent duplicates:# https://docs.djangoproject.com/en/dev/topics/signals/email_received.connect(on_email_received,dispatch_uid="something_unique")

将文件附件作为文件字段属性处理

在处理文件附件时有一个问题。电子邮件 通过信号发送的对象具有 attachments 属性, 但它包含一个3元组列表[(名称、内容、内容类型),], 不是文件对象的列表。为了存储附件 作为一个文件字段的模型,您需要将元组转换回 Django可以处理的事情。

fromdjango.core.files.uploadedfileimportSimpleUploadedFilefromdjango.dbimportmodelsfrominbound_email.signalsimportemail_receiveddefget_file(attachment):"""Convert email.attachment tuple into a SimpleUploadedFile."""name,content,content_type=attachmentreturnSimpleUploadedFile(name,content,content_type)classExample(models.Model):"""Example model that contains a FileField property."""file=models.FileField()defon_email_received(sender,**kwargs):"""Handle inbound emails."""email=kwargs.pop('email')forattachmentinemail.attachments:# we must convert attachment tuple into a file# before adding as the property.example=Example(file=get_file(attachment))example.save()

测试

有一个test django项目, test_app 用于运行 测试:

(django-inbound-email) django-inbound-email$ python manage.py test

配置

  • 安装应用程序
  • 将应用程序添加到已安装的应用程序中
  • 添加入站电子邮件分析器设置
  • 更新提供商配置以指向应用程序URL
# the fully-qualified path to the provider's backend parserINBOUND_EMAIL_PARSER='inbound_email.backends.sendgrid.SendGridRequestParser'# if True (default=False) then log the contents of each inbound requestINBOUND_EMAIL_LOG_REQUESTS=True# if True (default=True) then always return HTTP status of 200 (may be required by provider)INBOUND_EMAIL_RESPONSE_200=True# add the app to Django's INSTALL_APPS settingINSTALLED_APPS=(# other apps# ...'inbound_email',)

卷轴功能

如果您想检查mandrill提供的x-mandrill-signature头 在请求中,您需要设置 入站卷轴身份验证密钥的设置 身份验证密钥。当提供密钥时,入站电子邮件将检查 提供的签名与根据请求计算的签名比较。

如果签名不匹配,系统将发送信号 收到的电子邮件不可接受,但描述问题的除外。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
SpringMVC中的java,当我遇到旋度时,SpringMVC中出现错误   java如何从设备获取默认ip地址?   plink运行autosys批处理作业并检查其在java中的状态   java Json数组对象通过控制器[Spring Boot]传递到模型   netbeans将java命令行参数传递给插件   java Android AIDL gen文件导致警告?   java JAXB阻止JAXB与共享实体序列化   由@JsonIdentityInfo序列化的对象的java反序列化   postgresql java数组插入postgres   Java圆环碰撞检测   在Java中提取JSON键名   jdk1中的java内存泄漏。7   java Spring 3@Autowired注释问题