用于管理本地化电子邮件模板的django应用程序。

django-appmail的Python项目详细描述


https://travis-ci.org/yunojuno/django-appmail.svg?branch=masterhttps://badge.fury.io/py/django-appmail.svg

Django AppMail公司

用于管理事务性电子邮件模板的django应用程序

兼容性

这个项目现在需要django1.11+和python3。如果您需要python2支持,则必须参考python2分支。

背景

这个项目源于一个集成大型事务django的项目 应用曼德尔,并吸取教训它还欠一个小h/t 从2011年(https://github.com/hugorodgerbrown/AppMail)开始。

核心要求是提供一种简单的方式来添加/编辑电子邮件模板 对于Django项目,不需要开发人员 变化。在Django中使用模板电子邮件的最简单方法是依赖 内置模板结构,但这意味着模板保存在 文件,在版本控制下,这使得非开发人员很难 编辑。

这是一个not所见即所得的HTML编辑器,它没有任何聪明的功能。它 不处理电子邮件的发送-它只是提供了一个方便 存储和呈现电子邮件内容的机制。

fromappmail.modelsimportEmailTemplatedefsend_order_confirmation(order_id):order=Orders.objects.get(id=order_id)template=EmailTemplate.objects.current('order_confirmation')context={"order":order}# create_message accepts EmailMultiAlternatives constructor kwargs# and returns a standard Django email object which can be updated / sent.message=template.create_message(context,to=[order.recipient.email])message.send()

核心要求是:

    列表/预览现有模板
  1. 编辑主题行、纯文本和HTML内容
  2. 使用标准django模板语法
  3. 支持基本模板
  4. 模板版本控制
  5. 语言支持
  6. 发送测试电子邮件

模板属性

单个模板作为模型对象存储在数据库中这个 标准Django管理站点用于查看/筛选模板模板 按名称、语言和版本排序。这种组合是独一无二的。这个 语言和版本属性具有合理的默认值( version=settings.language\u codeversion=0)因此如果您 不需要它在不同的 语言和版本-它们作为独立对象存储

# get the default order_summary email (language = settings.LANGUAGE_CODE)template=EmailTemplate.objects.current('order_summary')# get the french versiontemplate=EmailTemplate.objects.current('order_summary',language='fr')# get a specific versiontemplate=EmailTemplate.objects.version('order_summary',1)

模板语法

模板本身使用标准的django模板语法,包括 标签、过滤器的使用。他们没有什么特别的,但是 是一个警告-模板继承。

模板继承

尽管模板内容没有存储在磁盘上,但是没有重新设计 模板呈现方法任何父模板都必须是真烦人, 但这背后有一个合理的假设-如果你正在改变你的基础 模板您可能已经涉及到设计师和开发人员,所以 必须依赖开发人员来进行更改是可以接受的

发送测试电子邮件

您可以通过管理列表视图将测试电子邮件发送到电子邮件地址。

EmailTemplate admin change form

自定义管理操作“发送测试电子邮件”将重定向到中间 输入收件人电子邮件地址并发送电子邮件的页面:

screenshots/appmail-test-email-send.png

在各个模板管理页面上也有一个链接(右上角,历史链接旁边):

EmailTemplate admin change form

测试

应用程序有一个测试套件,最好通过tox运行。

许可证

麻省理工学院

贡献

一般规则适用:

  1. 转到您自己的帐户
  2. 创建分支,解决问题/添加功能
  3. 提交PR

请注意遵循编码风格-和PEP8。

释放

如果您发现自己不得不发布一个新版本,并且假设您已经拥有必要的PyPi权限,那么下面是您需要采取的步骤:

1。用bumped版本更新“setup.py”。将其推至“主控”
  • 向后兼容修补程序的修补程序版本
  • 向后C的次要版本可比特征
  • 不兼容功能的主要版本
2通过运行以下命令标记此新版本
  • git标签-v1.0.x-m v.1.0.x
  • git push–标签

现在,如果您转到github并查看标记,您应该能够在其中看到您的版本

3。制造车轮
  • python3 setup.py sdist bdist_wheel
4。使用绳线将其上传到PyPi上
  • 捆绳上传距离/*
  • 将要求您提供您的pypi用户名和密码

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

推荐PyPI第三方库


热门话题
java生成随机浮点,包括两个边界   java三层体系结构风格是如何工作的?一些简单的例子   多线程可以使用线程。在Java中,在循环中使用sleep(),以便定期执行某些操作?   读取循环上的java HibernateMysql异常   java使用带有Apache Ivy的自定义存储库,未找到解析程序   filenotfoundexception在读取时出现问题。Java中的txt文件   嵌入式tomcat 8.0.21中的java Spring websocket   java为什么我需要创建一个类的引用,然后创建一个B类的对象   java Splashscreen动画在Mac OS中更新时闪烁   JavaSpring3。名为“zoneManagerDelegate”的x Bean必须是[com.ms.adsp.delegate.sapi.zoneManagerDelegate]类型,但实际上是[$Proxy20]类型   java SQLite:没有这样的专栏;不明错误   java将JTable定位到JFrame中JPanel中的(x,y)位置   java在导入组织方面面临挑战。知道。xchart*   xml读取Java中的SVG元素并跳过某些包含文本的元素   java Spring Redis问题:Redis缓存中的GetAllCacheNames不能与RedisCacheManager一起使用   java Vertex Hazelcast:集群问题   java如何编辑osgi托管服务实现使用的属性文件?   java Android活动并行启动?   java AWS Lambda用于将excel转储到数据库中