【问题标题】:Importing text and html template for e-mail correctly正确导入电子邮件的文本和 html 模板
【发布时间】:2021-05-19 05:17:28
【问题描述】:

我正在编写代码以自动化调查参与请求。我当前的代码如下所示:

def survey_mail(name, receiver, sender):
    
    text_content = f"Hello {name},\r\n
             Thank you for participating in my survey via your mail {receiver}\r\n.
             You can contact me via {sender}."
    
    html_content = """\ Hello """ + str(name) + """,<br>
             Thank you for participating in my survey via your mail """ + str(receiver) + """<br>.
             You can contact me via """ + str(sender) + """.
           """

    content = MIMEMultipart('alternative')
    content.attach(MIMEText(text_content, 'plain'))
    content.attach(MIMEText(html_content, 'html'))
    ...

我有两个问题:

  1. 首先,是否可以将上面的两个字符串简单地导入为 模板文件?
  2. 其次,有没有更好的方法来处理 细绳?目前的方法有两种不同的方式来格式化变量:{} vs. """ + var + """

我尝试将两个模板插入为 *.txt 文件,然后加载模板:

with open("text.txt") as f:
    text_content = f.read()

with open("html.txt") as f:
    html_content = f.read()

但是,这不起作用。该代码只是将模板作为完整字符串导入。

【问题讨论】:

    标签: python python-3.x string variables mime


    【解决方案1】:

    f 字符串在定义时间进行评估,因此您无法从文件中读取它们。您示例中的第二种方式(对于 html)是表达式。虽然表达式可以是eval-ed,但它通常被视为一种糟糕的安全做法,因为它允许执行不受控制的代码。

    但是您可以将format 用作穷人的模板引擎:它的功能远不如成熟的模板引擎,但在这里就足够了。

    文本部分的示例文件:

    Hello {name},
    
    Thank you for participating in my survey via your mail {receiver}.
    
    You can contact me via {sender}.
    

    你可以这样使用它:

    with open("text.txt") as f:
        text_content = f.read().format(sender=sender, receiver=receiver)
    

    【讨论】:

    • "f-strings 被评估为定义时间"。好好学习,谢谢!
    • 谢谢!将同样的方法应用于 html 也可以!
    • 只有最后一个问题:.format(name=db.name, type=db.type, color=sys.color,...) 如果这些变量对 text 和 html 都重复,是否可以只定义一次?
    • @Christopher:是的。 format 允许字符串中有多个具有特定名称的字段,并允许未使用的参数:'a {x} b {x} c'.format(x='X', y='Y') 给出没有错误的'a x b x c',忽略未使用的参数y
    猜你喜欢
    • 2022-01-24
    • 1970-01-01
    • 2011-03-18
    • 2019-06-11
    • 2023-03-26
    • 1970-01-01
    • 2017-09-07
    • 2015-03-30
    • 2012-03-31
    相关资源
    最近更新 更多