【问题标题】:Send HTML email in Appengine [PYTHON] using HTML file使用 HTML 文件在 Appengine [PYTHON] 中发送 HTML 电子邮件
【发布时间】:2015-02-20 05:46:22
【问题描述】:

我想在用户注册网站后向他们发送 HTML 电子邮件。之前我写了这个脚本来发送

from google.appengine.api import mail

message = mail.EmailMessage(sender="Example.com Support <support@example.com>",
                            subject="Your account has been approved")

message.to = "Albert Johnson <Albert.Johnson@example.com>"

message.body = """
Dear Albert:

Your example.com account has been approved.  You can now visit
http://www.example.com/ and sign in using your Google Account to
access new features.

Please let us know if you have any questions.

The example.com Team
"""

message.html = """
<html><head></head><body>
Dear Albert:

Your example.com account has been approved.  You can now visit
http://www.example.com/ and sign in using your Google Account to
access new features.

Please let us know if you have any questions.

The example.com Team
</body></html>
"""
message.send()

但我不想将 HTML 直接放在主代码中,而是希望有一个单独的 HTML 文件用作正文。 我尝试这样做:

message.html = 'emailHTML.html'

但徒劳无功。如何使用 HTML 文件代替 HTML 代码?

【问题讨论】:

  • 您是否尝试过使用open().readlines() or .read() 命令?

标签: python html google-app-engine


【解决方案1】:

你可以设置

message.html = open('emailHTML.html').read()

获得与您现在所做的完全相同的效果;或者,您可以将 HTML 作为 附件(因此电子邮件的正文只是纯文本,但收件人可以将 HTML 作为附件下载):

message.attachments = [('emailHTML.html', open('emailHTML.html').read())]

我不太确定在这两种情况下您希望完成什么,但我能想到的几乎只有这两种可能性。如果两者都不令人满意,请编辑您的 Q 以准确解释您希望这封电子邮件对用户的外观(正文应该是纯文本还是 html,是否应该有附件...?)。

【讨论】:

  • @WasimThabraze,如果您还没有先写入文件'emailHTML.html',那么有问题的文件当然不会存在,并且尝试打开并读取它会导致错误。在您读取文件之前,它必须存在——这是给定的!-) 你如何选择创建它是一个完全不同的问题(在应用程序引擎中你不能写入文件,所以它需要是作为一部分上传的只读数据文件您的应用程序)。
  • @WasimThabraze,您需要确保该文件包含在推送到服务器的源中,并且您使用的是正确的相对路径。 “app.yaml”文件配置哪些文件包含或不包含在上传的文件列表中(默认跳过某些文件)。
【解决方案2】:

执行此操作的最佳方法可能是use a templating engine 从 HTML 文件加载并生成 HTML 作为字符串。例如,如果您使用 webapp2 jinja2 extras 包,您可以执行以下操作:

from webapp2_extras import jinja2 as webapp_extras_jinja2
# ...

def get_message_html():
  jinja2 = webapp_extras_jinja2.get_jinja2()
  return jinja2.render_template('relative/path/to/template.html')

# ...
def send_email():
   # ...
   message.html = get_message_html()
   # ...

请注意,要使其正常工作,您需要将 jinja2 添加到 app.yaml 的库部分,如下所示:

libraries:
- name: webapp2
  version: 2.5.2
- name: jinja2
  version: 2.6

...您还需要在应用配置中包含适当的“webapp2_extras.jinja2”。例如:

config = {
   'webapp2_extras.jinja2': {
     'template_path': 'path/containing/my/templates',
     'environment_args': {
       # Keep generated HTML short
       'trim_blocks': True,
       'extensions': [
         # Support auto-escaping for security
         'jinja2.ext.autoescape',
         # Handy but might not be needed for you
         'jinja2.ext.with_'
         # ... other extensions? ...
       ],
       # Auto-escape by default for security
       'autoescape': True
     },
     # .. other configuration options for jinja2 ...
   },
   # ... other configuration for the app ...
},
# ...
app = webapp2.WSGIApplication(routes, is_debug_enabled, config)

虽然您可以自己轻松地打开 HTML 文件,但使用 jinja2 等模板引擎的好处是它会鼓励您以更理智的方式编写和重用 HTML(而简单地加载 HTML 文件可能导致您最终手动应用替换)。另外,只是一个快速的安全提醒:如果您包含在电子邮件中的任何数据来自不受信任的来源(如用户或其他用户),请确保正确验证和完整性检查内容(并启用自动转义模板引擎)。

您显然可以选择 jinja2 以外的模板,但我特别选择了那个模板作为我的答案,因为它得到了 App Engine 的良好支持和详细记录。

【讨论】:

    猜你喜欢
    • 2010-10-27
    • 2014-09-14
    • 1970-01-01
    • 2012-07-03
    • 2017-06-27
    • 2012-08-27
    • 2011-03-30
    • 1970-01-01
    相关资源
    最近更新 更多