【问题标题】:Read HTML file into email将 HTML 文件读入电子邮件
【发布时间】:2010-04-06 12:33:54
【问题描述】:

我已经编写了一个脚本来发送 html 电子邮件并且一切正常。我将电子邮件存储在一个单独的 HTML 文件中,然后在 while 循环和 fgets() 中读取该文件。但是,我希望能够将变量传递到 html 中。例如,在一个 html 文件中,我可能有类似..

<body>
    Dear Name <br/>
    Thank you for your recent purhcase
</body>

我把它读成这样的字符串

$file = fopen($filename, "r");
while(!feof($file)) {
    $html.= fgets($file, 4096);
}
fclose ($file);

我希望能够用变量替换 html 文件中的“名称”,但我不完全确定最好的方法。我总是可以制作自己的标签,然后在我将文件读入字符串后使用正则表达式将其替换为名称,但我想知道是否有更好/更简单的方法来做到这一点。

(顺便说一句,如果有人知道使用 file_get_contents 是否比多次调用 fgets 更好,我有兴趣知道)

【问题讨论】:

    标签: php html email


    【解决方案1】:

    str_replace() 也有可能匹配和替换你可能不想要的东西的缺点。 Smarty 在这方面绝对是矫枉过正,我会按照上面马特的建议做如下的事情

    function getEmailContents(array $vars) {
      extract($vars);
    
      ob_start();
      include 'email.html.php';
      return ob_get_clean();
    }
    

    email.html.php 看起来像这样

    <body>
        Dear <?php echo $name; ?> <br/>
        Thank you for your recent purhcase of <?php echo $product; ?>
    </body>
    

    你可以这样称呼它

    $emailContents = getEmailContents(array('name' => 'El Yobo', 'product' => 'Something'));
    

    这样你永远不会错误地匹配任何东西,而且它很容易与其他变量等进行扩展,而无需使用额外的 str_replace() 调用。

    如果您需要走得更远,可能值得关注 Smarty。

    【讨论】:

    • 实际上这看起来确实是一个不错的方法。特别是在客户购买许多产品的情况下,因为那时我可以循环遍历 html 中的数组,而不是循环遍历它,创建字符串,然后在 html 文件中替换它。我不完全理解 ob__start 和 ob_end_clean 的作用,它与输出缓冲区有关吗?
    • 好的,我得到了它的工作和它的代码少得多!不过,我必须先更改一些东西,'return ob_end_clean' 似乎只是返回 1,所以在包含后我添加了 '$html = ob_get_contents' 然后我做了 'ob_end_clean()' 然后我返回了 '$html' ,并且有效,这听起来合理吗?这样做有什么缺点吗?它安全/有效吗?非常感谢!
    • 是的,使用 ob_get_content() 和 ob_end_clean() 就可以了。 ob_get_clean() 的文档表明这正是它在内部所做的事情 (au.php.net/ob_get_clean)。
    • ob_end_clean 返回一个真/假而不是缓冲区本身。我猜你的意思是 ob_get_clean
    【解决方案2】:

    您可以使用 str_replace() 来定义占位符,例如

    Dear %name
    Thank you for your recent purchase of %product
    

    然后即时替换它们:

    $html = str_replace("%name", $order_name, $html);
    $product = str_replace("%product", $order_product, $html);
    

    使用file_get_contents() 或fopen() 都可以。

    【讨论】:

    • 就是这样!与我的想法类似,但在这种情况下 str_replace 比正则表达式好得多。
    【解决方案3】:

    改用 PHP 文件并 include 它。无需通过fgets 或replace 阅读任何内容。

    ob_start();
    include("yourTemplate.html.php");
    
    $html = ob_get_clean();
    
    // $html now has whatever your template output
    

    【讨论】:

    • 辛苦了!我接受了 El Yobo 的版本,因为它有更详细的示例,但谢谢!
    【解决方案4】:

    如果您有很多变量,您可能希望查看现有的模板引擎,例如 Smarty 来为您完成这项工作。或者,PHP 的 str_replace() 接受数组参数并且在这方面非常强大 - 或者如果您需要确保您替换的任何内容都不会被误认为是占位符, strtr() 提供了该功能(但更加昏昏欲睡)。

    【讨论】:

      【解决方案5】:

      如果您希望将来有更多功能,您可能需要考虑使用模板系统。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-07-08
        • 1970-01-01
        • 1970-01-01
        • 2012-11-02
        • 2017-12-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多